| name | daily-briefing |
| description | Morning market briefing with stock picks for US and Korean markets. Generates a daily report covering macro environment, sector rotation, 10-12 actionable predictions (5-6 per market) with BUY/WATCH/HOLD/AVOID/SELL labels and Korean reasoning, plus an auto-Toss-synced portfolio review section recommending hold/add/trim/exit per current position. Each pick is logged as a formal prediction for track record tracking. Triggers on keywords like daily briefing, morning report, market overview, today's picks, what should I trade, ์ค๋ ์์ฅ, ์ผ์ผ ๋ธ๋ฆฌํ. |
Daily Briefing
๋งคํฌ๋ก + ์ข
๋ชฉ ์ถ์ฒ + ํฌํธํด๋ฆฌ์ค ์ ๊ฒ์ ํตํฉํ ์ผ์ผ ์์ฅ ๋ธ๋ฆฌํ.
When to Use
- ์ฅ ์์ ์ ์์นจ ๋ฃจํด (์๋ cron ๋๋ ์๋ ํธ์ถ)
- ์ค๋ ์์ฅ ์ ์ฒด๋ฅผ ๋น ๋ฅด๊ฒ ํ์
ํ๊ณ ๋งค์/๋งค๋ ๊ฒฐ์ ์ ํ์ฉ
- ํธ๋ ๋ ์ฝ๋ ๋์ โ ๋ชจ๋ ์ถ์ฒ์ด ์๋์ผ๋ก DB์ ๊ธฐ๋ก๋จ
Prerequisites
bin/stock-cli ์คํ ๊ฐ๋ฅ (uv-managed env)
- KR ๋ฐ์ดํฐ๋ ํค ๋ถํ์ (PyKRX)
- ์ ํ:
FMP_API_KEY (US ๋ฐ์ดํฐ ๊ฐํ), FINNHUB_API_KEY + ALPHA_VANTAGE_API_KEY (US ๋ด์ค/sentiment)
Workflow
๋ชจ๋ ๋ฐ์ดํฐ ์ ๊ทผ๊ณผ ์์ธก ๋ฑ๋ก์ bin/stock-cli๋ฅผ ํตํด ์ํ. ๋ชจ๋ ๋ช
๋ น์ JSON ๋ฐํ โ ํ์ฑ ํ ๋ค์ ๋จ๊ณ ํธ์ถ.
1. ์์ฅ ๋ฐ์ดํฐ ์์ง
US ์ธ๋ฑ์ค + ์นํฐ:
Cron ๋ธ๋ฆฌํ์ scheduler/candidate_discovery.py ์ discover_us_candidates()
๋ก ํ๋ณด๋ฅผ ๋์ ๊ฒฐ์ ํ๋ค (static S&P 500 + ETF + ADR universe in
data/us_universe.csv โ 5์ผ |return|โฅ15% OR vol_ratioโฅ2x ํํฐ โ 3 ETF ์ต์ปค
SPY/QQQ/DIA ๋ณํฉ). ๊ฒฐ๊ณผ ticker ๋ฆฌ์คํธ๊ฐ prompt์ ์ง์ ์ฃผ์
๋๋ฏ๋ก LLM์ ๊ทธ
๋ชฉ๋ก ์์์๋ง ์กฐํํ๋ค. ์ธํฐ๋ํฐ๋ธ ์ฌ์ฉ ์์๋ ๋์ผํ๊ฒ ํธ์ถํ๊ฑฐ๋, ์๋
anchor + ์ฃผ์ sector ETF ๋ง ๋น ๋ฅด๊ฒ ๋ณธ ๋ค ํ์ ์ข
๋ชฉ์ ์ถ๊ฐ ์กฐํํ๋ค:
bin/stock-cli price SPY --market US --days 10
bin/stock-cli price QQQ --market US --days 10
bin/stock-cli price DIA --market US --days 10
bin/stock-cli price IWM --market US --days 10
bin/stock-cli price XLK --market US --days 10
bin/stock-cli price XLF --market US --days 10
bin/stock-cli price XLE --market US --days 10
KR ์ธ๋ฑ์ค + ์ฃผ์ ์ข
๋ชฉ:
Cron ๋ธ๋ฆฌํ(scheduler/daily_briefing.py)์ scheduler/candidate_discovery.py ์
discover_kr_candidates() ๋ก ํ๋ณด๋ฅผ ๋์ ๊ฒฐ์ ํ๋ค (์์ด top-200 โช ๊ฑฐ๋๋๊ธ
top-50 โ 5์ผ |return|โฅ15% OR ๊ฑฐ๋๋๋นโฅ2x โ 3 ์ต์ปค 005930/000660/069500 ๋ณํฉ).
๊ฒฐ๊ณผ ticker ๋ฆฌ์คํธ๊ฐ prompt์ ์ง์ ์ฃผ์
๋๋ฏ๋ก LLM์ ๊ทธ ๋ชฉ๋ก ์์์๋ง ์กฐํํ๋ค.
์ธํฐ๋ํฐ๋ธ ์ฌ์ฉ ์์๋ ๋์ผํ๊ฒ ํธ์ถํ๊ฑฐ๋, ์๋ anchor 3์ข
๋ชฉ๋ง ๋น ๋ฅด๊ฒ ๋ณธ ๋ค
ํ์ ์ข
๋ชฉ์ ์ถ๊ฐ ์กฐํํ๋ค:
bin/stock-cli price 005930 --market KR --days 10
bin/stock-cli price 000660 --market KR --days 10
bin/stock-cli price 069500 --market KR --days 10
Multi-horizon ๊ธฐ์ ์งํ (์ ์ ์ฐ์ ์ ์ฌ์ฉ):
bin/stock-cli horizon-metrics-batch SPY,QQQ,NVDA,AMD,MSFT,GOOGL,AAPL,META,AMZN,TSLA,AVGO,MU --market US --days 400
bin/stock-cli horizon-metrics-batch 005930,000660,035420,051910,006400,005380,373220,247540,034020,329180,012450,006800 --market KR --days 400
๋ด์ค + sentiment (๊ฐ finalist ์ข
๋ชฉ๋ณ):
bin/stock-cli news NVDA --market US --limit 5 --since-days 7
bin/stock-cli news 005930 --market KR --limit 5 --since-days 7
bin/stock-cli disclosure 005930 --since-days 14
๊ธฐ์กด ์ํ ์ ๊ฒ:
bin/stock-cli predict list --status OPEN --limit 30
bin/stock-cli track-record --days 30
bin/stock-cli calibration
bin/stock-cli regime --market US
bin/stock-cli regime --market KR
2. ํฌํธํด๋ฆฌ์ค ์ํ ์์ง (ํ์ ๋จ๊ณ)
์ด ๋จ๊ณ๋ ํญ์ ์คํํ๋ค. positions๊ฐ ๋น์ด์๋์ง ์ฌ๋ถ๋ ์ถ๋ ฅ์ผ๋ก ์ง์ ํ์ธํ ๋ค์๋ง ํ๋จํ๋ค (๊ฐ์ ํ์ง ๋ง ๊ฒ).
2-1. Toss ๋๊ธฐํ (idempotent, ์คํจํด๋ briefing ๊ณ์):
bin/stock-cli portfolio sync 2>&1 | tail -5
์ ๋ช
๋ น์ด ์คํจํด๋ (์: ์๊ฒฉ์ฆ๋ช
/๋คํธ์ํฌ ์คํจ, tossctl ํด๋ฐฑ ๋ฏธ์ธ์ฆ) ๊ธฐ์กด DB๋ ๊ทธ๋๋ก ์ฌ์ฉ. briefing์ ์ ๋ ์ค๋จํ์ง ์๋๋ค.
2-2. ํฌ์ง์
+ ํ๊ฐ ๋ฐ์ดํฐ ์์ง:
bin/stock-cli portfolio positions --market US
bin/stock-cli portfolio positions --market KR
ํ๋จ ๊ท์น (์๊ฒฉํ ์ค์):
- ๋ฐํ JSON์
positions ๋ฐฐ์ด์ ์ง์ ํ์ฑํ๋ค
len(positions) > 0 ์ด๋ฉด ๋ฐ๋์ 7-4์ "๋ด ํฌํธํด๋ฆฌ์ค ์ ๊ฒ" ์น์
์ ์์ฑํ๋ค โ ๋ณด์ ๊ฐ ์๋๋ฐ ๋๋ฝํ๋ฉด ์ ๋จ
len(positions) == 0 ์ผ ๋๋ง ์๋ด ํ ์ค๋ก ๋์ฒด
- "๋ณด์ ์ข
๋ชฉ ์์"์ ์ถ๋ ฅํ๊ธฐ ์ ์ ๋ฐ๋์ ์ ๋ช
๋ น ์ถ๋ ฅ์ ํ์ธํ๋ผ
2-3. (positions ๋น์ด์์ง ์์ ๋๋ง) ํ๊ฐ ๋ฐ์ดํฐ:
bin/stock-cli portfolio report --market US
bin/stock-cli portfolio report --market KR
bin/stock-cli portfolio risk --market KR
bin/stock-cli portfolio risk --market US
3. ์์ฅ ํ๊ฒฝ ๋ถ์
๋ค์ ์ฐจ์์ ํ๊ฐ:
๋งคํฌ๋ก ๋ ์ง:
- US: risk-on / risk-off (SPY ์ถ์ธ, ์นํฐ ๋กํ
์ด์
ํจํด)
- KR: KOSPI breadth, ์ธ๊ตญ์ธ ๋งค๋งค ๋ฐฉํฅ, ์/๋ฌ๋ฌ ํ์จ ์ํฅ
- ์ธ๋ฑ์ค vs IWM(์ํ์ฃผ) ์๋ ๊ฐ๋ โ ์์ฅ์ด ํญ ๋์์ง
์นํฐ ๋กํ
์ด์
:
- 1W/1M ๊ธฐ์ค leading/lagging ์นํฐ
- US ๋ฐ๋์ฒด โ KR ๋ฐ๋์ฒด (cross-market ์๊ด์ฑ)
- ๋ฐฉ์ด์ฃผ vs ๊ฒฝ๊ธฐ๋ฏผ๊ฐ์ฃผ ์์น
๋ชจ๋ฉํ
+ breadth:
- ์ธ๋ฑ์ค ์ ๊ณ ๊ฐ + ๊ด๋ฒ์ ์ฐธ์ฌ ์ฌ๋ถ
- KOSDAQ vs KOSPI ์๋ ๊ฐ๋
4. ์ข
๋ชฉ ์ ์ํ + ๋ผ๋ฒจ ๊ฒฐ์ (BUY/WATCH/HOLD/AVOID/SELL)
/expect ์คํฌ๊ณผ ๋์ผํ ๊ฒฐ์ ๋ก ์ ํฌ์ธํธ ํ
์ด๋ธ ์ฌ์ฉ (sync ์ ์ง ํ์):
RULE R1 โ ํ๋ ๋ ์ง ๊ฒ์ดํธ (BULL ๋ผ๋ฒจ/horizon ๋ก๊น
์ ์ ์ฉ). Section 1์ regime
์ถ๋ ฅ(label)์ ํด๋น ์ข
๋ชฉ์ ์์ฅ์ ์ ์ฉ:
- RISK_OFF: ์ ๊ท BUY/BULL ๋ก๊น
๊ธ์ง. ๋ผ๋ฒจ์ WATCH๋ก ์บก, BULL horizon์ NEUTRAL๋ก ํด์.
"โ ๏ธ REGIME RISK_OFF" ํ๊ธฐ.
- NEUTRAL: BUY ๊ธฐ์ค์ 8.0 โ 9.0 ์ํฅ + ๋ก๊น
confidence ํ ๋จ๊ณ ์ถ๊ฐ ํธ๋ฆผ(0.60 ์บก).
- RISK_ON: ๋ณ๊ฒฝ ์์.
๊ทผ๊ฑฐ: 2026๋
6์ ์กฐ์ ์ฅ ๋ฐฑํ์์, worse-of-SPY/QQQ(US)ยทKODEX 200(KR) ๋ ์ง์ด NEUTRAL/RISK_OFF์ธ
๋์ ๋ฐํ๋ BULL์ ~3%๋ง ์ ์ค โ ๊ฒ์ดํธ๊ฐ ๋ฐ๋ก ๊ทธ ๊ตฌ๊ฐ์ ์ต์ /๊ฐํํ๋ค. ์์ฅ ๋จ์ ๊ฒ์ดํธ์ด๋ฉฐ,
๊ฐ๋ณ ์ข
๋ชฉ ๊ณผ์ด์ RULE R2๊ฐ ์ฒ๋ฆฌ.
RULE R2 โ ๊ฐ๋ณ ์ข
๋ชฉ ๊ณผ์ด ๊ฒ์ดํธ (ํฌ๋ฌผ์ /blow-off ์ง์
). horizon-metrics์
overextension_level ์ฌ์ฉ:
- EXTREME: ์ ๊ท BUY/BULL ๋ก๊น
๊ธ์ง โ WATCH ์บก, BULL horizon์ NEUTRAL ํด์. "โ ๏ธ OVEREXTENDED (EXTREME)".
- ELEVATED: BUY ๊ธฐ์ค์ +1.0 ์ํฅ(COMPOSITE โฅ 9.0) + confidence ํ ๋จ๊ณ ํธ๋ฆผ(0.60 ์บก). "โ ๏ธ OVEREXTENDED (ELEVATED)".
- NONE: ๋ณ๊ฒฝ ์์.
๊ทผ๊ฑฐ: closed BULL 377๊ฑด์์ ์ง์
์ RSI14>75๋ 26% ์ ์ค(RSI<60์ 47%), MA20 ๋๋น +15% ์ด๊ณผ๋
30% ์ ์ค(3~8% ๊ตฌ๊ฐ์ 66%). blow-off ์ง์
์ ๋ ์ง ๊ฒ์ดํธ(R1)๊ฐ ๋ชป ๋ณด๋ ๊ฐํ ์ญ์ ํธ. R1(์์ฅ)๊ณผ
R2(์ข
๋ชฉ)์ ํจ๊ป ์ ์ฉ โ ๋ ์ค ํ๋๋ผ๋ BULL์ WATCH๋ก ๋ง์ผ๋ฉด WATCH ์ ์ง.
ALGO_SCORE (max +8.0) โ horizon-metrics-batch ๊ฒฐ๊ณผ๋ก ์ฐ์ :
- Trend: MA20>MA50>MA200 โ +3.0 | MA20>MA50 only โ +1.0 | full bear โ -1.0 | else 0
- Momentum: RSI14 โ [50,70] โ +1.5 | [30,50) โ +0.5 | >70 โ +0.5 | <30 โ -0.5
- Return 1M: โฅ+5% โ +1.5 | 0~5% โ +0.5 | -10%~0 โ 0 | โค-10% โ -0.5
- Volume:
vol_ratio > 1.3 โ +1.0 | else 0
- Cycle:
pct_from_52w_high โฅ -10% โ +1.0 | max_drawdown_1y โค -25% โ -1.0 | else 0
NEWS_SCORE (max +3.0) โ news ์ถ๋ ฅ์ signal ๋ธ๋ก(์ค๋ณต ์ ๊ฑฐยท์ต์ ๊ฐ์ค) + disclosure๋ก:
- Sentiment:
signal.recency_weighted_sentiment ์ฌ์ฉ โ >+0.15 โ +2.0 | 0~+0.15 โ +1.0 | -0.15~0 โ -1.0 | <-0.15 โ -2.0 | null โ 0
- Headline volume:
signal.unique_count โฅ3 โ +1.0 | else 0
- Hard cap:
signal.has_negative_catalyst true โ cap -2.0
- Hard cap: KR ๊ณต์ ๊ฐ์/์ ์์ฆ์/๊ด๋ฆฌ์ข
๋ชฉ/๊ฑฐ๋์ ์ง/์์ฅํ์ง โ cap -2.0
signal.event_tags(earnings/guidance/ma/regulatory ๋ฑ)๋ Section 4์ LLM_CONTEXT ๋
ผ์ ์
๋ ฅ์ผ๋ก ์ ๋ฌ
LLM_CONTEXT_SCORE (range -5.0 ~ +3.0) โ ๋งคํฌ๋ก/๋ด๋ฌํฐ๋ธ ์ปจํ
์คํธ (๋ชจ๋ฉํ
ํธํฅ ๋ณด์ ):
Macro detector invocation (amortised, mandatory once per market):
์์ฅ๋ณ (US, KR) ํ ๋ฒ์ฉ ํธ์ถํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ ํ๋ณด ์ข
๋ชฉ์ ์ฌ์ฌ์ฉ:
market-top-detector โ ๋ถ๋ฐฐ์ผ / defensive rotation / leadership breakdown
ftd-detector โ rally attempt / FTD confirmed ์ํ
macro-regime-detector โ Concentration / Broadening / Contraction ๋ฑ
theme-detector โ ์นํฐ lifecycle phase
๋ธ๋ฆฌํ ์ ์ฒด ๋ฐํ์ < 10๋ถ (cron timeout ์ฌ์ ) ๋ชฉํ. ์ข
๋ชฉ๋ณ๋ก detector ์ฌํธ์ถ ๊ธ์ง (10-12๋ฐฐ latency).
Section 3 (์์ฅ ํ๊ฒฝ ๋ถ์) ๊ฒฐ๊ณผ + ์นํฐ lifecycle + narrative themes ์ข
ํฉํด์ ์ข
๋ชฉ๋ณ๋ก -5.0 ~ +3.0 ๋ถ์ฌ. ์ต์ปค:
- +3.0: ๊ฐํ ๋งคํฌ๋ก ํธ์ฌ + ์นํฐ early-stage breakout
- +1.5: ์ฝํ ํธ์ฌ (favorable regime, mid-stage)
- 0: ์ค๋ฆฝ (default โ ํน๋ณํ ๋งคํฌ๋ก/๋ด๋ฌํฐ๋ธ ์๊ทธ๋ ์์ ๋)
- -1.5: ์ฝํ ์
์ฌ (late-stage ์นํฐ, ์ค๋ฆฝ ๋งคํฌ๋ก)
- -3.0: ๋งคํฌ๋ก ํฑ + ์นํฐ late + ๋จ๊ธฐ ์ด๋ฒคํธ (์: KOSPI ๋ถ๋ฐฐ์ผ, ์ธ์ธ ๋งค๋ ๊ฐ์, FX 1500โ, ์ด๋ ์ง์ )
- -5.0: ์์คํ
์๊ธฐ (๋ฒ ์ด๋ง์ผ ์ง์
+ ํ๋ ์
ํ)
๋ฐ๋์ llm_context_reasoning ํ
์คํธ๋ ๊ฐ์ด โ ๋งคํฌ๋ก ์๊ทธ๋ 1๊ฐ ์ด์ ์ธ์ฉ ("์ธ์ธ -5์กฐ", "๋ถ๋ฐฐ์ผ 4๊ฑด", "FTD ๋ฏธํ์ธ" ๋ฑ). Section 3์์ ์ด๋ฏธ ๋ถ์ํ ๋ด์ฉ์ ์ข
๋ชฉ๋ณ๋ก ๋งคํ.
COMPOSITE = ALGO_SCORE + NEWS_SCORE + LLM_CONTEXT_SCORE (๋ฒ์ -12 ~ +14):
- โฅ 8.0 โ BUY
- [6.0, 8.0) โ WATCH
- [3.0, 6.0) โ HOLD
- [0, 3.0) โ AVOID
- < 0 โ SELL
์๊ณ๊ฐ์ ์ ์ง โ LLM_CONTEXT๊ฐ ์์๋ฉด ์์ฐ์ค๋ฝ๊ฒ BUY โ WATCH/HOLD ๋ค์ด๊ทธ๋ ์ด๋, ์์๋ฉด ์ฝํ ALGO+NEWS ์กฐํฉ๋ BUY ์ง์
๊ฐ๋ฅ.
๊ฐ ์์ฅ์์ 5-6๊ฐ ์ข
๋ชฉ ์ ์ ํด ๋ผ๋ฒจ ๋ถ์ฌ (์ด 10-12๊ฐ). ๋ผ๋ฒจ์ด BUY/WATCH๋ง ์๋ค๋ฉด ์ข์ง๋ง, AVOID/SELL๋ ์์ฐ์ค๋ฝ๊ฒ ํฌํจ ๊ฐ๋ฅ (๋ค์์ฑ + ๊ณต๋ถ ์๋ฃ).
4.5. ๋ธ๋ ๋ ํ๋ณด ํผ๋ + ์ฝํธํธ ํ๊น
(๋ชจ๋ฉํ
ํธํฅ ๋ณด์ )
Cron ๋ธ๋ฆฌํ์ ํ๋ณด๋ ๋ ์ด์ ๋ชจ๋ฉํ
๋จ์ผ ์คํธ๋ฆผ์ด ์๋๋ค.
scheduler/blended_funnel.py์ assemble_blended_candidates๊ฐ 2๊ฐ ์คํธ๋ฆผ์ ๋ณํฉํ๋ค:
- PRE-SURGE (
scheduler/pre_surge_discovery.py): base/pullback/RS/pre-earnings โ
์์ง ๊ณผ์ด ์๋ ์ข
๋ชฉ. ํ๋กฌํํธ์์ ๋จผ์ ์ ์๋๋ฉฐ ์ฐ์ ๊ฒํ ๋์.
- MOMENTUM (legacy 5์ผ ๊ธ๋ฑ/๊ฑฐ๋๋): ์ ์งํ๋ ์บก๋๊ณ , "๊ณผ์ด ์๋ ๋๋ง BUY"๋ก ํ๊ธฐ.
- ์ต์ปค (SPY/QQQ/DIA, 005930/000660/069500): ์์ฅ ์ฐธ๊ณ ์ฉ โ ์ถ์ฒ ์ฌ๋กฏ ์๋.
๊ทผ๊ฑฐ: as-of ๋ฐฑํ
์คํธ(scheduler/asof_backtest.py)์์ trailing-1m >40% ๋ชจ๋ฉํ
์ฝํธํธ๊ฐ
์ต์
(โ24-55% ์ ์ค), pre-surge๋ 1W์์ +8.9pp ์ฐ์(๋จ ์ ๋ขฐ๊ตฌ๊ฐ์ 0 ํฌํจ โ ํ์ ์๋).
๋ฐ๋ผ์ ๋ชจ๋ฉํ
๋์ฒด๊ฐ ์๋๋ผ ๊ฐ์ฐ ๋ธ๋ ๋ + ๊ณผ์ด ์บก์ผ๋ก ์ด์ฉํ๋ค.
๊ณผ์ด ์บก์ store ๋ ๋ฒจ์์ ๊ฐ์ ๋๋ค (codex-cli์์ ์ ์ผํ๊ฒ ์๋ํ๋ enforcement).
bin/stock-cli predict create --source LIVE --direction BULL์
--components์ overextension์ด EXTREME์ด๊ฑฐ๋ return_1m > 0.20์ด๋ฉด
mcp-prediction-store/models.py:insert_prediction์ด ํ๋ ๊ฑฐ๋ถํ๋ค (BEAR ๊ฑฐ๋ถ์ ๋์ผ ํจํด).
ํ๋กฌํํธ ์บก์ advisory์ผ ๋ฟ์ด๋ฏ๋ก, ๋ฐ๋์ ์๋ components๋ฅผ ์ ์งํ๊ฒ ๋๊ฒจ์ผ ํ๋ค.
์ฝํธํธ ํ๊น
(Section 5 components์ ์ถ๊ฐ ํ์): ๋ชจ๋ predict create์ --components์
overextension(NONE/ELEVATED/EXTREME) + return_1m(์์) + discovery_source(presurge/momentum)
setup_type(base_pivot/pullback/rs_leader/pre_earnings/momentum)๋ฅผ ํฌํจํ๋ค.
์ฃผ๊ฐ calibration์ด ์ด ํ๊ทธ๋ก ์คํธ๋ฆผ๋ณ ์ ์ค๋ฅ ์ ์ถ์ ํ๋ค.
ํธ๋ผ์ด์ฆ ๊ท์น (๋ฐฑํ
์คํธ ๊ทผ๊ฑฐ): PRE-SURGE ํฝ(base/pullback/rs_leader)์ 1M ์ด์์ conviction์
๋๋ค โ base/pullback ์
์
์ ์ ๊ฐ์ ์ ์ฃผ๊ฐ ๊ฑธ๋ ค, 1W ํธ๋ผ์ด์ฆ์์๋ ์ฝ 60%๊ฐ ๋ชฉํ ๋ฏธ๋ฌ๋ก ๋ง๋ฃ(dead money,
as-of ๋ฐฑํ
์คํธ)๋์ง๋ง 1M์์๋ ๋ง๋ฃ ~11%๋ก ๋ชจ๋ฉํ
๊ณผ ๋๋ฑํ๋ค. MOMENTUM ํฝ์ 1W๋ ๋ฌด๋ฐฉ.
์ฆ pre-surge๋ ๋ชจ๋ฉํ
์ "์ด๊ธด๋ค"๊ธฐ๋ณด๋ค ํผ๋์ด ๋ชป ๋ณด๋ ๋ค์์ฑ์ ๋ํ๋ ๊ฐ์ฐ ์คํธ๋ฆผ์ด๋ฉฐ, ๊ณผ์ด ์บก(store
๊ฒ์ดํธ)์ด ์ค์ฆ๋ ํต์ฌ ๊ฐ์ ์ด๋ค.
์นํฐ ๋กํ
์ด์
๋ถ์คํธ (WT-C): ๋ธ๋ฆฌํ์ discovery ์ ์ sector-rs --write๋ก
data/sector_rs_<market>.json๋ฅผ ๊ฐฑ์ ํ๊ณ , assemble_blended_candidates(sector_verdicts=...)๋ก
ํ๋ณด ์ ๋ ฌ์ ์นํฐ ๊ฐ์ค์น(FAVOR/EARLY ร1.3 โฆ AVOID/LATE ร0.6, ๊ฒฝ๊ณ๋จ)๋ฅผ ๋ฐ์ํ๋ค. ํ์ผ์ด ์์ผ๋ฉด
strict no-op. ํ๋ณด ๋ธ๋ก์ sector=FAVOR ๋ฑ์ผ๋ก ํ๊ธฐ๋๋ ์ถ์ฒ thesis์ ์ธ์ฉ ๊ฐ๋ฅ.
RULE R3 โ ์ด๋ฒคํธ ๋ฆฌ์คํฌ ๊ฒ์ดํธ (WT-D): ํ๋กฌํํธ์ ## Event Risk ๋ธ๋ก ์ฐธ์กฐ. ํ๋ณด ํฐ์ปค์ ๋ํด
evaluate_gate(์ด๋/๋งคํฌ๋ก, fail-open, ์์ฅ๋น 1ํ fetch)๋ฅผ ํธ์ถํด ์ฃผ์
ํ๋ค. ์ด๋ โค2 ๊ฑฐ๋์ผ โ WATCH ์บก
(์ ๊ท BULL ๊ธ์ง), ์ด๋/๋งคํฌ๋ก trim โ confidence ํ ๋จ๊ณ ์ธํ (R1/R2 ์์ stacking). KR์ per-ticker
์ด๋ ํผ๋๊ฐ ์์ด ๋งคํฌ๋ก ์ ์ฉ(US FOMC/CPI). US ์ด๋์ FMP ์คํจ ์ keyless yfinance fallback์ผ๋ก ์ปค๋ฒ.
gate_unavailable(๋ชจ๋ ์์ค ์คํจ)์ด๋ฉด R3๋ 0์ผ๋ก ์ฒ๋ฆฌ; ๋ถ๋ถ ์ฅ์ (์: ๋งคํฌ๋ก ์บ๋ฆฐ๋ 402)๋ ๊ฒ์ดํธ๊ฐ ์ด์์๊ณ
notes/earnings_source/macro_available๋ก ํ๋กฌํํธ ๋ธ๋ก์ ํ๊ธฐ๋๋ค.
5. ์์ธก ๋ฑ๋ก (๊ฐ ์ข
๋ชฉ๋ณ)
BUY/WATCH/HOLD ๋ผ๋ฒจ ์ข
๋ชฉ์ ๋ชจ๋ DB์ ๋ฑ๋ก (AVOID/SELL์ ์ ๋ณด ์ ๊ณต๋ง, ๋ฑ๋ก ์ ํ).
์ข
๋ชฉ๋ณ analysis_group_id ๋ถ์ฌ: ์ข
๋ชฉ๋ง๋ค UUID๋ฅผ ํ ๋ฒ ์์ฑํ๊ณ , ๊ทธ ์ข
๋ชฉ์์ ๋ฑ๋กํ๋
๋ชจ๋ ์์ธก ํ์ ๋์ผํ --analysis-group-id๋ก ์ ๋ฌํ๋ค(/expect์ ๋์ผ ํจํด). ๊ทธ๋์ผ ํ ๋ถ์์์
๋์จ ํ๋ค์ ๋ฌถ์ด ์ถ์ /์ค๋ณต ์๋ณ์ด ๊ฐ๋ฅํ๋ค. ์ข
๋ชฉ์ด ๋ฐ๋๋ฉด ์ UUID๋ฅผ ์์ฑํ๋ค.
GROUP_ID=$(uv run python -c "import uuid; print(uuid.uuid4())")
bin/stock-cli predict create \
--ticker 005930 --market KR --direction BULL \
--confidence 0.62 --timeframe 1M \
--entry-price 268500 --target-price 300000 --stop-price 248000 \
--reasoning "RSI14=74.5 healthy momentum, MA20>MA50>MA200 stack, return_1m=+36.6%, AV sentiment N/A (KR), ๋ฐ๋์ฒด ์ฌ์ดํด ํ๋ฐ cycle_risk_flag=True, LLM_CONTEXT -1.5 (late-stage sector)" \
--signals technical,momentum,llm_context \
--components '{"algo":6.0,"news":0.0,"llm_context":-1.5,"overextension":"NONE","return_1m":0.12,"regime":"NEUTRAL","discovery_source":"presurge","setup_type":"pullback","news_signal":{"unique_count":3,"mean_sentiment":null,"recency_weighted_sentiment":null,"event_tags":["earnings"],"has_positive_catalyst":false,"has_negative_catalyst":false}}' \
--source LIVE \
--recalibrate \
--analysis-group-id "$GROUP_ID"
--components๋ ํญ์ ํด๋น ์ฝ์ pillar๋ณ ๊ธฐ์ฌ๋(algo/news/llm_context ์ ์ + overextension ๋ ๋ฒจ +
regime ๋ผ๋ฒจ)๋ฅผ ๋ด์ ์ ๋ฌ โ bin/stock-cli component-contribution๋ก ์ธ ๋ฅ๋ ฅ์ ๊ธฐ์ฌ๋ฅผ ๋ฐ๋ก ์ธก์ ํ๊ณ
ํฅํ blended confidence ํ์ต์ ์ฌ์ฉ. news_signal๋ ํ์: bin/stock-cli news ์ถ๋ ฅ์ signal
๋ธ๋ก์์ unique_count, mean_sentiment, recency_weighted_sentiment, event_tags,
has_positive_catalyst, has_negative_catalyst ์ฌ์ฏ ํค๋ง ๊ฐ ๊ทธ๋๋ก ๋ณต์ฌ (raw_count ๋ฑ์ ์ ์ธ) โ
bin/stock-cli news-tag-performance๊ฐ ํ๊ทธ๋ณ ์ ์ค๋ฅ ์ ํ์ตํ๋ ์์ฒ์ด๋ค.
์์ธก ํ์ง ๊ท์น:
- Confidence 0.55-0.85, 4-signal-alignment ๊ท์น + calibration ์บก ์ ์ฉ
- ์ฌ๋ณด์ ์ ์ฉ: raw confidence๋ฅผ ๊ทธ๋๋ก ๋๊ธฐ๊ณ
--recalibrate ํ๋๊ทธ๋ฅผ ์ถ๊ฐํ๋ฉด CLI๊ฐ isotonic recalibration ๊ณก์ ์ผ๋ก ๊ฒฐ์ ๋ก ์ ์ผ๋ก ๋งคํํด ์ ์ฅํ๋ค (์: ๊ณผ์ ๊ตฌ๊ฐ 0.62 โ ~0.50). ์ง์ ์์ผ๋ก ๋งคํํ์ง ๋ง ๊ฒ โ ํ๋๊ทธ๊ฐ ์ผ๊ด๋๊ฒ ์ฒ๋ฆฌํ๋ฉฐ, ํด๋น source์ closed ์์ธก์ด 30๊ฑด ๋ฏธ๋ง์ด๋ฉด ์์ ํ๊ฒ no-op. JSON ์ถ๋ ฅ์ raw_confidence/recalibration_applied๋ก ํ์ธ.
- ์ฃฝ์ ์๊ทธ๋ ๊ธ์ง:
cycle, valuation, mean_reversion์ ์ ์ค๋ฅ 0%๋ก ํ์ ๋์ด signals_used์ ๊ธฐ๋กํ์ง ๋ง ๊ฒ (calibration ์ค์ผ). ํด๋น ์ ์ฑ ์ ํธ๋ LLM_CONTEXT_SCORE๋ก ๋ฐ์.
- ์ต์ 2๊ฐ signal ๋ช
์ (signals_used).
llm_context ์๊ทธ๋์ LLM_CONTEXT_SCORE๊ฐ 0์ด ์๋ ๋๋ง ํฌํจ (์ฃผ๋ณ calibration์ด ์ด ์๊ทธ๋ ๋จ๋
์ธก์ )
- KR ์ข
๋ชฉ ๊ธฐ๋ณธ timeframe 1M (์ ๋์ฑ ๋ฎ์ ๊ณ ๋ ค)
- US ์ข
๋ชฉ ๊ธฐ๋ณธ timeframe 1W
- ๋ฆฌ์คํฌ/์ฃ์ง ๊ฒ์ดํธ (ํ์):
reward = |target โ entry|, risk = |entry โ stop|. reward/risk < 1.5๋ฉด ์ฃ์ง๊ฐ ์์ผ๋ฏ๋ก ๋ฑ๋กํ์ง ๋ง ๊ฒ(WATCH/HOLD๋ก ์ ๋ณด๋ง ์ ๊ณต). Target โฅ 2 ร Stop ๊ฑฐ๋ฆฌ(2:1) ๊ถ์ฅ.
- BEAR ์ํฅ ๋ฐ: ์ธก์ ๋ BEAR ์ ์ค๋ฅ ~6%(BULL ~61%) โ ํ๋ฝ ์์ธก์ ์ ๋ขฐ ๋ถ๊ฐ. BEAR๋ (a) โฅ3 signal ์ ๋ ฌ, (b) ๋งคํฌ๋ก/์ฌ์ดํด ํ์ธ(
LLM_CONTEXT โค โ2.0 ๋๋ cycle_risk_flag=True), (c) reward:risk โฅ 2.0 ๋ชจ๋ ์ถฉ์กฑํ ๋๋ง ๋ฑ๋ก. ๋ฏธ์ถฉ์กฑ ์ ๋ฑ๋ก ์๋ต. --source LIVE์์๋ store๊ฐ BEAR ํ์ ํ๋ ๊ฑฐ๋ถ(์๋ฌ)ํ๋ฏ๋ก cron ์คํ ์ BEAR๋ ์ ๋ ๋ฑ๋ก ์๋ํ์ง ๋ง ๊ฒ.
- ์๋ cron์ด๋ฉด
--source LIVE, ๋ํํ์ด๋ฉด --source INTERACTIVE
6. ํฌํธํด๋ฆฌ์ค ์ก์
์ถ์ฒ (๋ณด์ ์ข
๋ชฉ ์์ ๋)
๊ฐ ๋ณด์ ํฌ์ง์
์ ๋ค์ ๊ธฐ์ค์ผ๋ก ํ๊ฐ:
| ๊ธฐ์ค | ์ถ์ฒ |
|---|
| ํ์ฌ ALGO/NEWS ์ ์ + ํ๋จ ๋๋น P&L + RSI/MA ์ํ | |
| composite โฅ 6 & P&L > 0% & ์ถ์ธ ์ ์ | ๋ณด์ ์ ์ง |
| composite โฅ 8 & ํ๋จ ๋๋น +5% ์ด์ & ์ถ๊ฐ ์ง์
์ฌ๋ ฅ | ์ถ๊ฐ ๋งค์ (๋ถํ ) |
| composite 3-6 & P&L > +20% & RSI > 75 | ๋ถ๋ถ ๋งค๋ (์ด์ต ์คํ) |
| composite < 3 & ์์ ๊ฐ ๊ทผ์ | ์์ ๊ฒํ |
| composite < 0 OR ํ๋ caps ๋ฐ๋ (๊ด๋ฆฌ์ข
๋ชฉ ๋ฑ) | ์ ๋ ๋งค๋ |
๊ฐ ์ถ์ฒ์ 1-2๋ฌธ์ฅ ํ๊ตญ์ด ์ฌ์ ํ์ (๊ตฌ์ฒด ์ซ์ ์ธ์ฉ).
7. ์ต์ข
์ถ๋ ฅ (ํ๊ตญ์ด ์ฐ์ )
# ๐ Daily Market Briefing โ [YYYY-MM-DD]
## 1. ์์ฝ (Executive Summary)
3-5 bullet points ํ๊ตญ์ด:
- ์ค๋ ์์ฅ์ ํต์ฌ ํ
๋ง
- ๋ฆฌ์คํฌ ๋ ๋ฒจ (๋ฎ์/๋ณดํต/๋์)
- ์ ๋ฐ์ bias (๊ฐ์ธ/์ค๋ฆฝ/์ฝ์ธ)
## 2. ๋งคํฌ๋ก ํ๊ฒฝ
### ๋ฏธ๊ตญ
[SPY/QQQ/DIA ์ถ์ธ + ์นํฐ ๋ฆฌ๋์ญ + ์ฃผ์ ๊ฐ๊ฒฉ๋ โ ํ๊ตญ์ด paragraph 3-5์ค]
### ํ๊ตญ
[KOSPI/KOSDAQ ์ถ์ธ + ์ธ๊ตญ์ธ ํ๋ฆ + ์/๋ฌ๋ฌ ํ์จ ์ํฅ โ ํ๊ตญ์ด paragraph 3-5์ค]
## 3. ์ค๋์ ์ข
๋ชฉ ์ถ์ฒ
### ๐บ๐ธ ๋ฏธ๊ตญ (5-6 ์ข
๋ชฉ)
#### 1. NVDA โ *BUY* (composite 9.0)
- *์ ์*: ALGO 6.0 / NEWS 3.0
- *๊ฐ๊ฒฉ๋*: ์ง์
215.20 โ ๋ชฉํ 226 (+5%) / ์์ 207 (-4%)
- *์๊ฐ*: 1์ฃผ
- *๋ถ์*: NVIDIA๋ RSI14=65.86์ผ๋ก ๊ฑด๊ฐํ ๋ชจ๋ฉํ
๊ตฌ๊ฐ์ด๋ฉฐ, MA20>MA50>MA200 ์์ ํ ์์น ์ ๋ ฌ์ ์ ์งํ๊ณ ์์ต๋๋ค. ์ง๋ 1๊ฐ์ +17% ์์นํ์ง๋ง 52์ฃผ ๊ณ ์ ๋๋น -0.6%๋ก ์์ง ์ถ๊ฐ ์ฌ๋ ฅ์ด ์๊ณ , Finnhub+AV ์ข
ํฉ sentiment +0.28๋ก ๋ด์ค ํ๋ฆ๋ ์ฐํธ์ ์
๋๋ค. AI ์ธํ๋ผ ์์ ์ง์ + ์ฌ์ดํด ๋ฆฌ์คํฌ ๋ฎ์ ํธ์ผ๋ก *๋ถํ ๋งค์ ์ถ์ฒ*.
- *๋ก๊น
*: `predict_id=<uuid>`
#### 2. AAPL โ *WATCH* (composite 7.5)
[๋์ผ ๊ตฌ์กฐ โ ์ ์ / ๊ฐ๊ฒฉ๋ / ์๊ฐ / ๋ถ์ / ๋ก๊น
]
[3-6๋ฒ ์ข
๋ชฉ ๋์ผ ํ์]
### ๐ฐ๐ท ํ๊ตญ (5-6 ์ข
๋ชฉ)
#### 1. 005930 ์ผ์ฑ์ ์ โ *WATCH* (composite 7.0)
- *์ ์*: ALGO 6.0 / NEWS 1.0
- *๊ฐ๊ฒฉ๋*: ์ง์
285,500์ / ๋ชฉํ 320,000 (+12%) / ์์ 263,000 (-8%)
- *์๊ฐ*: 1๊ฐ์
- *๋ถ์*: ์ผ์ฑ์ ์๋ MA20>MA50>MA200 ์์ ํ ์ ๋ ฌ์ RSI14=74.5๋ก ์ฝ๊ฐ ๊ณผ์ด ๊ตฌ๊ฐ์ด์ง๋ง ๊ฑฐ๋๋๊ธ 1์๋ก ์ธ๊ตญ์ธ ๋งค์๊ฐ ๋ท๋ฐ์นจ๋๊ณ ์์ต๋๋ค. ์ง๋ 1๋
+382% ์์นํด cycle_risk_flag=True๋ก ๋จ๊ธฐ ์กฐ์ ๊ฐ๋ฅ์ฑ ์์ด WATCH๋ก ๋ถ๋ฅ โ 285,000 ์ดํ ํ๋ฐฑ ์ ๋ถํ ์ง์
๊ถ์ฅ. KR ๊ณต์ cap ํธ๋ฆฌ๊ฑฐ ์์.
- *๋ก๊น
*: `predict_id=<uuid>`
[2-6๋ฒ ์ข
๋ชฉ ๋์ผ ํ์]
> **Markdown ์ฃผ์**: Telegram MarkdownV1๋ ๋จ์ผ `*` (๋ณํ 1๊ฐ)๋ง bold๋ก ์ธ์. ์ด์ค `**bold**`๋ unclosed entity ์๋ฌ ๋ฐ์ โ ์ถ๋ ฅ ์ ๋ชจ๋ ๊ฐ์กฐ๋ ๋จ์ผ `*text*`๋ง ์ฌ์ฉ.
## 4. ๋ด ํฌํธํด๋ฆฌ์ค ์ ๊ฒ
**ํ๋จ ๊ท์น**: ์ Step 2-2์ `positions` ๋ฐฐ์ด์ ์ง์ ๋ณด๊ณ , ๊ธธ์ด > 0 ์ด๋ฉด ๋ฐ๋์ ์ด ์น์
์ ์ฑ์๋ผ. "๋ณด์ ์ข
๋ชฉ ์์"์ positions๊ฐ ์ง์ง ๋น ๋ฐฐ์ด์ผ ๋๋ง ์ถ๋ ฅ.
(๋ณด์ ์ข
๋ชฉ ์ง์ง ์์ ๋) โ "๋ณด์ ์ข
๋ชฉ ์์ โ `bin/stock-cli portfolio create` ํ ๋งค์ ๊ธฐ๋ก์ ์ถ๊ฐํ์๋ฉด ๋ค์ ๋ธ๋ฆฌํ๋ถํฐ ์๋ ์ ๊ฒ๋ฉ๋๋ค." ํ ์ค.
(๋ณด์ ์ข
๋ชฉ ์์ ๋) โ
### ๐บ๐ธ US ํฌ์ง์
#### NVDA (10์ฃผ, ํ๋จ $185.00)
- ํ์ฌ๊ฐ $215.20, P&L *+16.3%* ($+302)
- *์ถ์ฒ*: ๋ณด์ ์ ์ง
- *์ฌ์ *: ์ถ์ธ ์ ์(MA stack), ๋ชจ๋ฉํ
๊ฑด๊ฐ(RSI 65), 1์ฃผ horizon ์ถ๊ฐ BUY ์์ธก ๋ฐ์. ๋ค๋ง +16% ์ต์ ์์ญ ๋ค์ด๊ฐ๋ +25% ๋๋ฌ ์ ๋ถ๋ถ ๋งค๋(30%) ๊ถ์ฅ.
#### TSLA (5์ฃผ, ํ๋จ $280.00)
- ํ์ฌ๊ฐ $240.00, P&L *-14.3%* ($-200)
- *์ถ์ฒ*: ์์ ๊ฒํ
- *์ฌ์ *: composite=2.5 (AVOID ๊ตฌ๊ฐ), MA20<MA50<MA200 ํ ๋ฒ ์ด ์ ๋ ฌ, ์์ ๊ฐ $238 ๊ทผ์ . ํ ๋ฒ ๋ -2% ๋น ์ง๋ฉด ์ ๋ ๋งค๋ ๊ถ์ฅ.
### ๐ฐ๐ท KR ํฌ์ง์
#### 005930 ์ผ์ฑ์ ์ (50์ฃผ, ํ๋จ 220,000์)
[๋์ผ ๊ตฌ์กฐ]
#### ์ข
ํฉ
- US ํฌ์ง์
ํ๊ท +N%
- KR ํฌ์ง์
ํ๊ท +N%
- ์นํฐ ์ง์ค ์ํ: [`portfolio risk` ๊ฒฐ๊ณผ ์ธ์ฉ]
- ๋ค์ ์ก์
์ฐ์ ์์: [1์์ / 2์์]
## 5. ํธ๋ ๋ ์ฝ๋ ์
๋ฐ์ดํธ
[`track-record` + `calibration` ๊ฒฐ๊ณผ๋ฅผ ํ๊ตญ์ด๋ก ์ ๋ฆฌ]
- 30์ผ ์ ์ค๋ฅ : N%
- Brier score: N
- ์๊ทธ๋๋ณ ์ฑ๊ณผ: technical N%, news N%, momentum N%
- ๊ณผ์ ๋ฒํท: [์์ผ๋ฉด ๋ช
์]
## 6. ์ค๋์ ์ฃผ์ ์ด๋ฒคํธ
[`economic-calendar-fetcher` ๋๋ web search๋ก ํ์ธํ ์ด๋ฒคํธ]
- US: [CPI ๋ฐํ / ์ด๋์ค ๋ฑ]
- KR: [์ ์ฑ
๋ฐํ / ์ด๋์ค ๋ฑ]
- ๊ธ๋ก๋ฒ: [FOMC / ์ค๊ตญ ๋ฑ]
---
*๋ชจ๋ ์์ธก ID๋ `bin/stock-cli predict detail <id>`๋ก ์์ธ ์กฐํ ๊ฐ๋ฅ*
*๋ค์ ์๋ ๋ธ๋ฆฌํ: [ํ์ผ 07:00 KR / 21:00 US]*
๋ถ์ ํค ๊ฐ์ด๋
- ํ๊ตญ์ด ์ฐ์ โ ๋งคํฌ๋ก/๋ถ์/์ถ์ฒ ์ฌ์ ๋ ๋ชจ๋ ํ๊ตญ์ด paragraph๋ก ์์ฑ
- ๊ตฌ์ฒด ์ซ์ ๋ช
์ โ "๊ฐํ ์์น"๋ณด๋ค "RSI 65, 1๊ฐ์ +17%" ์์ผ๋ก
- ๋ช
ํํ ์ก์
โ "๊ด์ฌ ๊ฐ์ง ๋งํจ"์ด ์๋๋ผ "215.20 ๋ถํ ๋งค์, 207 ์์ "
- ๋ฆฌ์คํฌ ๋๋ฑ ๋น์ค โ TECH 1์ค, NEWS 1์ค, RISK 1์ค (transmission chain ์์น)
- ๊ณผ์ ์์ โ calibration์์ ๋ฐ๊ฒฌ๋ ๊ณผ์ ๋ฒํท์ด ์๋ค๋ฉด confidence ์๋ ์บก
๋ถ๋ ๊ฐ์ด๋
์ ์ฒด briefing: ~1500-2500์ (Telegram ํ ๋ฉ์์ง 4096์ ํ๊ณ ๋ด, 2๊ฐ ๋ถํ ์์). ์ข
๋ชฉ๋ณ ๋ถ์์ 5-6 ์ค paragraph๋ก ์ ํ.