Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/safety-regression.yml
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ jobs:
package-manager-cache: false

- name: Check dashboard date calculations and refresh behavior
run: node --test tests/js/dashboard.test.cjs
run: node --test tests/js/dashboard.test.cjs tests/js/research.test.cjs tests/js/operations.test.cjs

- name: Run safety regression tests
env:
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ pytest_tmp*/
.claude/worktrees/
output/
.playwright-mcp/
.playwright-cli/

# --- IDE / OS ---
.idea/
Expand Down
10 changes: 9 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,15 @@

종목별 보유 수량과 평균 매수가, 현재 비중과 목표 비중을 나란히 표시합니다.

비중은 **매수금액 기준**입니다. 현재 주가로 계산한 평가금액과 손익은 표 아래에 따로 표시합니다.
비중은 저장된 **평가 시점의 시장가격 기준**입니다. 가격이나 보유 수량을 확인할 수 없으면 비중을 미확인으로 표시합니다. 위 이미지는 이전 화면입니다.

## 시장 관찰과 투자 가설

**시장 관찰**에서 바스켓 구성 종목과 10개 업종 ETF의 상대 강도, 거래량 변화, 변동성, 자료 기준일을 비교합니다. **시장 자료 갱신**을 누르면 이전 거래일까지의 가격을 수집합니다. 순위는 현재 관찰 목록 안의 비교이며 자동 주문을 만들지 않습니다.

산업 변화와 기업 실적은 원문 출처, 확인 시각, 반증 조건, 다음 검토일을 가진 투자 가설로 기록합니다. 공개 시각이 불명확하거나 검토 기한이 지나면 별도로 표시합니다. [전문 운용 조사와 적용 내용](docs/INVESTMENT_RESEARCH_20261013.md)

일일 운영 뒤 공시·종목별 수급을 자동 수집하고, 새 주문의 계획가격 대비 체결비용과 등록 이후 모의운용 성과를 누적합니다. 화면에서 수집 실패·측정 근거·상승/하락일 성과·결측을 확인할 수 있습니다. [자동 수집·체결비용·장기 검증 안내](docs/RESEARCH_OPERATIONS_20261013.md)

## 투자 내역 저장

