# Fly Trading ๐Ÿชฐ๐Ÿ“ˆ > **์ง€๊ธˆ ๋ฆด์Šค ๋ฒ„์ „์€ [3D ์›น ํŽ˜์ด์ง€](#3d-์›น-ํŽ˜์ด์ง€-ํฐ์œผ๋กœ-์ฐ๋Š”-๋ฆด์Šค์šฉ)๋‹ค.** ํด๋Ÿฝ ์กฐ๋ช…์ด ๋„๋Š” ๋ฐฉ, ์ˆ ๋ณ‘๊ณผ ๋‹ด๋ฐฐ๋กœ ์–ด์งˆ๋Ÿฌ์ง„ ์ฑ…์ƒ์— ์ดˆํŒŒ๋ฆฌ๊ฐ€ ์—Ž๋“œ๋ ค ๋ป—์–ด ์žˆ๊ณ , TV์—์„œ๋Š” ์นด๋ผ๋ฉœ๋Œ„์Šค๊ฐ€ ๋‚˜์˜จ๋‹ค. ์ฃผ์‹ ์š”์†Œ๋Š” ์—†๋‹ค. > ์•„๋ž˜์˜ ์ฃผ์‹ ๋งค๋งค ๋‚ด์šฉ์€ ์ฒ˜์Œ ๋ฒ„์ „์ธ Python ์˜์ƒ ํŒŒ์ดํ”„๋ผ์ธ ์ด์•ผ๊ธฐ์ด๊ณ , ์›น ํŽ˜์ด์ง€์™€๋Š” ์—ฐ๊ฒฐ๋ผ ์žˆ์ง€ ์•Š๋‹ค. **์‹ค์ œ ์ดˆํŒŒ๋ฆฌ ๋‡Œ(FlyWire ์ปค๋„ฅํ†ฐ)๊ฐ€ ์—”๋น„๋””์•„ ์ฃผ์‹์„ ์‚ฌ๊ณ ํŒ๋‹ค.** ๋ฆด์Šค์šฉ ์žฌ๋ฏธ ํ”„๋กœ์ ํŠธ. ์ดˆํŒŒ๋ฆฌ๋Š” ์ฃผ๊ฐ€๋ฅผ **๋ง›**์œผ๋กœ ๋А๋‚€๋‹ค. - ์ตœ๊ทผ 5์ผ๊ฐ„ ์˜ค๋ฅธ ๋งŒํผ โ†’ **๋‹จ๋ง›** ๋‰ด๋Ÿฐ(GRN) 21๊ฐœ๋ฅผ ์ž๊ทน - ์ตœ๊ทผ 5์ผ๊ฐ„ ๋‚ด๋ฆฐ ๋งŒํผ โ†’ **์“ด๋ง›** ๋‰ด๋Ÿฐ 21๊ฐœ๋ฅผ ์ž๊ทน - ์‹ ํ˜ธ๊ฐ€ ์‹ค์ œ ๋‡Œ ๋ฐฐ์„ (๋‰ด๋Ÿฐ 127,400๊ฐœ, ์‹œ๋ƒ…์Šค 5,279๋งŒ๊ฐœ)์„ ํƒ€๊ณ  ํผ์ ธ์„œ - ๋จน์ด๋ฅผ ๋นจ์•„๋จน๋Š” ์šด๋™ ๋‰ด๋Ÿฐ **MN9**๊ฐ€ ๊ฐ•ํ•˜๊ฒŒ ๋ฐœํ™”ํ•˜๋ฉด โ†’ **๋งค์ˆ˜** (๋ƒ ๋ƒ ) - ๋ฐœํ™”ํ•˜์ง€ ์•Š์œผ๋ฉด โ†’ **๋งค๋„** (ํ‰ค!) "๋‹จ๋ง›์€ MN9๋ฅผ ์ผœ๊ณ , ์“ด๋ง›์€ ๊ทธ๊ฑธ ์–ต์ œํ•œ๋‹ค"๋Š” ๊ฑด [Shiu et al. 2024, *Nature*](https://www.nature.com/articles/s41586-024-07763-9)์˜ ์ „๋‡Œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๊ฒฐ๊ณผ๋‹ค. ์ด ์ €์žฅ์†Œ๋Š” ๊ทธ ๋ชจ๋ธ์„ numpy๋กœ ๋‹ค์‹œ ๊ตฌํ˜„ํ–ˆ๊ณ , ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์žฌํ˜„ํ•œ๋‹ค (๋‹จ๋ง› 150Hz โ†’ MN9 ์•ฝ 110Hz, ์“ด๋ง›์„ ์„ž์œผ๋ฉด ์•ฝ 4Hz). > ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋กœ ํ•˜๋Š” ๋ชจ์˜ํˆฌ์ž๋‹ค. ์‹ค์ œ ์ฃผ๋ฌธ์€ ์—†๊ณ , ํˆฌ์ž ์กฐ์–ธ๋„ ์•„๋‹ˆ๋‹ค. ## ์‹คํ–‰ ```bash python3.12 -m venv .venv && .venv/bin/pip install -r requirements.txt scripts/download_data.sh # ์ปค๋„ฅํ†ฐ + ๋‰ด๋Ÿฐ ์ขŒํ‘œ (~120MB) .venv/bin/python -m flytrade.trader # 60๊ฑฐ๋ž˜์ผ ๋งค๋งค โ†’ output/timeline.json (~1.5๋ถ„) .venv/bin/python -m flytrade.video # โ†’ output/reel.mp4 (1080ร—1920, ~36์ดˆ) ``` - `python -m flytrade.video --preview`๋Š” ์Šคํ‹ธ ์ปท ๋ช‡ ์žฅ๋งŒ ๋น ๋ฅด๊ฒŒ ๋ฝ‘๋Š”๋‹ค (`output/preview/reel_sheet.png`). - AI๋กœ ๋งŒ๋“  ์ดˆํŒŒ๋ฆฌ ํด๋ฆฝ์„ `assets/clips/{idle,buy,sell,ending}.mp4`์— ๋„ฃ์œผ๋ฉด ๋ฐฐ๊ฒฝ์œผ๋กœ ์“ฐ์ธ๋‹ค. ํฌ๊ธฐ๋Š” ์ƒ๊ด€์—†๊ณ  9:16์œผ๋กœ ์ž๋™ ํฌ๋กญ๋œ๋‹ค. ์—†๋Š” ํด๋ฆฝ์€ ์ž๋ฆฌํ‘œ์‹œ ํ™”๋ฉด์œผ๋กœ ๋Œ€์ฒด๋œ๋‹ค. - ํ…Œ์ŠคํŠธ: `.venv/bin/python -m pytest` (์‹ค์ œ ์ปค๋„ฅํ†ฐ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๊นŒ์ง€ ๋Œ๋ฆฌ๋ ค๋ฉด `-m slow`) ## 3D ์›น ํŽ˜์ด์ง€ (ํฐ์œผ๋กœ ์ฐ๋Š” ๋ฆด์Šค์šฉ) `web/`๋Š” Three.js๋กœ ๋งŒ๋“  3D ๋ฐฉ์ด๋‹ค. ์ฝ”๋“œ๋กœ ๋งŒ๋“  ์ฃผํ™ฉ์ƒ‰ ์ดˆํŒŒ๋ฆฌ๊ฐ€ ํด๋Ÿฝ ์กฐ๋ช…์ด ๋„๋Š” ๋ฐฉ์—์„œ ์ฑ…์ƒ์— ์—Ž๋“œ๋ ค ๋ป—์–ด ์žˆ๋‹ค. ํฐ TV์—์„œ๋Š” ์นด๋ผ๋ฉœ๋Œ„์Šค(Caramelldansen)๊ฐ€ ํ˜๋Ÿฌ๋‚˜์˜จ๋‹ค. ์ฃผ์‹ ์š”์†Œ๋Š” ์—†๋‹ค. ```bash .venv/bin/python scripts/serve.py # ์บ์‹œ ์—†์ด web/ ์„œ๋น™ (์ˆ˜์ •ํ•˜๋ฉด ์ƒˆ๋กœ๊ณ ์นจ๋งŒ ํ•˜๋ฉด ๋จ) # โ†’ http://localhost:8765 (์ „์ฒด ํ™”๋ฉด์œผ๋กœ ๋„์šฐ๊ณ  ํฐ์œผ๋กœ ์ดฌ์˜) ``` - **๊ตฌ๋„:** ์ดˆํŒŒ๋ฆฌ ๋“ฑ ๋’ค ์–ด๊นจ ๋„ˆ๋จธ์—์„œ TV๋ฅผ ๋ฐ”๋ผ๋ณธ๋‹ค. ์„ธ๋กœ๋กœ ๊ธด ์ฐฝ์—์„œ๋„ ๊ฐ€๋กœ ํ™”๊ฐ์ด ์œ ์ง€๋œ๋‹ค. - **์ดˆํŒŒ๋ฆฌ:** ์˜์ž์— ์•‰์€ ์ฑ„ ์ฑ…์ƒ์— ์–ผ๊ตด์„ ๋ฌป๊ณ  ์—Ž๋“œ๋ ค ์žˆ๋‹ค. ๋ฐฐ๋Š” ์˜์ž์— ๋Š˜์–ด์ ธ ์žˆ๊ณ , ์•ž๋‹ค๋ฆฌ๋Š” ๋จธ๋ฆฌ ๋ฐ‘์— ์ ‘ํ˜€ ์žˆ์œผ๋ฉฐ, ๊ฐ€์šด๋Žƒ๋‹ค๋ฆฌ๋Š” ์ถ• ๋Š˜์–ด์ ธ ์žˆ๋‹ค. 4์ดˆ์— ํ•œ ๋ฒˆ ๋А๋ฆฌ๊ฒŒ ์ˆจ ์‰ฌ๋Š” ๊ฒƒ ๋ง๊ณ ๋Š” ์›€์ง์ด์ง€ ์•Š๋Š”๋‹ค. - **TV:** ์‹ค์ œ ์œ ํŠœ๋ธŒ ์˜์ƒ(`6-8E4Nirh9s`)์„ ์ž„๋ฒ ๋“œํ•œ๋‹ค. CSS3DRenderer๋กœ ํ”Œ๋ ˆ์ด์–ด๋ฅผ TV ํ™”๋ฉด ์œ„์น˜์— ๋งž์ถ”๊ณ , WebGL ์บ”๋ฒ„์Šค์˜ ๊ทธ ์ž๋ฆฌ๋ฅผ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋šซ์–ด์„œ ์•ž์— ๋†“์ธ ์บ”์ด ํ™”๋ฉด์„ ์ œ๋Œ€๋กœ ๊ฐ€๋ฆฐ๋‹ค. ์Œ์†Œ๊ฑฐ๋กœ ์ž๋™์žฌ์ƒ๋˜๋ฉฐ, ํ™”๋ฉด์„ ํ•œ ๋ฒˆ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ์•„๋ฌด ํ‚ค๋‚˜ ๋ˆ„๋ฅด๋ฉด ์†Œ๋ฆฌ๊ฐ€ ์ผœ์ง„๋‹ค. ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•˜๋‹ค. - **์ฑ…์ƒ:** TV ์•ž์— ์ค„ ์„ธ์šด ์—๋„ˆ์ง€ ๋“œ๋งํฌ ์บ”, ์œ„์Šคํ‚คยท๋ณด๋“œ์นด ๋ณ‘(์“ฐ๋Ÿฌ์ ธ์„œ ์ƒˆ๋Š” ๋ณ‘ ํฌํ•จ), ๊ฝ์ดˆ ๊ฐ€๋“ํ•œ ์žฌ๋–จ์ด์™€ ํƒ€๊ณ  ์žˆ๋Š” ๋‹ด๋ฐฐ(์—ฐ๊ธฐ๊ฐ€ ์˜ฌ๋ผ๊ฐ), ๋‹ด๋ฑƒ๊ฐ‘. ์‹ค์ œ ๋ธŒ๋žœ๋“œ ๋กœ๊ณ ๋Š” ์“ฐ์ง€ ์•Š์•˜๋‹ค. - **์กฐ๋ช…:** ์ฒœ์žฅ ๋ฌด๋น™ ์ŠคํฌํŠธ๋ผ์ดํŠธ 4๊ฐœ(๋น›์ค„๊ธฐ ํฌํ•จ), ์ฑ…์ƒ ์•„๋ž˜ยท์˜์ž ๋ฐ‘ LED, ๋ฐ”๋‹ฅ ๊ทธ๋ฆฌ๋“œ, PC ๋ณธ์ฒด ํŒฌ RGB๊ฐ€ ๊ณก ํ…œํฌ(์•ฝ 165 BPM)์— ๋งž์ถฐ ์ƒ‰์ด ๊ณ„์† ๋ฐ”๋€๋‹ค. TV ๋ถˆ๋น›๋„ ๋ฐ•์ž๋งˆ๋‹ค ์ƒ‰์ด ๋ฐ”๋€Œ๋ฉฐ ์ดˆํŒŒ๋ฆฌ๋ฅผ ๋น„์ถ˜๋‹ค. - **์กฐ์ž‘:** ์ŠคํŽ˜์ด์Šค๋Š” ์ผ์‹œ์ •์ง€, `r`์€ ์นด๋ฉ”๋ผ ์›์œ„์น˜, ๋งˆ์šฐ์Šค ๋“œ๋ž˜๊ทธ๋Š” ์นด๋ฉ”๋ผ ํšŒ์ „. ## ์˜์ƒ ๊ตฌ์„ฑ | ๊ตฌ๊ฐ„ | ๋‚ด์šฉ | |---|---| | 0โ€“4์ดˆ | ์‹ค์ œ ๋‰ด๋Ÿฐ ์ขŒํ‘œ๋กœ ๊ทธ๋ฆฐ 3D ๋‡Œ โ†’ ๋‹จ๋ง› ๋‰ด๋Ÿฐ์—์„œ MN9๊นŒ์ง€ ์‹ค์ œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ์ŠคํŒŒ์ดํฌ๊ฐ€ ํผ์ง€๋Š” ์ˆœ์„œ๋Œ€๋กœ ์ ๋“ฑ | | ๋ณธํŽธ | AI ์ดˆํŒŒ๋ฆฌ ํด๋ฆฝ ์œ„์— ์ฐจํŠธ, ์ˆ˜์ต๋ฅ , ๋‡Œ HUD(๋‹จ๋ง›/์“ด๋ง›/MN9)๋ฅผ ํ•ฉ์„ฑ. ๋งค๋งคํ•  ๋•Œ๋งˆ๋‹ค BUY!/SELL! ํด๋ฆฝ์œผ๋กœ ์ „ํ™˜ | | ์—”๋”ฉ | ์ดˆํŒŒ๋ฆฌ ์ˆ˜์ต๋ฅ  vs ์กด๋ฒ„ ์ˆ˜์ต๋ฅ  | ## ์ฝ”๋“œ | ํŒŒ์ผ | ์—ญํ•  | |---|---| | `flytrade/brain.py` | ์ „๋‡Œ LIF ๋ชจ๋ธ (๋…ผ๋ฌธ๊ณผ ๊ฐ™์€ ์‹ยท์ƒ์ˆ˜, ์ŠคํŒŒ์ดํฌ๊ฐ€ ๋‚œ ๋‰ด๋Ÿฐ๋งŒ sparse ์ „ํŒŒ โ†’ 1์ดˆ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์— ์•ฝ 3์ดˆ) | | `flytrade/trader.py` | ์ฃผ๊ฐ€ โ†’ ๋ง› ์ž๊ทน โ†’ MN9 โ†’ ๋งค์ˆ˜/๋งค๋„ ๋ฐฑํ…Œ์ŠคํŠธ | | `flytrade/render/intro.py` | 3D ๋‡Œ ์ธํŠธ๋กœ | | `flytrade/render/overlay.py` | ํŠธ๋ ˆ์ด๋”ฉ UI ์˜ค๋ฒ„๋ ˆ์ด | | `flytrade/video.py` | ํด๋ฆฝ + ์˜ค๋ฒ„๋ ˆ์ด ํ•ฉ์„ฑ, ffmpeg ์ธ์ฝ”๋”ฉ | ## ๋ฐ์ดํ„ฐ ์ถœ์ฒ˜ - FlyWire ์ปค๋„ฅํ†ฐ: Dorkenwald et al. 2024, *Nature* / Schlegel et al. 2024, *Nature* โ€” [flywire.ai](https://flywire.ai), ๋‰ด๋Ÿฐ ์ขŒํ‘œ๋Š” [flyconnectome/flywire_annotations](https://github.com/flyconnectome/flywire_annotations) - ๋‡Œ ๋ชจ๋ธ, ์—ฐ๊ฒฐ ๋ฐ์ดํ„ฐ(v630), ๋‰ด๋Ÿฐ ID: [philshiu/Drosophila_brain_model](https://github.com/philshiu/Drosophila_brain_model) (MIT) - ์ฃผ๊ฐ€: Yahoo Finance (yfinance) ๋ฐ์ดํ„ฐ ์ด์šฉ ์กฐ๊ฑด์€ ๊ฐ ์ถœ์ฒ˜๋ฅผ ๋”ฐ๋ฅธ๋‹ค.