라즈베리파이 투자 자동화 서버 — 1년 운영이 가르쳐준 설계 원칙

투자 자동화를 시작하면 곧 깨닫습니다. 코드는 반나절이면 짜는데, 그 코드를 1년 내내 안 죽고 돌게 만드는 것이 진짜 일이라는 걸요.

저는 라즈베리파이(손바닥만 한 초소형 컴퓨터)로 시세 수집, 신호 판정, 알림 발송을 돌리고 있습니다. 이 글은 하드웨어 자랑이 아니라, 1년 운영에서 사고를 겪으며 굳어진 설계 원칙의 기록입니다.

서버가 라즈베리파이든 클라우드든, 원칙은 같습니다.

[30초 요약] 핵심 원칙 셋 — ①모르면 멈춘다(데이터가 오래됐으면 판단하지 않는다) ②알림은 2티어(행동 필요한 것만 푸시, 나머지는 조용히) ③배포는 한 경로로(커밋된 버전만, 검증하며). 전부 사고를 겪고 나서야 규칙이 됐습니다.

왜 라즈베리파이인가요

전기료가 월 몇백 원 수준(소비전력 몇 와트)이고, 24시간 켜둬도 부담이 없습니다. 클라우드 무료 티어도 좋은 대안인데, 저는 증권사 API 키를 남의 서버에 두는 부담 때문에 집 안의 기계를 택했습니다. 내 돈에 접근하는 열쇠는 내 손이 닿는 곳에 두자는 단순한 논리입니다.

대신 책임도 내 것이 됩니다 — 정전, SD카드 수명, 네트워크 끊김. 그래서 아래 원칙들이 필요해졌습니다.

크론 설계 — 순서는 시간으로 푼다

자동화의 뼈대는 크론(정해진 시각에 스크립트를 실행하는 예약 기능)입니다. 여기서 배운 것 두 가지.

의존 순서는 시각 간격으로 풉니다. 데이터 수집 → 신호 판정 → 알림이 순서대로 돌아야 한다면, 수집을 8시 10분, 판정을 8시 25분, 후속 판단을 8시 35분 — 이런 식으로 간격을 둡니다. 앞 단계가 실패했을 때 뒷 단계가 헛돌지 않게 각자 입력 검증도 하고요.

시간대(KST/UTC) 함정을 조심하세요. 한국 새벽에 미국 장 데이터를 조회하면 아직 안 들어와 있을 수 있습니다. “오늘 데이터”가 서버의 오늘과 시장의 오늘이 다르다는 것 — 이걸로 한 번 데인 뒤 조회 시각을 통째로 옮겼습니다.

원칙 1 — 모르면 멈춘다

제일 중요한 원칙이라 사연부터 말씀드리면, 신호 판정 스크립트가 참조하는 시장 데이터 파일이 낡아 있었던 적이 있습니다. 초기 코드는 “파일이 오래됐네? 뭐 어때, 있는 걸로 판단하자”로 짜여 있었고요. 낡은 신호로 오판하기 직전에 발견했습니다.

지금은 반대입니다. 데이터가 일정 기간보다 오래됐거나 없으면, 판단하지 않고 경고만 보냅니다. 자동매매에서 “모르면 진행”은 사고의 문법이고, “모르면 멈춤”은 하루 기회를 놓치는 비용일 뿐입니다. 비대칭이 명확하죠.

같은 맥락에서 — 상태 파일은 임시파일에 쓴 뒤 통째로 교체(원자적 쓰기)해서 쓰다 만 파일이 안 생기게 하고, 같은 스크립트가 이중 실행되지 않게 잠금(flock)을 겁니다.

원칙 2 — 알림은 2티어

처음엔 모든 이벤트를 카카오톡으로 보냈습니다. 결과는? 알림이 스팸이 되니 정작 중요한 걸 놓치더라고요. 하루 열 개씩 오는 “정상 작동 중” 사이에서 “지금 팔아야 함”이 묻혔습니다.

지금은 두 층으로 나눕니다.

1티어(푸시): 지금 행동이 필요한 것만 — 위험 신호 발동, 주문 실패. 텔레그램으로 즉시 울림 – 2티어(조용한 기록): 정보성 — 일일 요약, 정상 완료. 카카오·스프레드시트에 쌓아두고 내가 볼 때 봄

이 구분 하나로 “알림을 다시 믿게” 됐습니다. 텔레그램 쪽 구축은 10분이면 됩니다(아래 링크).

원칙 3 — 배포는 한 경로로 (사고 경험담)

최근에 겪은 사고입니다. 노트북에서 서버로 코드를 복사하는 경로가 여러 개였는데, 한쪽에서 올린 최신 코드를 다른 쪽의 구버전 복사가 덮어버렸습니다. 새 기능이 이틀간 조용히 사라졌는데, 에러가 없으니 눈치도 못 챘죠.

이후 규칙: 버전 관리(git)에 커밋된 코드만, 단일 배포 스크립트로, 배포 후 해시(파일 지문)를 검증하며 올립니다. 서버의 파일이 내 기록에 없는 버전이면 배포를 거부하게 했고요. “편한 복사”를 여러 개 두는 건 자동화 서버에서는 부채였습니다.

백업과 보안 — 지루하지만 생명선

코드: git 원격 저장소로. 단, 시크릿(API 키)은 절대 커밋 금지 — 저장소 만들기 전에 제외 목록(.gitignore)부터 – 시크릿: 별도 경로에 파일 권한 600(소유자만 읽기)으로. 코드와 물리적으로 분리 – 데이터: 서버에서만 생기는 기록(체결 로그 등)은 주기적으로 다른 기계로 백업 — git이 안 지켜주는 파일이 뭔지 목록으로 확인해두세요 – 공격 표면 분리: 증권사 키가 있는 서버에 외부 공개 서비스(웹서버 등)를 같이 올리지 않습니다. 편의보다 격리

자주 묻는 질문

라즈베리파이 사양은 어느 정도면 되나요? 시세 수집·판정·알림 수준이면 보급형으로 충분합니다. 병목은 성능이 아니라 안정 운영 설계입니다.

정전이나 재부팅이 겁나요. 크론은 재부팅 후 자동 재개되고, 상태 파일을 원자적으로 쓰면 꺼진 시점이 언제든 복구됩니다. “언제 꺼져도 다시 켜지면 이어지는가”를 기준으로 짜면 됩니다.

클라우드가 낫지 않나요? 무료 티어 + 관리 편의는 클라우드 승입니다. 증권사 키의 보관 위치에 대한 생각이 갈림길이에요. 저는 집, 다른 분은 클라우드 — 둘 다 합리적입니다.

코딩을 잘 못하는데 가능할까요? 파이썬 기초 + 검색이면 시작은 됩니다. 다만 이 글의 원칙들(멈춤·검증·백업)은 코딩 실력과 무관하게 처음부터 넣으시길 — 나중에 넣으려면 사고를 먼저 겪게 되더라고요.

함께 읽으면 좋은 글

알림 2티어의 푸시 채널 만들기는 텔레그램 봇 10분 구축에 그대로 따라할 수 있게 정리했습니다. 이 서버가 상대하는 증권사 API의 함정들은 한투 KIS API 함정 모음 참고.

자동화 서버의 완성은 기능이 아니라 “안 죽는 습관”이었습니다 — 모르면 멈추고, 확인하고, 한 경로로 배포하세요.

※ 본 글은 개인 운영 경험의 기록이며, 특정 장비·서비스·투자의 권유가 아닙니다.

Leave a Comment