Expand Down
26 changes: 26 additions & 0 deletions config/market_intelligence.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Research evidence only. These collectors cannot authorize or execute orders.
version: 1
request_timeout_seconds: 12
collection_budget_seconds: 120
workers: 3
disclosures:
enabled: true
lookback_calendar_days: 14
max_pages_per_company: 4
# Key comes only from DART_API_KEY / existing Config.dart, never this file.
investor_flows:
enabled: true
provider: naver_securities
lookback_sessions: 4
# Provider offers only five recent rows; reserve one for excluded current day.
# Public web data, not a contracted KRX feed. Net quantities are shares, not KRW.
universe:
- {symbol: "005930", name: "삼성전자"}
- {symbol: "035420", name: "NAVER"}
- {symbol: "005380", name: "현대차"}
- {symbol: "051910", name: "LG화학"}
- {symbol: "005490", name: "POSCO홀딩스"}
- {symbol: "055550", name: "신한지주"}
- {symbol: "035720", name: "카카오"}
- {symbol: "012330", name: "현대모비스"}
- {symbol: "105560", name: "KB금융"}
83 changes: 83 additions & 0 deletions config/market_research.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Observation list, not a trading universe. Updating this file cannot authorize orders.
version: 1
name: "한국 주식·업종 관찰 레이더"
benchmark:
symbol: "069500"
name: "KODEX 200"
role: benchmark
cohort: benchmark
reference: "https://www.samsungfund.com/upload/kodex/newsroom/2026011317101936.pdf"
horizons: [20, 60, 120]
ranking_horizon: 60
require_adjusted_prices: true
# Current constituents are an observation sample, never a historical market universe.
universe:
- {symbol: "005930", name: "삼성전자", cohort: basket_equities, role: basket_target, group: "반도체"}
- {symbol: "035420", name: "NAVER", cohort: basket_equities, role: basket_target, group: "인터넷"}
- {symbol: "005380", name: "현대차", cohort: basket_equities, role: basket_target, group: "자동차"}
- {symbol: "051910", name: "LG화학", cohort: basket_equities, role: basket_target, group: "화학"}
- {symbol: "005490", name: "POSCO홀딩스", cohort: basket_equities, role: basket_target, group: "철강"}
- {symbol: "055550", name: "신한지주", cohort: basket_equities, role: basket_target, group: "금융"}
- {symbol: "035720", name: "카카오", cohort: basket_equities, role: basket_target, group: "인터넷"}
- {symbol: "012330", name: "현대모비스", cohort: basket_equities, role: basket_target, group: "자동차부품"}
- {symbol: "105560", name: "KB금융", cohort: basket_equities, role: basket_target, group: "금융"}
- symbol: "091160"
name: "KODEX 반도체"
cohort: sector_etfs
role: observation_only
group: "반도체"
reference: "https://www.samsungfund.com/upload/kodex/newsroom/20260427141121713.pdf"
- symbol: "091170"
name: "KODEX 은행"
cohort: sector_etfs
role: observation_only
group: "은행"
reference: "https://m.samsungfund.com/etf/search.do?searchText=091170"
- symbol: "091180"
name: "KODEX 자동차"
cohort: sector_etfs
role: observation_only
group: "자동차"
reference: "https://www.samsungfund.com/upload/kodex/newsroom/2026011317101936.pdf"
- symbol: "305720"
name: "KODEX 2차전지산업"
cohort: sector_etfs
role: observation_only
group: "2차전지"
reference: "https://m.samsungfund.com/etf/product/view.do?id=2ETFB1"
- symbol: "266420"
name: "KODEX 헬스케어"
cohort: sector_etfs
role: observation_only
group: "헬스케어"
reference: "https://www.samsungfund.com/upload/kodex/newsroom/20251016084306186.pdf"
- symbol: "117700"
name: "KODEX 건설"
cohort: sector_etfs
role: observation_only
group: "건설"
reference: "https://www.samsungfund.com/etf/product/pensionlist.do"
- symbol: "117460"
name: "KODEX 에너지화학"
cohort: sector_etfs
role: observation_only
group: "에너지화학"
reference: "https://www.samsungfund.com/etf/product/pensionlist.do"
- symbol: "266370"
name: "KODEX IT"
cohort: sector_etfs
role: observation_only
group: "IT"
reference: "https://www.samsungfund.com/upload/kodex/newsroom/20251016084306186.pdf"
- symbol: "0115D0"
name: "KODEX K조선TOP10"
cohort: sector_etfs
role: observation_only
group: "조선"
reference: "https://www.samsungfund.com/fund/lounge/promotion/40.do"
- symbol: "0080G0"
name: "KODEX 방산TOP10"
cohort: sector_etfs
role: observation_only
group: "방산"
reference: "https://www.samsungfund.com/fund/lounge/promotion/40.do"
20 changes: 20 additions & 0 deletions config/paper_validation.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Forward paper observation protocol. These are research sample requirements,
# not target returns, proof of profitability, or permission to use a live account.
schema_version: 1
protocol_version: "forward-paper-v2"
minimum_observations: 120 # Adjacent-session, benchmark-matched returns.
minimum_calendar_days: 180
minimum_regime_observations: 20 # Separately required for rising/falling benchmark days.
maximum_missing_ratio: 0.05
maximum_capture_delay_sessions: 2
# A new policy/code fingerprint starts a new cohort; past closes never seed it.
# Price indices exclude dividends. They are opportunity-cost comparisons, not
# cash/exposure-matched or risk-adjusted measures. Cash and defensive ETF weights
# remain explicit in each cohort's immutable exposure policy.
# NAVER's public web API supplies price indices, not a contracted exchange feed.
# Provider and its implementation digest are fixed in the cohort protocol.
baskets:
kr_diversified_hold:
benchmark: {symbol: "KS11", name: "KOSPI 가격지수 (NAVER 공개)", basis: "price_index", provider: "naver_public"}
kr_pocket:
benchmark: {symbol: "KS200", name: "KOSPI 200 가격지수 (NAVER 공개)", basis: "price_index", provider: "naver_public"}
9 changes: 9 additions & 0 deletions config/research_operations.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Observational jobs run after trading work, in a separate bounded process.
enabled: true
retry_minutes: 60
# Freshness follows completed trading sessions and the settled-close phase.
minimum_free_mb: 256
jobs:
market: {enabled: true, timeout_seconds: 150}
intelligence: {enabled: true, timeout_seconds: 180}
paper_validation: {enabled: true, timeout_seconds: 150}
72 changes: 72 additions & 0 deletions config/research_theses.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
{
"schema_version": 1,
"curator": "2026-10-13 공식 원문 조사 초안 · 자동 뉴스 수집 아님",
"entries": [
{
"id": "ai_electricity_constraints_20261013",
"title": "AI 확산과 전력 공급 제약을 함께 점검",
"theme": "AI · 데이터센터 · 전력 인프라",
"thesis": "IEA의 2026년 보고서는 데이터센터 투자 확대와 전력망·공급망 대응을 함께 다룬다. 연구 가설은 AI 수요 확대가 전력 인프라 투자 수요로 이어질 수 있다는 것이다. 국내 개별 기업의 수혜·수익성은 이 보고서만으로 확인할 수 없으며 수주, 매출 구성, 증설 비용과 가격을 추가 확인해야 한다.",
"invalidation_condition": "후속 자료에서 데이터센터 투자 축소, 효율 개선에 따른 전력 수요 전망 하향 또는 공급망 제약으로 인한 사업 지연이 확인되면 가설을 재검토한다. 기업별 실적 연결 근거가 없으면 종목 후보로 승격하지 않는다.",
"horizon": "산업 변화 관찰 6-24개월 · 월별 자료 재검토",
"review_at": "2026-11-13T09:00:00+09:00",
"expires_at": "2027-01-13T09:00:00+09:00",
"evidence_type": "industry_thesis",
"sources": [
{
"url": "https://www.iea.org/reports/key-questions-on-energy-and-ai",
"title": "IEA — Key Questions on Energy and AI",
"published_at": null,
"published_date": "2026-04-16",
"publication_note": "공식 페이지의 Published 16 April 2026 확인. 시각·시간대가 없어 정확한 published_at은 미상. 현재 가격 신호 또는 기업 수혜 확정 근거가 아니다."
}
],
"symbols": [],
"counterevidence": [
"산업 수요 증가와 주주 수익은 다르다. 증설 비용, 경쟁, 규제, 이미 높은 주가가 수익성을 낮출 수 있다.",
"전력 공급 제약은 공급자의 매출 증가뿐 아니라 데이터센터 사업의 지연 요인일 수 있다.",
"보고서 공개 후 시간이 지났으므로 최신 투자 계획과 실제 전력 수요를 추가 확인해야 한다."
]
},
{
"id": "samsung_3q26_earnings_review",
"title": "삼성전자 3분기 가이던스와 확정 실적의 차이 검토",
"theme": "기업 실적 · 이익 지속성 · 자본 배분",
"thesis": "삼성전자 공식 뉴스룸은 2026년 10월 8일 3분기 실적 가이던스를 발표했고, IR 페이지는 10월 29일 오전 10시 KST 실적 설명회를 안내한다. 현재의 가이던스를 확정 결산으로 취급하지 않는다. 설명회와 후속 보고서에서 사업별 이익, 현금흐름, 투자 지출 및 전망을 검토해 보유 논거를 업데이트한다.",
"invalidation_condition": "확정 실적이 가이던스와 달라지거나 이익 증가가 일회성 항목에 의존하거나 현금 창출·후속 전망이 약해지면 기존 성장 가설을 재검토한다. 설명회 일정 변경 시 event_at도 새 버전으로 수정한다.",
"horizon": "2026년 3분기 실적 이벤트와 후속 분기 비교",
"event_at": "2026-10-29T10:00:00+09:00",
"review_at": "2026-10-29T18:00:00+09:00",
"expires_at": "2026-11-16T18:00:00+09:00",
"evidence_type": "scheduled_event",
"sources": [
{
"url": "https://news.samsung.com/be/samsung-electronics-announces-earnings-guidance-for-third-quarter-2026",
"title": "Samsung Electronics Announces Earnings Guidance for Third Quarter 2026",
"published_at": null,
"published_date": "2026-10-08",
"publication_note": "공식 뉴스룸의 08-10-2026 확인. 공개 시각이 없어 published_at 미상. 잠정 가이던스이며 확정 결산 자료가 아니다."
},
{
"url": "https://www.samsung.com/global/ir/",
"title": "Samsung Investor Relations — 3Q26 Earnings Call",
"published_at": null,
"published_date": null,
"publication_note": "2026-10-13 조회 시 2026-10-29 10:00 KST 일정 확인. 페이지 게시 시각은 미상이며 일정은 변경될 수 있다."
}
],
"symbols": [
{
"symbol": "005930",
"rationale": "삼성전자가 자사 분기 가이던스와 실적 설명회를 공지한 직접 기업 이벤트다. AI 수혜 정도 또는 매수 우위를 이 공지만으로 판단하지 않는다.",
"source_url": "https://www.samsung.com/global/ir/"
}
],
"counterevidence": [
"가이던스는 확정 실적이 아니며 세부 사업 및 현금흐름 정보가 충분하지 않다.",
"좋은 실적이 이미 가격에 반영됐다면 실적 성장 자체가 초과수익의 근거가 되지 않는다.",
"설명회 일정은 취소·변경될 수 있어 임박 시 원문을 재확인해야 한다."
]
}
]
}
3 changes: 2 additions & 1 deletion config/strategies.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,8 @@ mean_reversion:
enabled: true # pykrx(우선) → yfinance(폴백) 순서로 조회
per_min: 0 # PER 하한 (0 = 적자 종목 제외). null 이면 검사 생략
per_max: 50 # PER 상한. null 이면 검사 생략
debt_ratio_max: 200 # 부채비율(%) 상한. 미신뢰 소스(yfinance debtToEquity)는 자동 skip됨. DART/pykrx만 점수에 반영.
debt_ratio_max: 200 # 부채비율(%) 상한. 요구 기준과 다른 공급자 비율은 매수 필터를 통과하지 못함.
debt_ratio_basis: total_liabilities_to_equity_pct # 총부채/자본. 차입금/자본을 의도할 때만 interest_bearing_debt_to_equity_pct로 명시 변경.

# --- 눌림목 전략 (C-3A) ---
# 중기 상승 추세 + RSI 눌림목 + ADX 추세 확인. edge-trigger 진입.
Expand Down
Loading
Loading