최근 Backtesting과 Upbit 코인 자동 매매 프로그램의 뼈대는 Windsurf로 만들고, 이걸 VS Code에서 보완하는 작업을 했어.
보완하면서 몇가지 코드의 Parameter들도 수정했지만,
자잘한 것들이나 출력 Message는 Gemini Code Assist만으로 보완했고, 그 내용을 적어 줄게.
사실 보완하는 과정의 이미지를 가져오면 이해가 더 쉬울 텐데, 이전 대화 로그가 없어 요약을 요청했어.

📌 3줄 요약
- 윈드서프(Windsurf)로 짠 자동매매 봇 뼈대를 VS Code로 가져와 'Gemini Code Assist'로 디테일을 다듬었어.
- 로직 에러부터 가독성, 예외 처리, 로그 출력까지 찝찝했던 부분들을 AI 어시스턴트와 대화하며 '딸깍' 보완 완료!
- 코딩 초보라도 AI만 잘 부려먹으면, 내 피 같은 돈을 굴려줄 훨씬 안정적이고 단단한 실전용 봇을 완성할 수 있어.
최근 백테스팅(Backtesting)과 업비트(Upbit) 코인 자동매매 프로그램의 큰 뼈대는 윈드서프(Windsurf)로 '딸깍' 만들고, 이걸 내 로컬 환경인 VS Code로 가져와서 본격적으로 보완하는 작업을 했어.
보완하면서 내 변동성 돌파 전략에 맞게 몇 가지 코드의 파라미터(Parameter)들도 직접 수정했지만, 자잘한 로직들이나 출력 메시지, 예외 처리 같은 건 오직 Gemini Code Assist만으로 대화하듯 보완했고 그 내용을 오늘 적어보려고 해.
사실 내가 AI랑 핑퐁 치면서 코드를 뜯어고치는 과정의 이미지를 캡처해서 가져오면 이해가 더 쉬울 텐데, 실수로 이전 대화 Log가 날아가 버려서(...) Gemini에게 내가 고친 내용을 요약해 달라고 요청했어. 아래 내용은 Gemini가 요약해 준 보완 사항을 내 블로그 스타일에 맞게 정리한 거야.
그럼 내 자동매매 봇이 어떻게 더 단단해졌는지 같이 확인해 볼까?
1. 배경: 왜 굳이 다시 뜯어고쳤을까?
아무리 윈드서프가 천재적이라도 첫 술에 완벽할 순 없어.
- BACKTESTING 모듈은 백테스트 시나리오나 결과 분석을 돌릴 때 간혹 오류가 튀어나오거나 출력 되는 가독성이 떨어지는 부분이 있었어.
- main.py (실제 봇이 돌아가는 메인 파일)는 실행 흐름이나 설정 로딩, 그리고 에러가 났을 때 대처하는 예외 처리 부분에서 개선이 꽤 필요했지. 결국 이 두 파일을 꽉 조여서 봇의 안정성과 유지보수성을 높이는 게 이번 보완의 핵심 목표였어.

