안녕하세요, @정호교님. 좋게 봐주셔서 감사합니다. 두 가지 방법 모두 가능합니다. Lightsail 인스턴스를 하나 더 만들어서 따로 돌리기 기존 인스턴스 사이즈를 조금 올려서 한 대에 두 서비스를 같이 돌리기 배포 방식은 신규와 동일합니다. 강의에서 한 것처럼 Claude에게 같은 방식으로 요청하시면 됩니다. 한 대에 같이 올리실 때는 "기존 미국주식 서버가 돌고 있으니 폴더, 포트, systemd 서비스 이름을 다르게 해 달라"고만 덧붙여 주세요. 충돌은 없습니다. 두 프로그램은 서로 다른 코드이고, 별개의 프로세스로 돌며, 서비스 포트도 다릅니다. 각자 자기 폴더와 .env 만 보기 때문에 한쪽이 멈춰도 다른 쪽에 전혀 영향이 없습니다. 같은 인스턴스에서 한국주식과 미국주식 자동매매를 동시에 운영해도 문제없습니다. 리소스만 조금 신경 쓰시면 됩니다. 기존 512MB 플랜은 서비스 하나 기준으로 잡은 사이즈입니다. 서비스 하나당 대략 150MB를 차지하는 것을 보면, 둘을 돌리는 것 자체는 되지만 혹시나 트래픽이 겹치게되면, 메모리가 빠듯할 수 있습니다. 안정적으로 운영하시려면 1GB 플랜으로 한 단계 올리시길 권합니다. 우선 1대의 인스턴스에서 며칠 돌려 보시고 free -h 에서 swap 사용량이 크게 늘면 그때 올리셔도 됩니다. 추가로 궁금한 부분 있으시다면 언제든 질문 주세요~ 감사합니다.
@정호교님, 안녕하세요. 꼼꼼히 확인하고 알려주셔서 감사합니다. 말씀하신 대로 알파밴티지 정책이 바뀐 게 맞습니다. 강의에서 쓰는 뉴스 감정 분석 기능(NEWS_SENTIMENT)이 지금은 유료 플랜 전용으로 바뀌어서, 무료 키로는 데이터가 오지 않습니다. 코드를 잘못 따라 하신 게 아니니 걱정하지 않으셔도 됩니다. 지금 진행하시는 데는 지장이 없습니다. 감정 데이터가 비어 있으면 감정 점수는 중립으로 처리되고, ML 예측·기술지표·거래량으로 매수 후보를 고르는 과정과 자동매매는 그대로 돌아갑니다. 감정 점수로 한 번 더 거르는 /recommended-stocks/with-sentiment 결과만 비어 나올 수 있는데, 같은 이유라 정상입니다. 유료 플랜은 따로 결제하지 않으셔도 됩니다. 대신 추가 비용 없이 감정 분석을 계속 쓰실 수 있도록, 무료 뉴스 소스로 바꾸는 방법을 강의로 준비하고 있습니다. 이번 주말에 촬영을 시작해서 편집이 끝나는 대로 올려드릴 예정이고, 늦어도 다음 주 중에는 업데이트됩니다. 올라가면 새소식으로 알려드리겠습니다. 외부 서비스 쪽 변경이긴 하지만 기다리시게 해서 죄송합니다. 궁금한 점 생기면 언제든 편하게 또 보내주세요. 빠르게 답변드리겠습니다.
안녕하세요, @무무님. 오랜만에 돌아오셨네요. 하나씩 답드리겠습니다. 1. 코랩 오류 사진의 오류는 코드 문제가 아니라 economic_and_stock_data 테이블에서 데이터가 0건으로 와서 생긴 겁니다. 0개 레코드 → 빈 데이터라 '날짜' 컬럼이 없음 → 그 뒤가 전부 멈춘 순서입니다. 2주 쉬신 것과 맞물려 세 가지 중 하나일 가능성이 큽니다. 코랩 맨 아래에 새 셀을 만들어 이것만 실행해 보세요. r = supabase.table("economic_and_stock_data").select("*", count="exact").limit(1).execute() print("행 수:", r.count) print("접속 주소:", supabase.supabase_url) 행 수가 0 → 데이터가 진짜 없는 겁니다. 수집은 run.py 가 하는 일이라, 먼저 run.py를 띄우고 localhost:8000/docs 에서 데이터 수집 API를 한 번 돌리신 뒤 코랩을 다시 실행하세요. 서버를 처음 켤 때 경제지표 수집이 자동으로 한 번 돌기도 합니다. 행 수는 있는데 0건으로 보인다 → 테이블에 RLS가 켜져 있고 anon 키를 쓰고 계신 경우입니다. 강의대로 service_role 키인지 확인해 주세요. 접속 주소가 대시보드 주소와 다르다 → 프로젝트를 두 개 만드셨다면 다른 쪽을 보고 있는 겁니다. 겸사겸사 Supabase 대시보드에서 프로젝트가 Paused 상태가 아닌지도 보세요. 무료 프로젝트는 일주일 안 쓰면 일시정지됩니다. 그 경우 Restore 버튼 한 번이면 됩니다. 그리고 “run.py가 잘 돌면 상관없나”는 반은 맞습니다. run.py는 데이터 수집·추천·매매를, 코랩은 ML 예측을 맡습니다. 그런데 완성편은 run.py의 일일 파이프라인(밤 9시)이 Kaggle을 자동으로 돌리기 때문에 , Kaggle 키를 설정해 두셨다면 코랩은 돌리지 않으셔도 됩니다. Kaggle을 설정하지 않으셨다면 코랩이 ML 단계이니 꼭 돌아야 하고요. 어느 쪽이든 지금처럼 DB가 0건이면 둘 다 막히니, 위 확인부터 하시면 됩니다. 2. 클라우드 없이 내 컴퓨터에서 네, python run.py 하나로 서버와 스케줄러가 전부 뜹니다. 대신 세 가지만 지켜주세요. 터미널 창을 닫으면 멈춥니다. 켜 둔 채로 두세요. 미국장은 한국 시간으로 밤 10시 30분부터 새벽 5시까지라, 컴퓨터가 밤새 켜져 있고 절전 모드에 들어가지 않아야 합니다. 파이프라인은 밤 9시에 돕니다. .env 파일이 그 컴퓨터에 있어야 합니다. 한국투자증권, Supabase, Kaggle 키 전부요. 처음 기동할 때 2주치 경제지표를 한 번에 당겨오니 첫 실행은 조금 걸립니다. 그게 끝나고 1번의 행 수가 채워지면 정상입니다. 궁금한 점 생기면 언제든 편하게 또 보내주세요. 최대한 빠르게 답변드리겠습니다. 감사합니다.
안녕하세요, @jkl님. 실제로 있을 수 있는 현상입니다. 우리 코드는 최근 3일치 뉴스 중 관련도(relevance_score) 0.2 이상인 기사만 세기 때문에, 주말이 끼거나 뉴스가 매일 나오지 않는 종목은 3일 안에 기사가 0건인 날이 실제로 있습니다. 다만 8개 전부 0건이면 AlphaVantage 무료 한도(하루 25회)도 한 번 확인해 보세요. 한도를 넘으면 응답에 feed가 없이 "Information" 메시지만 오는데, 우리 코드는 이 경우도 "관련 기사 없음"으로 표시합니다. api_data = response.json() 아래에 print(api_data)를 넣어 보면 바로 구분됩니다. 개선 방법은 감정분석 기간을 3일보다 길게 잡는 것입니다. 더 최적화하면, 기사가 끊이지 않는 대형 종목은 3일로 두고 그렇지 않은 종목은 일주일로 늘리는 식으로 종목별 차등을 둘 수 있습니다. 이 외에 jkl님만의 방법을 적용하셔도 됩니다. 정답이 정해진 영역이 아니라서, 직접 바꿔보는 구간에서 실력이 가장 많이 늡니다. 또, 수강 중 질문 있으시다면 편하게 올려주세요~ 감사합니다.
안녕하세요, @jkl님. 걱정하신 것과 달리 AI가 아무 데이터나 넣게 바꾼 건 아닙니다. 핵심은 columns_with_numbers 한 군데이고, 이건 값이 하나도 없는 컬럼을 학습과 예측에서 빼는 코드입니다. 나머지 종목·지표는 원래 코드와 똑같이 학습하고, 저장되는 것도 실제 모델 예측값입니다. 즉 지난번에 말씀드린 "어떤 컬럼이 통째로 비어 있다"가 실제로 맞았던 겁니다. 다른 변경(앞뒤 값 채우기, clipnorm, 저장 확인)은 원래 코드에 이미 있거나 무해한 안전장치 코드라 그대로 두셔도 됩니다. 다만 한 가지는 꼭 확인하셔야 합니다. 실행 출력에 값이 없어 학습에서 뺀 칸: [...] 이 찍혔을 텐데, 그 목록에 종목 이름이 있으면 그 종목은 앞으로 예측도 추천도 되지 않습니다. 매매 시스템이 예측 결과 테이블에 없는 종목은 후보로 올리지 않기 때문입니다. 근본 해결은 빠진 컬럼에 데이터를 채우는 것입니다. 채우고 Colab을 다시 돌리면, 지금 코드가 그 컬럼을 자동으로 다시 포함하므로 코드를 되돌릴 필요는 없습니다. 감사합니다.
안녕하세요 @sunday1903님. 문서와 코드를 꼼꼼하게 대조해 보시고 지적해 주신 점 진심으로 감사드립니다. 문의해주신 내용을 바탕으로 코드베이스 및 전달해 드린 기술 문서를 전체 검토하였으며, 실제 문서와 코드 간의 반영 상태 및 조치 사항 을 다음과 같이 안내해 드립니다. 1. signal_snapshots 관련 안내 해당 테이블은 현재 미구현(설계 단계) 상태가 맞습니다. 15번 문서는 '시점별 스냅샷 백테스트'에 대한 설계 가이드 문서 입니다. 현재 프로젝트 코드에는 스냅샷 저장 함수( snapshot_service.py )만 작성되어 있으며, 해당 함수를 호출하는 메인 파이프라인 연결부 및 백테스트 관련 분석 코드( backtest/ )는 실제 운영 코드의 안정성을 위해 아직 미반영된 상태입니다. 따라서 테이블을 생성하더라도 데이터가 적재되지 않는 것이 정상이므로, 현재 단계에서는 신경 쓰지 않으셔도 괜찮습니다. 2. [중요] DB 스크립트 업데이트 및 조치 요청 earnings_calendar (실적 캘린더) 관련 테이블 및 일부 컬럼이 과거에 설치용 스크립트( create_all_tables.sql )에서 누락되어 있던 것을 확인하여 업데이트하였습니다. 최신 코드를 다시 받아서 (git pull) supabase에서 ddl 스크립트를 반영해주시면 감사하겠습니다. 해당 테이블이 없으면 서버 오류는 발생하지 않지만, LLM 판정 로그 및 실적 데이터 저장이 스킵 될 수 있습니다. 조치 방법: 프로젝트 최신 코드를 git pull (또는 재다운로드) 받습니다. Supabase의 SQL Editor 로 이동합니다. db_backup/schema/create_all_tables.sql 파일의 전체 내용을 복사하여 Run 을 실행해 주세요. (기존 테이블 및 데이터는 유지되며, 누락된 테이블과 컬럼만 안전하게 추가됩니다.) 3. 주요 문서별 실제 코드 반영 상태 정리 수강생분들께서 혼선이 없으시도록, 심화 과정 문서(10번 이후)들의 실제 코드 구현 상태를 정리해 드립니다. 01~09, 11, 16, 17번 문서: 코드와 100% 일치 (17번 실적 캘린더 관련 기능 포함) 10번 (멀티팩터 점수화): [기획/개념 문서] Layer 1(v2 z-score) 로직은 scoring_service.py 에 적용되어 있으며, Layer 2·3 모델은 기획 문서로 제공됩니다. 14번 (트레일링 스톱): [고급 기능 설계 문서] 실제 매도 로직은 현재 안전한 ATR 기반 고정 익절/손절 로 작동 중입니다. 15번 (시점별 스냅샷): [고급 기능 설계 문서] 참고 10, 14, 15번 등 일부 문서는 기본 파이프라인 구축 후 "향후 어떻게 시스템을 확장 및 개선할 수 있는가" 를 설명하는 설계/기획 문서이므로 코드에 없는 파일이나 함수명이 등장할 수 있습니다. 학습 중 추가로 어색하거나 궁금한 항목이 있다면 언제든지 문의/타임라인과 함께 글 남겨주세요. 빠르게 확인하여 도와드리겠습니다! 감사합니다.
안녕하세요, @jkl님. 예측 모델 코드 문제가 아니라, 저장이 안 된 상태에서 그다음 단계가 줄줄이 무너진 겁니다. 보내주신 로그 네 줄이 순서대로 그걸 보여주고 있어요. predicted_stocks 테이블의 총 레코드 수: 0 ← 저장되었다는 메시지는 떴지만 실제로 들어간 행이 0개입니다 총 0개 데이터를 성공적으로 가져왔습니다! ← 그래서 가져온 데이터도 0개 데이터 가져오기 오류: '날짜' ← 빈 데이터에는 '날짜' 컬럼이 없으니 여기서 실패 'NoneType' object has no attribute 'columns' ← 그 함수가 None을 돌려줘서 마지막에 터진 것 즉 1번만 해결되면 나머지는 저절로 풀립니다. 경제지표와 주가 저장이 잘 되셨다니 키와 연결은 정상입니다. predicted_stocks 테이블 쪽만 보시면 됩니다. 확인 순서 ① Supabase에서 눈으로 확인하세요. Table Editor에서 predicted_stocks 테이블을 열어보세요. 행이 하나도 없으면 저장이 실패한 게 맞습니다. 테이블 자체가 안 보이면 테이블 생성 SQL을 아직 실행하지 않으신 겁니다. ② 저장하는 셀의 응답을 직접 찍어보세요. "저장되었습니다"는 응답을 확인하지 않고 출력되는 메시지라 믿으시면 안 됩니다. 저장 코드 뒤에 이렇게 한 줄 추가해 보세요. response = supabase.table("predicted_stocks").insert(records).execute() print(response) 여기에 에러 내용이 그대로 찍힙니다. 컬럼명이 안 맞는지, 권한 문제인지 바로 보입니다. ③ RLS를 확인하세요. 이게 제일 흔한 원인입니다. Supabase에서 테이블에 RLS(Row Level Security)가 켜져 있는데 정책이 없으면, 저장도 조회도 에러 없이 조용히 0건으로 돌아옵니다. 지금 증상과 정확히 같습니다. Authentication → Policies에서 predicted_stocks 의 RLS 상태를 보시고, 강의대로 진행하셨다면 service_role 키를 쓰고 계신지도 같이 확인해 주세요. 경제지표 테이블은 되는데 이 테이블만 안 된다면 테이블마다 설정이 다르게 들어갔을 가능성이 큽니다. ③번에서 해결되는 경우가 대부분입니다. 그래도 안 되면 ②번에서 찍힌 응답 전체와 Supabase 테이블 화면을 캡처해서 올려주세요. 바로 봐 드리겠습니다. 궁금한 점 생기면 언제든 편하게 또 보내주세요. 빠르게 답변드리겠습니다. 감사합니다.
안녕하세요, @별명을붙여줘야겠군님. 먼저 소스코드 비교하시느라 고생 많으셨습니다. 제공해 드린 소스는 강의 중에 고친 내용까지 전부 반영된 완성본이라, 받으신 파일에는 개인 키 값만 채우시면 됩니다. 캐글 연동도 거의 같습니다. 다만 한 군데는 꼭 바꾸셔야 합니다. 캐글 계정에서 API 토큰 발급 (Settings → API → Create New Token) .env 에 KAGGLE_USERNAME 과 KAGGLE_API_TOKEN 입력. 여기서 username은 토큰 이름이 아니라 실제 캐글 계정 아이디입니다. 이걸 헷갈리시는 분이 많습니다. kaggle_notebook/kernel-metadata.json을 열면 "id": "cheatkeyman/stock-prediction" 이 있습니다. 앞부분을 본인 캐글 아이디 로 바꿔주세요. 안 바꾸시면 제 계정에 노트북을 올리려다 권한 오류가 납니다. 캐글 계정에서 전화번호 인증 을 해두세요. GPU와 인터넷 사용이 그때 열립니다. 이게 안 되어 있으면 노트북이 실행되다 멈춥니다. 노트북 안의 Supabase 키는 따로 넣지 않으셔도 됩니다. 푸시할 때 코드가 .env 값을 노트북 첫 셀에 자동으로 넣어주도록 되어 있습니다. 설정이 끝나면 서버를 띄우고 /pipeline/kaggle/auth-check 를 호출해 보세요. 인증이 정상인지 바로 확인됩니다. 통과되면 /pipeline/kaggle/trigger-ml 로 실행하시면 됩니다. 8000번 포트에 글자만 나오는 건 정상입니다. 주소창에 localhost:8000 만 치면 서버가 살아 있는지 알려주는 메시지 한 줄만 나옵니다. 거기까지 나오셨으면 서버는 제대로 뜬 겁니다. 보고 싶으신 화면은 localhost:8000/docs 입니다. API 목록이 쭉 나오고, 버튼을 눌러 바로 실행해 볼 수 있습니다. 캐글 인증 확인이나 파이프라인 실행도 전부 여기서 하시면 편합니다. 참고로 이 시스템은 별도 대시보드를 만들지 않습니다. 매매 결과는 슬랙 알림과 증권사 앱으로 확인하는 구조라서요. 또 궁금한 점 생기면 언제든 편하게 또 보내주세요. 빠르게 답변드리겠습니다. 감사합니다.
안녕하세요, @별명을붙여줘야겠군님! 수작업으로 바꿀 건 없습니다. 한국 시장은 서머타임이 없어서 매매 시각이 고정이고(09:00~15:30), 스케줄러도 Asia/Seoul 타임존으로 돌아갑니다. 매수 10시, 장중 매도 감시, 15:40 정합성 동기화 모두 1년 내내 그대로입니다. 미국 서머타임이 걸리는 곳은 딱 하나, VIX나 나스닥·필라델피아 반도체지수 같은 미국 지표를 받아오는 시점입니다. 미국장 마감이 여름엔 KST 05시, 겨울엔 06시인데 파이프라인 기본값을 07:00으로 잡은 게 그 이유입니다. 겨울 기준으로도 마감 뒤라서 두 기간 모두 안전합니다. config.py 에도 06시 이전으로는 당기지 말라고 주석을 달아 뒀는데, 06시에 돌리면 겨울엔 미국장이 아직 안 끝나서 전전일 값이 그대로 굳어버립니다. 그리고 말씀하신 그 원칙 덕분에 애초에 꼬일 자리가 없습니다. 미국 지표는 전일(T-1) 값만 씁니다. 코드에 shift(1)을 걸어두고 당일 미국 값은 한국 아침에 확정이 안 되니 아예 쓰지 않습니다. 붙이는 기준도 시각이 아니라 거래일 날짜라서, 한 시간 늦게 열리고 닫히는 건 영향이 없습니다. 서머타임 전환일도 똑같습니다. 궁금한 점 생기면 언제든 편하게 또 보내주세요. 빠르게 답변드리겠습니다. :) 감사합니다.
안녕하세요, @별명을붙여줘야겠군님. 기간 설정과 비용은 별개입니다 Claude API는 크레딧을 미리 충전해 두고, 토큰을 쓴 만큼 차감되는 구조입니다. 키의 유효기간은 "이 키를 언제까지 쓸 수 있게 할지"만 정합니다. 기간이 길다고 비용이 더 나가지 않습니다. 1달짜리를 고르면 걱정하신 대로 멈춥니다 키가 만료되면 LLM 호출이 실패합니다. 우리 시스템은 LLM 호출이 실패하면 매수를 차단하도록 되어 있어서, 한 달 뒤부터 매수가 0건이 됩니다. 키가 만료되면 새 키를 발급해서 .env 의 ANTHROPIC_API_KEY 를 바꾸고 서버를 재시작해야 합니다. 추천: 기한 없음 무인으로 계속 돌리는 자동매매 용도라 기한 없음을 권합니다. 경고 문구는 "키가 유출되면 계속 악용될 수 있다"는 보안 안내입니다. 아래만 지키시면 됩니다. .env 를 깃에 올리지 않기. 키를 채팅이나 스크린샷에 노출하지 않기. 크레딧 자동 충전은 꺼 두기. 유출되더라도 피해가 충전해 둔 잔액으로 제한됩니다. (참고로 저는 자동 충전을 켜두고 사용하고 있습니다.) 유출이 의심되면 콘솔에서 해당 키를 바로 삭제하고 새로 발급하기. 기한을 두고 싶으시면 가장 긴 기간을 고르고, 만료 전에 교체하도록 캘린더에 알림을 걸어 두세요. Slack을 연동해 두셨다면 만료 시 "LLM 검토 실패" 알림이 오니 그걸로도 알 수 있습니다. 또, 강의 수강 중 질문 있으시다면 편하게 문의 주세요~ 감사합니다.