데이터로 보는 투자, 코딩 없이 완성하는 자동화. '호두의 AI 분석실'에 오신 것을 환영합니다.
강의, 문의, 협업: dodu.data@gmail.com
원하시는 기획에 대해서 바이브코딩으로 완성하는 방법을 알려드립니다.
강의
수강평
- 코드 한 줄 안 쓰고 주식 자동 분석 시스템 만들기 feat. Claude CLI
- 바이브 코딩으로 미국 주식 AI 자동 분석 시스템 만들기 with Claude Code
- 코드 한 줄 안 쓰고 주식 자동 분석 시스템 만들기 feat. Claude CLI
- 바이브 코딩으로 미국 주식 AI 자동 분석 시스템 만들기 with Claude Code
- 코드 한 줄 안 쓰고 주식 자동 분석 시스템 만들기 feat. Claude CLI
게시글
질문&답변
VCP 시그널 상태 추가 스크립트 에서 return_pct 조건
안녕하세요그 조건은 "실제 익절 판정"이 아니라 데이터를 빠르게 채우기 위한 임시 라벨입니다.① 말씀하신 우려가 맞습니다.return_pct > 0 → CLOSED 하나로 승패를 가르면, +0.01%(1원)만 올라도 "성공"으로 집계됩니다. 이걸 그대로 승률 통계에 쓰면 승률이 부풀려져요. 실제 매매 익절규칙으로는 부적절한 게 맞습니다.② 그런데 status와 "익절"은 다른 개념이에요. ▎ - status = CLOSED / OPEN → "포지션을 청산했는가, 아직 들고 있는가" (포지션 종료 여부) ▎ - "익절(승)" → "타겟가에 도달해서 이익으로 끝났는가" (성과 판정) ▎이 둘은 별개 축입니다. 손절(-5%)로 끝난 포지션도 CLOSED예요. 그래서 return_pct > 0으로 CLOSED를 정하면 청산 여부와 수익 여부를 뭉뚱그린 셈이라 정확하지 않습니다. 이 스크립트는 대시보드에 보여줄 과거 데이터를 빠르게 시드(seed)하려는 준비용 단순화이지, 진짜 청산 로직이 아니에요.③ 강의의 "진짜" 성과 판정은 따로 있습니다 — 타겟/손절 기준입니다.Part 6-6 /jongga-v2/cumulative 본편 로직을 보시면:if high >= target: # 고가가 타겟가(+9%)에 도달 → TARGET_HIT (승)elif low else: # 둘 다 안 닿음 → OPEN (미결)즉 승패는 +9% 도달 / -5% 도달이 기준이지, "1원이라도 플러스"가 아닙니다. ④ 정리 & 실전 보강법그 준비 스크립트의 return_pct > 0 라벨은 화면 채우기용으로만 쓰시고, 성과 집계에는 6-6 본편의 타겟/손절 판정을 쓰세요. 직접 고치고 싶으면 Claude Code에 이렇게 시키면 됩니다: ▎ VCP 시그널 상태 추가 스크립트를 수정해줘. ▎ status를 return_pct > 0로 정하지 말고, 실제 판정 기준으로 바꿔줘: ▎ - 보유 기간 동안 고가가 target_price(+9%)에 도달했으면 → outcome='TARGET_HIT', status='CLOSED' ▎ - 저가가 stop_price(-5%)에 도달했으면 → outcome='STOP_HIT', status='CLOSED' ▎ - 둘 다 아니면 → status='OPEN' (현재가 기준 평가) ▎ 승률은 TARGET_HIT 건수 / CLOSED 건수로 계산해줘.
- 좋아요수
- 0
- 댓글수
- 2
- 조회수
- 13
질문&답변
캐쉬가 업데이트 안됩니다.
안녕하세요! 말씀하신 대로 강의의 PriceCache는 한 번 들어간 값을 자동으로 갱신하거나 만료시키는 주체가 없습니다. bulk_update()를 다시 불러주기 전까지 값이 고정되는게 맞아요.그런데 왜 강의 실습은 멀쩡히 돌아갈까요?realtime-prices API의 폴백 로직에 있습니다. 우리는 bulk_update()를 어디서도 호출하지 않기 때문에 캐시가 항상 비어 있고 → 모든 요청이 "캐시 미스" → 전부 yfinance로 실시간 조회됩니다. 즉 데모에서는 캐시가 사실상 안 쓰이고, yfinance가 매번 싱싱한 값을 대신 답해주기 때문에 문제가 안 보이는 거예요. 이번 파트의 목표는 "싱글턴 / 스레드 안전(Lock) / 버전 기반 SSE 같은 구조를 손에 익히는 것" 이었습니다. 실시간 가격을 계속 밀어 넣는 갱신 파이프라인은 의도적으로 다음 단계로 미뤄둔 단순화예요. (강의가 너무 무거워지지 않도록요.)실전에서 진짜 "실시간 캐시"로 완성하고 싶다면, 두 가지만 채우면 됩니다 — Claude Code에 이렇게 시켜보세요: ▎ ▎ price_cache.py와 kr_market.py를 보강해줘. ▎ ▎ 1. PriceCache에 백그라운드 갱신 스레드를 추가해줘. ▎ - 앱이 시작될 때 데몬 스레드 1개를 띄움 ▎ - _tracked에 등록된 종목들을 N초(예: 10초)마다 yfinance로 조회 ▎ - 조회 결과로 bulk_update() 호출 → _version 자동 증가 ▎ ▎ 2. get_prices()에 TTL 만료를 추가해줘. ▎ - updated_at이 ttl초(예: 30초)보다 오래된 값은 "stale"로 보고 ▎ - 반환에서 제외하거나 yfinance로 다시 폴백 ▎이 두 개(①갱신 스레드 + ②TTL 만료)를 넣으면, 비로소 SSE의 버전이 실제로 바뀌면서 화면이 진짜로 실시간 갱신되고, 갱신 스레드가 잠깐 멈춰도 낡은 값이 그대로 나가지 않게 됩니다.
- 좋아요수
- 0
- 댓글수
- 2
- 조회수
- 12
질문&답변
노션 사용권한 요청
안녕하세요! 완료되어 있으실거에요!!
- 좋아요수
- 0
- 댓글수
- 2
- 조회수
- 25
질문&답변
거래대금에 대한 필터링 문제
좋은 질문이에요! 그리고 AI가 정확하게 짚었습니다 말씀하신 대로, 1차 필터는 50억인데 점수표에서는 1천억 미만이면 0점 → 필수조건 탈락이라, 결국 실제로 살아남는 종목의 하한선은 1천억이 됩니다. 그래서 50억~1천억 사이종목들은 "분석은 하지만 어차피 다 걸러지는" 상태가 맞아요.다만 이건 버그라기보다 두 기준을 따로 만들다 보니 생긴 자연스러운 결과예요. 실습하시면서 이런 흐름까지 직접 발견하셨다는 게 오히려 정말 잘 따라오고 계신 거예요 😊정리하면, 두 가지 방향 중 편하신 걸로 맞춰주시면 됩니다: 1. 1차 필터를 1천억으로 올리기 → 가장 깔끔하고, 불필요한 분석도 줄어들어요. 2. 점수표 1점 기준을 50억으로 낮추기 → 50억만 넘으면 1점 이상 받게 되어 기준이 서로 어긋나지 않아요. (1천억·1조는 점수 등급용으로 활용)혹시 50억~1천억 종목을 관심종목 리스트나 다른 통계에 따로 쓰실 계획이 있다면, 그땐 굳이 안 바꾸셔도 돼요. 그 경우엔 "50억 = 분석 대상 / 1천억 = 최종 선정 기준"으로 역할이 다른 거라 그대로 두셔도 괜찮습니다.궁금한 점 더 있으면 편하게 질문 주세요!
- 좋아요수
- 0
- 댓글수
- 1
- 조회수
- 30
질문&답변
시각화_가이드 자료는?
안녕하세요 시각화 가이드 자료의 경우 제외 후 공유되었습니다. 각자 만든 대시보드 형태가 약간은 다르기 때문에 해당 부분은 포함되어 있지 않습니다. 감사합니다.
- 좋아요수
- 0
- 댓글수
- 2
- 조회수
- 30
질문&답변
41강에 vcp 결과가 다르게 나옵니다.
안녕하세요!저는 전체 종목이 아니라 일부 상위 500개 종목을 대상으로 진행한 것으로 수강생님이 현재 출력하신 결과와는 약간 다르게 나타날수 있습니다. 조건을 제대로 넣어서 돌리신것이라면 지금 나온결과가 맞습니다.감사합니다.
- 좋아요수
- 0
- 댓글수
- 2
- 조회수
- 28
질문&답변
뉴스 검색에서 날짜 필터링
안녕하세요! 답변 드립니다. - 네이버 종목뉴스는 최신순으로 정렬되고, 저희는 page=1에서 최신 3건(limit=3)만 가져옵니다 → 보통은 최근 기사 - 분석 대상이 "오늘 급등한 종목"이라, 대개 급등을 만든 신선한 뉴스가 상단에 있습니다 그래서 문제가 되는 건 이 경우입니다: 뉴스 없이 수급·차트만으로 급등한 종목. 이때는 상단 3건이 며칠 전 기사일 수 있고, 그게 그대로 호재로 잡힙니다. 말씀하신 우려가 바로 이 케이스예요. 해결은 두 군데를 보강하면 됩니다. 아래 프롬프트를 Claude Code에 그대로 붙여넣으시면 됩니다. ① 수집 단계 — 오래된 뉴스를 애초에 거르기 (collectors.py)collectors.py의 get_stock_news 함수를 수정해줘. 각 뉴스의 날짜(published_at)를 파싱해서, 오늘 기준 최근 N일 이내의 뉴스만 남기도록 필터를 추가해줘. - max_age_days 파라미터 추가 (기본값 3) - published_at은 "2026.02.17" 또는 "2026.02.17 14:30" 형태로 오니 날짜 부분만 datetime으로 변환 - 오늘로부터 max_age_days를 초과한 뉴스는 제외 - 날짜 파싱에 실패한 뉴스는 일단 보존하되 로그만 남겨줘 - 필터 후 뉴스가 limit보다 적어도 억지로 오래된 뉴스로 채우지 말고 그대로 반환 - 필터 전/후 건수를 출력해줘 ② 분석 단계 — Gemini에게 날짜를 알려주고 가중치를 낮추게 하기 (llm_analyzer.py) llm_analyzer.py의 analyze_news를 수정해줘. news_items의 각 뉴스에 published_at(날짜)도 포함시키고, Gemini 프롬프트에 각 뉴스의 날짜를 함께 넣어줘. 프롬프트에 다음 지시를 추가해줘: - 오늘 날짜는 {today}야. - 발행일이 3일 이상 지난 뉴스는 '오늘의 호재'로 보지 말고 점수에 거의 반영하지 마. - 최신(1~2일 이내) 뉴스를 위주로 호재 여부를 판단해. - reason에 어떤 날짜의 뉴스를 근거로 점수를 줬는지 명시해줘. 마지막으로 한 가지 꼭 짚고 싶은 점이 있어요. 이렇게 날짜 필터를 넣었을 때 "최근 뉴스가 하나도 없어서 뉴스 점수가 0점"이 나온다면, 그게 틀린 게 아니라 오히려 정확한 신호입니다. 그 종목은 뉴스가 아니라 수급·차트로 오른 것이고, 시스템은 그 사실을 다른 점수 항목(수급·차트)으로 이미 반영하고 있으니까요. 오래된 뉴스로 억지로 호재 점수를 만드는 것보다, "오늘은 뉴스 재료 없음"을 정직하게 0점으로 두는 편이 예측 정확도에 훨씬 좋습니다. 이런 데이터 신선도(freshness) 점검은 실제 운영 시스템에서 가장 중요하게 다루는 부분 중 하나인데, 그걸 강의만 보고 스스로 발견하셨다는 게 정말 훌륭합니다. 같은 의문을 가질 다른 수강생분들을 위해 다음 강의 업데이트 때 이 내용을 보강 노트로 추가하겠습니다. 좋은 질문 감사합니다 🙌
- 좋아요수
- 0
- 댓글수
- 2
- 조회수
- 34
질문&답변
scorer.py 에 뉴스/재료 점수 부분이 없어요.
안녕하세요! 답변이 늦었습니다. 언제든 문의내용 있으시면 남겨주시면 답변드리겠습니다.감사합니다.
- 좋아요수
- 0
- 댓글수
- 2
- 조회수
- 33
질문&답변
제가 만든 파일로 강의 수강을 이어가도 되나요?
안녕하세요파일 그대로 진행하시면 됩니다! 혹시나 완성파일이 필요하신 분이 있으실까봐 올려두었습니다.24번 강의는 한번 확인해 보겠습니다. 감사합니다.
- 좋아요수
- 0
- 댓글수
- 2
- 조회수
- 33
질문&답변
최종 코드
안녕하세요! 강의 수강 감사드립니다.제가 최종 파일을 올려드리고자ㅜ 하였으나 퀀트 분석 강의에 경우는 최종파일은 올리지 못하도록되어 있습니다ㅠ 죄송하지만 양해부탁드립니다. 그래도 part9 시작파일부터 해보시면 조금 어려움이 덜하시지 않을까 생각이됩니다 한번 확인 부탁드립니다
- 좋아요수
- 0
- 댓글수
- 2
- 조회수
- 37