2. BACKTESTING 수정 내용: 내 돈을 지키는 깐깐한 검증
백테스트는 내 전략의 거울이야. 데이터가 꼬이면 결과도 쓰레기가 되니까 철저하게 예외 처리를 추가했어.
① 입력 데이터 검증 강화 백테스트에서 사용하는 가격 데이터나 날짜 범위 등을 사전에 깐깐하게 검증하게 만들었어. 누락된 데이터나 비정상 값이 튀어나오면 무지성으로 돌아가는 게 아니라 딱 멈추도록 예외 처리를 걸었지.
def validate_backtest_data(data):
if data is None or len(data) == 0:
raise ValueError("백테스트 데이터가 없습니다.")
if not all(column in data.columns for column in ["date", "open", "high", "low", "close"]):
raise ValueError("필수 컬럼이 누락되었습니다.")
② 리포트 출력 개선 백테스트 결과를 터미널에 중구난방으로 뿌리기 전에, 요약 객체로 깔끔하게 정리해서 나중에도 재사용하기 쉽게 수정했어. 내가 젤 중요하게 보는 max_drawdown(MDD)도 한눈에 볼 수 있게 말이야.
def summarize_results(results):
return {
"total_return": results.total_return,
"max_drawdown": results.max_drawdown,
"win_rate": results.win_rate,
}
③ 예외 처리 강화 돌아가다가 예상치 못한 입력이 들어오면 어디서 터졌는지 명확한 메시지를 뱉고 안전하게 종료되도록 락을 걸었어.
try:
run_backtest(config)
except Exception as e:
logger.error(f"백테스트 실패: {e}")
raise
3. main.py 수정 내용: 깔끔한 실행 흐름과 모듈화
메인 파일은 지저분하면 안 돼. 딱 필요한 기능만 실행하도록 교통정리를 해줬어.
① 설정 로딩 구조 개선 보안과 설정 관리를 위해 YAML이나 JSON 설정 파일을 파싱하는 부분을 아예 밖으로 분리했어. 덕분에 main.py가 훨씬 깔끔해졌지.
def load_config(path):
with open(path, "r", encoding="utf-8") as f:
return yaml.safe_load(f)
② 실행 흐름 모듈화 기존에 main() 안에 때려 박혀 있던 로직들을 기능별 함수로 분리했어. 이제 main.py는 봇의 실행 진입점 역할에만 충실하게 된 거지.
def main():
config = load_config("config.yml")
setup_logging(config["logging"])
execute_backtest(config["backtest"])
③ 종료 처리 정리 (핵심!) 봇이 멈출 때 자원 정리를 확실히 하고 로그를 남기도록 했어. 실패하더라도 꼬이는 일 없이 안전하게 프로세스가 죽도록 구성한 게 포인트야.
if __name__ == "__main__":
try:
main()
except Exception as e:
logger.exception("프로그램 실행 중 오류 발생")
sys.exit(1)
[여기에 이미지 삽입: 깔끔해진 main.py 실행 흐름 및 구조 캡처]
4. 적용 결과 및 마무리
결과는 대만족이야.
- BACKTESTING 모듈이 억까(오류) 없이 훨씬 안정적으로 돌아가.
- main.py는 코드가 간결해져서 나중에 다른 전략을 추가할 때 유지보수하기가 너무 쉬워졌어.
- 무엇보다 에러가 났을 때 로그가 명확하게 찍히니 원인 추적하기가 꿀이야.
내가 코딩 고수가 아니더라도, 이렇게 뼈대를 잡고 Gemini Code Assist 같은 AI 툴한테 "이 부분 예외 처리 좀 해줘", "이거 함수로 분리해서 깔끔하게 다듬어줘"라고 명령만 하면 전문가 수준의 코드가 뚝딱 나와.
진짜 코딩의 장벽이 무너진 시대라는 게 실감이 난다. 다들 쫄지 말고 AI 어시스턴트 등에 업고 너만의 무적의 봇을 단단하게 만들어보길 바라!
5. 코드 실행화면
맨왼쪽이 기존 auto trading, 오른쪽 2개 (하나는 비트코인, 다른하나는 이더리움) 가 gemini code assist로 수정한 code 동작 상황이야. 오른쪽이 좀 더 직관적으로 메시지가 출력되고, 통신에러시 매수/매도도 제한하는 알고리즘이 추가됬지
그리고 log파일도 csv파일로 뱉어서, 나중에 매수/매도 data를 정리하기도 훨씬 쉽게 바꿨어!

'Coding' 카테고리의 다른 글
| Vibe Coding - Grid Backtesting 만들기 feat. Gemini Code Assist (0) | 2026.05.25 |
|---|---|
| Python ② - dotenv?? feat. Vibe Coding (0) | 2026.05.23 |
| Vibe Coding - Upbit Autotrading feat Windsurf (0) | 2026.05.22 |
| Windsurf 시작하기-클로드코드의 대안?? (0) | 2026.05.17 |
| Python① - Display 언어 설정하기@VS Code (0) | 2026.05.08 |