이 글은 그동안 Notion이나 Claude Code와의 상호작용을 통해 축적된 지식을 Claude Code로 추출하여 초안을 작성하게 한 것을 제가 직접 수정하고 다듬은 내용입니다.
이번 목표는 투자 판단에서 저의 '사고 과정'을 최대한 배제하고, 규칙대로 기계적으로 돌아가는 시스템을 만드는 것입니다.
시작 계기는 단순합니다. 주가가 하락할 때마다 망설였고, 망설일 때마다 판단이 흔들리는 저를 어떻게든 고치고 싶었기 때문입니다. 그래서 '매매 권유는 규칙이 내리고, 인간은 그것에 따라 실행만 한다'라는 형태를 목표로 삼았습니다.
또 다른 동기는 솔로프레너(solopreneur)가 되고자 하는 것입니다. 혼자 사업을 운영하려면 투자 역시 가능한 한 기계적으로 하고 싶다는 생각으로 시작하게 되었습니다.
이 글에서는 다음 세 가지를 소개합니다.
- Yahoo Finance 데이터를 MCP로 가져올 수 있도록 만든 원격 서버
- 규칙을 과거 데이터로 검증하기 위한 6가지 Claude 스킬
- Notion과 Claude의 정기 실행을 통해 매일 포트폴리오를 점검하는 운영 방식
지금까지의 5회는 'AI에게 어떻게 분석하게 할 것인가'에 중점을 두었습니다. 이번에는 '그 판단이 과거에도 유효했는지'를 검증하고, 매일 규칙대로 돌아가게 하는 것에 초점을 옮겼습니다.
| 회차 | 공개일 | 리포지토리 | 진행 내용 |
|---|
| Vol.1 | 2026-02-14 | stock_skills | yfinance를 이용한 스크리닝, 헬스체크, 스트레스 테스트 자동화 |
| Vol.2 | 2026-03-04 | stock_skills | Neo4j의 GraphRAG로 과거 분석과 교훈을 다음 번에 주입 |
| ... | | | |
돌이켜보면, 지금까지의 5회는 기계적이지 않았습니다. 스크리닝이나 헬스체크, 처방전 엔진이 내놓는 것은 후보군과 조언일 뿐이었고, 이 주식이 좋은지 여부를 수치로 최종 판단하는 것은 사람이었습니다. 언제 팔지에 대한 규칙조차 명확히 정해지지 않았습니다. Vol.4와 Vol.5에서는 AI 팀을 구성하여 토론하게 했고 어느 정도의 성과는 있었지만, 논의 내용을 읽고 결정하는 사람의 인지 부하와 작업 부담은 여전히 높았습니다.
과거 권유가 실제로 맞았는지 확인하는 시스템도 없었습니다. AI 분석이 아무리 똑똑해져도 마지막에 망설이는 것은 인간이었고, 망설일 때마다 판단이 흔들렸습니다.
그래서 이번에는 다음 세 가지를 새로운 전제로 삼았습니다.
- 데이터 소스는 Yahoo Finance로 통일하고, MCP를 통해서만 가져오기
- 규칙의 수치는 Notion에 기록된 것만을 사용하며, AI가 임의로 변경하지 못하게 하기
- 과거 검증과 일상 운영을 분리하여 각각 기록을 남기기
데이터는 Yahoo Finance MCP에, 규칙과 기록은 Notion에 통합했습니다. 검증 결과가 규칙을 바꾸는 것은 본인이 승인했을 때만 가능합니다.
Notion을 중심으로 삼은 이유는 세 가지입니다.
- Notion의 MCP를 통해 읽기와 쓰기가 가능하므로, 규칙 참조부터 점검 로그 기록까지 Claude의 정기 실행만으로 운영할 수 있습니다.
- 구체적인 규칙이나 컨텍스트를 쌓아둘 수 있습니다. 진행했던 내용, 생각했던 것, 실패한 경험, 규칙을 바꾼 이유, 채택하지 않은 안건, 과거 검증 결과까지 남겨두면 다음에 Claude와 이야기할 때 이를 전제로 읽어줍니다.
- 역할을 분리할 수 있습니다. 백테스트는 나중에 설명하겠지만 Claude Code가 더 처리하기 쉽고, 일상 점검 결과는 모바일 Claude 앱에서도 볼 수 있습니다.
두 번째는 Vol.2에서 Neo4j를 사용해 시도했던 '사용할수록 똑똑해지는' 과정을 인간이 읽을 수 있는 형태로 재구성한 것입니다. 이 글의 초안 자체도 그 축적된 지식을 바탕으로 Claude Code가 추출하여 만들고 있습니다.
모든 시장 데이터는 제가 직접 만든 MCP 서버에서 가져옵니다. yfinance를 감싼 24개의 도구를 가진 서버이며, Google Cloud Run 위에서 구동하고 있습니다.
Cloud Run은 대기 중인 인스턴스가 0개이고 요청을 처리한 만큼만 과금됩니다. 개인적으로 사용할 정도의 양이라면 무료 범위에 포함되므로, 서버 비용은 기본적으로 발생하지 않습니다.
| 항목 | 내용 |
|---|
| 도구 | 주가 및 복수 종목의 가격 이력, 재무 정보, 애널리스트 데이터, 주식 수, 배당/분할, 스크리너, 섹터, 시장 상황 등 24개 |
| 연결 방식 | Streamable HTTP, 스테이트리스(대기 중 인스턴스는 0개) |
| ... | |
| 분류 | 도구 |
| --- | --- |
| 가격 | get_quote |
get_quotes | 최대 50개 종목의 현재가와 전일 대비를 일괄적으로 가져옴 |
get_price_history | OHLC 값과 거래량 이력 (1분봉~3개월봉, 장외, 조정 유무) |
get_multi_price_history | 최대 20개 종목의 한 항목(종가 등)을 날짜×종목 표로 가져옴 |
get_live_ticks | Yahoo의 실시간 데이터를 수 초간 구독하여 종목별 최신가를 가져옴 |
| 기업 | get_company_info |
get_financial_statements | 손익계산서(Income Statement), 대차대조표(Balance Sheet), 현금흐름표(Cash Flow) (연간/분기별/최근 12개월) |
get_valuation_measures | 시가총액, EV, PER, 예상 PER, PEG, PSR, PBR, EV/매출, EV/EBITDA 추이 |
get_earnings | 다음 실적 발표일과 예상치, EPS의 예상/실적/서프라이즈 이력 |
get_analyst_data | 목표 주가, 레이팅 분포, 상향/하향 조정, EPS 및 매출 예상, 예상 수정 내역, 성장률 예상 |
get_holders | 최대주주 구성, 주요 기관 투자자 및 투자신탁, 내부자 거래 |
get_dividends_and_splits | 배당, 주식분할, 자본 이득 분배 이력 |
get_shares_outstanding | 발행 주식 수 추이 |
get_sec_filings | SEC 제출 서류 (미국 기업) |
get_fund_data | ETF/투자신탁 개요, 운용보수율(Expense Ratio), 자산 배분, 상위 편입 종목, 섹터 비중, 채권 등급 |
get_news | 관련 뉴스 |
get_option_chain | 만기별 콜 및 풋 옵션 (현재가 근처의 행사가격으로 필터링 가능) |
| 검색 | search_symbols |
screen_securities | Yahoo 스크리너. 준비된 19가지 조건 또는 사용자가 설정한 조건 (주식/투자신탁/ETF) |
list_screener_fields | 스크리너에서 사용할 수 있는 항목과 값 (지역, 섹터, 거래소) |
get_sector | 섹터 개요, 주요 기업, 주요 ETF/투자신탁, 리서치 보고서 |
get_industry | 업종 개요, 주요 기업, 주요 ETF/투자신탁, 리서치 보고서 |
| 시장 상황 | get_market_summary |
get_calendar | 실적 발표, 경제 지표, IPO, 주식분할 예정 |
티커는 AAPL, 7203.T(도쿄 증권거래소), ^N225, ^GSPC, USDJPY=X, CL=F, BTC-USD와 같이 지정합니다.
yfinance를 그대로 사용할 경우 몇 가지 문제가 있어 서버 측에서 흡수하고 있습니다.
fast_info.previousClose는 전일 종가가 하루 지연될 수 있으므로, 차트 메타데이터에서 가져옵니다 -
Market.summary는 같은 거래소의 항목을 덮어쓰기하여 시장 상황 정보가 누락되므로, Yahoo 엔드포인트를 직접 호출합니다 - 응답이 너무 커지지 않도록 옵션은 현재가 근처로만, 가격은 반올림하고, 긴 목록은 건수를 자릅니다.
- MCP SDK는 예외 내부 내용을 숨겨 오류를 볼 수 없으므로, 모두
ToolError로 변경하여 이유를 반환합니다.
백테스트에서 중요했던 점은, Yahoo의 종가(終値)가 auto_adjust=False로 설정되어 있어도 분할 조정된 값으로 반환되고, 주식 수는 당시 보고된 수치로 반환된다는 점이다. 이대로 계산하면, 분할이 있었던 종목(예: NVDA의 10분할)의 시가총액이 1/10이 된다.
Yahoo에 없는 데이터(일본 국채 수익률 등)는 다른 정보원에서 보충하지 않고 '얻을 수 없다'고 처리했다. 데이터 출처를 하나로 유지하는 것을 우선시했기 때문이다.
규칙의 숫자는 Notion 페이지에만 두고 버전 관리를 한다. 수정은 본인의 승인 후에만 가능하며, AI는 읽기만 할 뿐이다. 구체적인 수치는 본인의 규칙이므로 여기에는 적지 않고, 페이지의 형태만을 샘플로 보여준다.
| 장면 | 규칙 (샘플) |
|---|
| 모집단(母集団) | 매월, 시가총액 상위부터 지역별로 N 종목을 선택한다 |
| 매수 후보 | 모멘텀 상위 X% 이상, 종가가 이동평균선 위에 있고, 지역 지수도 이동평균선 위에 있는 경우 등 |
| ... | |
추천은 다음 영업일 시가(寄付き)에 본인이 지정가로 실행한다. 주문의 자동 발주는 하지 않는다.
손절 라인이나 익절 목표값 같은 조건들은 검증 결과에 따라 추가하거나 제외해 왔다. 현재 무엇을 채택하고 있는지는 Notion 규칙 대장(ルール台帳)에 버전별로 기록되어 있다. 장기간 보유하는 종목은 별도의 영역으로, 이 규칙의 대상이 아니다.
검증 과정을 6가지 Claude 스킬로 나누었다. 스킬의 정의만 Git에서 관리하며, 얻은 데이터나 결과는 .cache/backtests/에 두고 커밋하지 않는다.
| 스킬 | 역할 | 지켜야 할 것 |
|---|
| stock-data-collector | 주가·배당·분할·주식 수·환율·월별 모집단을 버전이 지정된 패키지로 저장 | Yahoo Finance MCP를 통해서만. 빈 데이터는 성공으로 간주하지 않는다 |
| stock-data-updater | 저장된 데이터에 최신 차이를 결합한다 | 원본 패키지는 덮어쓰지 않고, 상충되는 값은 충돌 목록(競合一覧)으로 보낸다 |
| ... | | |
공통적인 규칙이 세 가지 있다.
- 데이터 품질 레이블을 반드시 붙인다. 현재 상장된 종목들로 과거 모집단을 재구성한 것은 '근사 PIT(近似PIT)'라고 부르며, 당시를 완벽하게 재현했다고 말하지 않는다.
- 검산(検算)을 통과하지 못한 숫자는 보고하지 않는다. 회계 항등식, 최대 하락 재계산, 모든 매수 건이 조건을 충족하는지 여부를 주 구현과는 다른 코드로 확인한다.
- 과적합화(過剰最適化)를 성과라고 부르지 않는다. 개발 기간만으로 충분했던 규칙은 미사용 기간에서 검증할 때까지 '후보' 상태로 둔다.
여섯 가지 모두 작은 데이터로 실제로 구동하여 테스트했다. 검산 코드에도 고의적으로 오류가 있는 거래(조건 없는 매수, 수량 20배 등)를 넣어 놓아, 이를 놓치지 않는지 확인하고 있다.
데이터는 Yahoo Finance MCP에서 가져와 패키지로 손에 저장한다. 지금까지 만든 모집단의 예시는 이 정도다.
| 모집단 | 종목 수 | 기간 | 일별 데이터 |
|---|---|
| 미국・일본・싱가포르 | 약 7,000개 (미국 시가총액 상위 5,000개, 도쿄 증권거래소 Prime 전 종목 약 1,550개, 싱가포르 약 500개) | 2017년~ (약 10년) | 약 1,090만 행 |
| ... |
약 7,000개 종목의 일별 데이터가 있다면, 그중에서 매월 시가총액으로 상위 종목을 다시 선택하면서 하루씩 매매하는 시뮬레이션이 돌아간다. 기간은 200일선 같은 준비 기간을 제외하고 약 8년이다.
모집단을 매월 재구성하려면 주식 수의 이력이 필요하다. Yahoo에서는 일본 주식의 경우 2017년경 이전 데이터는 가져올 수 없기 때문에, 그보다 오래된 시기를 볼 때는 현재 종목에 고정한다. 이로 인해 생존자 편향(生存者バイアス)은 커진다.
아래는 가상의 규칙으로 돌린 결과의 샘플이다 (규칙과 숫자 모두 가상).
백테스트 결과 (샘플)
규칙: 샘플 v1
- 모집단: 미국 시가총액 상위 50개 종목 (매월 재검토)
...
구체적인 성적은 여기에 올리지 않는다. 대신, 이 스킬군으로 실제로 해본 '전략 테스트 방법'을 소개한다. 모두 Claude Code에 일본어로 요청하는 것만으로 데이터 취득부터 검산까지 돌아간다.
| 하고 싶은 것 | 요청 예시 | 주로 사용하는 스킬 |
|---|
| 현재 규칙을 그대로 재현하기 | "Notion의 규칙대로 5년치 백테스트를 해줘" | rule-set-manager, backtester |
| 이익 발생 원인을 분해하기 | "이익 실현과 손절매가 발생한 종목별로 보유 기간과 중간 미실현 손실을 내줘" | backtest-reviewer |
| ... | | |
직접 돌려보면서 알게 된 것은, 개별 성적의 숫자보다 여러 기간/조건에서 반복적으로 실행하고 조건을 바꿔 비교함으로써 최적화를 이룰 수 있다는 것이었다.
- 특정 기간에 좋은 성적이 나와도, 시작 타이밍이나 조건 파라미터를 바꾸면 결과는 크게 변한다. 역으로 말하면, 타이밍과 파라미터 조정만으로 최적화할 여지가 있다는 것도 알게 되었다.
- 이러한 최적화와 규칙 개선은 스킬로 처리 가능하다. 손실 원인에서 후보 규칙을 만들고 반복하여 시도하는 것(strategy-loop-optimizer), 결과를 조건 차이 및 거래 기여도(transaction contribution)로 리뷰하는 것(backtest-reviewer) 등으로 분담된다.
- 다만, 특정 기간에 효과적이었던 변경 사항이 다른 기간에서는 오히려 작용할 수 있다. 개발에 사용된 기간에서만 좋았던 변경을 성과라고 부르지 않는다.
- 자동 탐색으로 수백 가지를 시도하면, 우연히 그 기간에 맞는 규칙이 '1위'가 되기 쉽다. 따라서 1위를 그대로 채택하지 않고, 탐색에 사용되지 않은 기간에서도 다시 한번 테스트하여 통과된 것만 채용 후보로 삼는다.
- 사용하는 LLM을 크게 하거나 추론의 노력(inference effort)을 높이면 검증 성과도 높아진 느낌이 있다 (조건 누락이나 계산 착오가 줄어든다). 이는 체감일 뿐, 수치로 측정한 것은 아니다.
조건을 바꾸면 성적은 변한다. 다만, 정한 규칙을 도중에 무너뜨리지 않고 계속 유지할 수 없다면, 그 조정 또한 활용할 수 없다. 이 시리즈의 주제인 '생각하는 것을 줄이는 것'을 검증이 뒷받침해 준 형태다.
"원유 가격이 올라가던 시기에 에너지주를 샀다면 어땠을지 테스트해줘"라고 요청하면, 다음 순서로 진행된다.
- data-collector가 Yahoo Finance MCP에서 원유 선물(CL=F)의 가격과 에너지 업종 종목의 주가를 가져온다. 이때 '원유 가격이 올라가던 시기'를 조건으로 삼는다. 예를 들어 '원유 선물의 종가가 이동 평균선 위에 있는 동안'처럼, 모호한 표현을 판별 가능한 형태로 가다듬은 후 실행한다.
- backtester가 그 조건 기간 동안만 에너지주를 보유했을 경우를 현금 흐름(cash) 기준으로 시뮬레이션하고, 그 결과를 계속 보유했을 경우나 지수와 비교한다.
- backtest-reviewer가 이익이 어느 종목과 어떤 시점부터 발생했는지 분해하여 보여준다.
조건의 선을 긋는 방식이나 업종 선택을 바꿔서 같은 질문을 여러 번 테스트할 수 있다.
같은 방식으로, 다음과 같은 질문들도 테스트할 수 있다. 모두 Yahoo Finance에서 가져오는 데이터만으로 판별 가능하다.
| 질문 예시 | 조건화 형태 예시 | Yahoo에서 가져올 데이터 |
|---|
| 엔화 약세가 진행되던 시기에 자동차 등 수출 관련 일본 주식을 샀다면 | 달러/엔의 종가가 이동 평균선 위에 있는 동안 | 달러/엔(USDJPY=X), 각 종목의 주가 |
| ... | | |
매일 아침, Claude의 정기 실행 기능이 Notion에 저장된 보유 현황과 규칙을 읽고, Yahoo Finance MCP에서 전날 종가를 가져와 점검한다. 출력되는 것은 규칙 권장 사항일 뿐, 주문은 사람이 내린다.
규칙/보유/매매 기록이 모두 Notion에 있기 때문에, 정기 실행 기능은 그곳을 읽어 판별하고 결과를 다시 쓰는 것만으로 매일 아침 점검을 돌릴 수 있다.
아래 그림은 규칙을 결정하는 단계부터 매일 아침 점검까지의 흐름이다.
- Notion에서 주식 마스터의 보유 종목, 규칙 대장(rule ledger)에 채택된 버전, 투자 액션 예정 사항을 읽는다.
- Yahoo Finance MCP에서 종가와 환율을 가져오고, 규칙 대장에 채택된 버전에 따라 매도 조건과 매수 후보를 판별한다.
- 아침 보고서 최상단에 매도 → 매수 순으로 권장 사항을 작성한다 (순서 또한 규칙으로 정해져 있다).
- 매매 점검 로그(transaction check log)에는 권장 사항, 주식 수, 사용된 규칙 버전, 기준일, 근거를 남긴다. 실행 이력에는 성공/실패/정보 대기 상태로 나누어 기록한다.
- 사람이 그날 시초가에 시장가로 주문을 넣는다. 기본적으로는 규칙의 권장 사항대로 대응한다. 다만, 따를지 여부를 최종 결정하는 것은 사람이며, 책임 또한 사람이 진다.
데이터를 가져올 수 없을 때는 '판별 불가'라고 기록하고 추정으로 채우지 않는다. AI는 규칙의 숫자도, 주식 마스터의 투자 가설도 수정하지 않는다.
점검은 매일 아침 7시에 실행하고 있습니다. Claude 앱의 정기 실행이 위의 절차를 수행하며, 결과는 알림으로 도착하므로 스마트폰에서도 확인할 수 있습니다. 아래는 알림 예시입니다 (종목 지표는 실제 값이며, 자금액은 샘플입니다).
매매 추천(2026-11-07 토・기준일 11-06)
전부 매도: MU (Micron Technology) 4주
- 이유: 종가가 2영업일 연속으로 200일선을 하회했습니다 (11-05 656.39<755.26, 11-06 690.00<756.73).
...
여기서 소개된 검증은 다음의 한계를 포함한 '참고' 자료입니다. 미래 수익을 보장하는 것이 아닙니다.
- 과거의 모집단은 '현재도 상장되어 있는 종목'으로 구성하고 있습니다. 도중에 파산하거나 상장이 폐지된 종목은 처음부터 포함되지 않았기 때문에, 살아남은 종목만으로 측정한 성적이 되어 실제보다 좋게 보일 위험이 있습니다 (생존자 편향)
- 일본 주식의 경우 Yahoo에서 얻을 수 있는 발행 주식 수 기록이 2017년경까지만 거슬러 올라갈 수 있어, 그 이전에는 당시 시가총액 순위를 만들 수 없습니다. 시가총액 순으로 모집단을 재구성하는 검증은 주식 수를 추정하여 채우지 않고, 2017년 이후로 한정하고 있습니다.
이 시스템은 투자 조언이 아닌, 개인의 운용 기록입니다.
투자의 '생각하는 과정'을 줄이기 위해, 데이터(Data), 규칙(Rule), 검증(Verification), 운용(Operation)을 분리하고 각각의 저장 위치를 하나로 정했습니다.
- 데이터는 Yahoo Finance MCP만 사용합니다.
- 규칙과 매매 기록은 Notion만 사용합니다. 따라서 매일 아침 점검을 자동으로 실행할 수 있습니다.
- 검증은 6가지 스킬로 진행하며, 계산 과정을 거친 숫자만을 신뢰합니다.
- 운용은 매일 아침 추천대로 사람이 집행합니다. 따를지 여부에 대한 마지막 판단과 책임은 인간에게 있습니다.
검증을 통해 알게 된 것은, 백테스트(Backtest)에서 좋은 성적이 나온 규칙이라도 실제로 운용하면 마이너스가 겹치는 시기가 있다는 것입니다. 그러한 시기는 시뮬레이션에도 나와 있어 예상 범위 내입니다. 그럼에도 불구하고 자신의 돈으로 발생하면, 규칙 자체를 의심하게 됩니다. 성적을 좌우하는 것은 조건의 미세 조정보다, 그 시기를 규칙대로 잘 넘길 수 있는지 여부이며, 멘탈 관리가 중요하다고 생각합니다. 다음으로는 실제 매도가 20건 쌓였을 때, 승률(Win Rate), 평균 이익(Average Profit), 평균 손실(Average Loss)을 집계하여 규칙을 재검토할 예정입니다.
- okikusan-public/stock_skills_3 (본 기사)
- okikusan-public/stock_skills_2 (Vol.4・5)
- okikusan-public/stock_skills (Vol.1〜3)
면책 조항: 본 기사는 투자 조언을 목적으로 하지 않습니다. 투자의 판단은 본인의 책임 하에 진행해 주십시오. 백테스트 결과는 미래 운용 성적을 보장하지 않습니다.