shud.log
바이브코딩 기록

죽은 사이트를 살리면서, 첫 글에 "우리 전략이 졌다"고 썼습니다

2026-07-19애드센스토스증권오픈API모멘텀백테스트자동화

차트 화분에 물을 주는 로봇 정원사

제게는 죽은 사이트가 하나 있었습니다. stockpick26 — AI가 매일 뉴스를 요약해서 종목을 추천해주는 사이트였습니다. 애드센스를 노리고 만들었고, 반려당했고, 어느 날부터 봇이 멈췄고, 마지막 리포트 날짜가 한 달 전에 박힌 채로 인터넷 어딘가에 떠 있었습니다.

이번 주에 이 사이트를 살렸습니다. 다만 살리는 방식이 좀 이상했습니다. 원래 하던 걸 고친 게 아니라, 사이트의 정체성을 통째로 부정하는 것부터 시작했거든요.

AI 종목추천 사이트의 문제

방치된 사이트를 다시 열어보니, 애드센스가 왜 반려했는지 이제는 보였습니다.

전 종목의 목표가가 +12%, 손절가가 -7%로 똑같았습니다. 템플릿에 숫자만 끼운 티가 그대로 났습니다. 시황 요약에는 "삼성전자가 경쟁사인 테슬라를 제치고" 같은 문장이 있었습니다. AI가 지어낸 겁니다. 그리고 무엇보다 — 금융은 구글이 제일 깐깐하게 보는 영역인데, 거기서 근거 없는 매수 추천을 단정적으로 찍어주고 있었습니다.

심사관이 아니라 제가 봐도 광고 붙여주기 싫은 사이트였습니다.

마침 열쇠가 도착했습니다

방향을 튼 계기는 토스증권 오픈API 승인이었습니다. 6월에 신청해두고 잊고 있었는데, 이게 열리면서 실시간 시세를 코드로 받을 수 있게 됐습니다.

그래서 컨셉을 뒤집었습니다. 추천을 지우고, 기록을 남기기로.

제가 이미 돌리고 있던 ETF 모멘텀 봇이 있습니다. 나스닥100과 코스피200의 최근 1·3·6개월 수익률을 합쳐 점수를 매기고, 강한 쪽을 들고, 둘 다 꺾이면 국고채로 피신하는 규칙입니다. 이 봇의 계산 결과를 사람의 의견 없이 그대로 보여주는 대시보드 — 그게 새 사이트입니다. 순위표는 매일 장 마감 후 봇이 알아서 갱신하고, 봇의 일별 판정은 사후 수정 없이 일지로 박제됩니다.

사이트 어디에도 "사세요"가 없습니다. 규칙이 계산한 순위가 있고, 그 규칙의 설명이 있고, 그 규칙을 따라간 기록이 있을 뿐입니다.

집에서만 되는 API

전환 작업 중에 하루를 통째로 홀린 미스터리가 있었습니다.

토스 API 키를 넣었는데 403 Forbidden. 승인 메일은 분명히 왔는데 토큰 발급부터 거부당했습니다. 키를 다시 확인하고, 헤더를 의심하고, 몇 시간을 헤맸습니다. 그러다 밤에 집에 와서 같은 코드를 돌렸더니 — 그냥 됐습니다. 키도, 코드도, 아무것도 안 바꿨는데요.

답은 공식 문서 구석에 있었습니다. "등록된 허용 IP 목록에 없는 IP에서의 호출은 403으로 차단됩니다." 토스 오픈API는 IP 화이트리스트제였고, 등록된 건 집 공유기 IP였습니다. 낮에 밖에서 돌린 코드는 죄가 없었습니다. 위치가 죄였죠.

교훈은 두 가지였습니다. 하나, 인증 에러가 "간헐적으로" 나면 코드가 아니라 네트워크 위치부터 의심할 것. 둘, 이런 제약은 자동화 설계에 반영해야 한다는 것. 지금 파이프라인은 토스 인증이 실패하면 야후 시세로 자동 폴백하고, 밤에 한 번 더 돌아서 집 네트워크에서 토스 데이터로 갱신합니다. 사이트에는 오늘 데이터가 어느 소스에서 왔는지도 표시됩니다.

AI 셋이 말렸습니다: "지금 신청하면 또 떨어진다"

리뉴얼을 마치고 바로 애드센스를 신청하고 싶었는데, 그 전에 AI 세 명을 토론에 붙였습니다. 애드센스 승인을 최우선으로 사이트를 어떻게 구성할지.

셋의 진단이 아팠습니다. 대시보드 하나에 글 한 편은 심사관 눈에 "데이터 표 1장"이고, 반려 이력이 있는 도메인은 문턱이 더 높으니, 최소 한 달은 콘텐츠를 쌓은 뒤에 신청하라는 겁니다. 한 명은 "신호"라는 단어 자체를 지우라고 했습니다. 투자 신호를 준다는 뉘앙스 자체가 유사투자자문으로 읽힐 수 있다고요. 그래서 사이트 전체에서 신호를 "순위"와 "판정"으로 바꿨습니다.

토론이 시킨 숙제 중 자동화할 수 있는 건 그날 다 깔았습니다. 자산 16개마다 실데이터 차트와 설명이 붙은 상세 페이지, 용어 32개짜리 용어집, 봇이 매일 문장으로 써주는 운용 일지. 다만 페이지를 매일 새로 찍어내는 방식은 일부러 피했습니다. 날짜별 자동 생성 페이지 수백 개는 구글이 스팸으로 찍는 지름길이라, "적은 페이지가 매일 갱신되는" 구조를 택했습니다.

전략이 졌다고 제목에 썼습니다

숙제 중 사람이 써야 하는 글의 첫 편은 백테스트였습니다. 16년치 데이터로 전략을 검증해서 결과를 공개하는 글.

돌려보니 결과가 재미있었습니다. 전략의 연복리는 +19.2%. 나스닥100을 그냥 사서 버텼으면 +19.8%. 졌습니다.

예전의 저라면 이 숫자를 어떻게든 포장했을 겁니다. 지금은 반대로 제목에 박았습니다 — "이 전략은 나스닥 몰빵을 이기지 못했습니다." 대신 진짜 하고 싶은 이야기를 그 아래 썼습니다. 나스닥 몰빵의 16년에는 -33% 낙폭이 포함돼 있고, 전략은 그걸 -21%로 막았다는 것. 백테스트의 바이앤홀드 수익률은 바닥에서 안 판 사람만 가져가는 숫자인데, 저는 실제로 그 구간에서 팔아본 적 있는 사람이라는 것.

수익률로 이기는 글은 어디에나 있습니다. 정직함으로는 이길 수 있을 것 같았습니다.

배운 것

1. 죽은 프로젝트는 고치지 말고 정체성부터 다시 물어볼 것. "AI 종목추천"을 아무리 다듬어도 좋은 사이트가 될 수 없었습니다. 추천을 기록으로 바꾸는 결정 하나가 나머지 전부를 풀었습니다.

2. 간헐적 인증 실패는 위치를 의심할 것. 같은 코드가 낮에 안 되고 밤에 되면, 그건 코드 문제가 아닙니다. 금융 API는 IP 화이트리스트제가 많습니다.

3. 자동화는 콘텐츠가 아니라 신선도를 만들 때 안전합니다. 매일 새 페이지를 찍는 자동화는 스팸이 되고, 매일 같은 페이지를 갱신하는 자동화는 신뢰가 됩니다.

4. 불리한 숫자는 숨기는 순간 부채가 됩니다. 어차피 백테스트를 공개할 거라면, 진 것부터 쓰는 쪽이 나머지 전부를 믿게 만듭니다.


새 사이트는 stockpick26.com에서 돌아가고 있습니다. 백테스트 전문은 여기에 있고요. 애드센스 신청은 한 달 뒤, 일지가 쌓인 다음입니다. 결과가 나오면 — 붙든 떨어지든 — 그 얘기도 쓰겠습니다.

이어서 읽기
← 목록으로