재테크 A2Z

업비트 자동매매 봇 만들기 (2) 백테스트 분석 및 수익률 시각화 + HTML 리포트 자동 생성 본문

코딩 & 파이썬

업비트 자동매매 봇 만들기 (2) 백테스트 분석 및 수익률 시각화 + HTML 리포트 자동 생성

a2ztec 2025. 5. 24. 16:26

지난 포스팅에서 자동매매 루프와 시그널 로그 기록을 구현한 데 이어, 이번에는 백테스트 로그를 기반으로 전략 성과를 분석하고 HTML 리포트를 자동 생성하는 방법을 정리합니다.

✅ 1. 로그 구조 요약

backtest/backtest_*.csv 파일에는 다음과 같은 형식으로 로그가 저장됩니다:

컬럼명설명

time 시그널 발생 시각
ticker 종목 코드 (KRW-BTC 등)
strategy 전략 이름
signal buy 또는 sell
price 시그널 발생 당시 가격

✅ 2. 백테스트 분석 코드 (analyze_backtest.py)

def load_log(strategy_name):
    file_path = f"backtest/backtest_{strategy_name}.csv"
    df = pd.read_csv(file_path, names=["time", "ticker", "strategy", "signal", "price"])
    df["time"] = pd.to_datetime(df["time"])
    return df

✅ 3. 전략별 누적 수익률 시각화

def compare_strategies(strategies):
    for strategy in strategies:
        df = load_log(strategy)
        trades = calculate_profit(df)
        plt.plot(trades["sell_time"], trades["cumulative"], label=strategy)
    plt.legend()
    plt.show()

✅ 4. HTML 리포트 자동 생성 (generate_html_report.py)

from jinja2 import Environment, FileSystemLoader

def generate_report(strategy):
    ...
    env = Environment(loader=FileSystemLoader("."))
    template = env.get_template("report_template.html")
    output = template.render(...)
    with open(f"report_{strategy}.html", "w") as f:
        f.write(output)

✅ 5. HTML 템플릿 예시 (report_template.html)

<html>
<head><meta charset="utf-8"></head>
<body>
  <h1>{{ strategy }} 전략 리포트</h1>
  <p>누적 수익률: {{ cumulative_return }}%</p>
  <table>
    <tr><th>매수가</th><th>매도가</th><th>수익률</th></tr>
    {% for row in trades %}
    <tr><td>{{ row.buy }}</td><td>{{ row.sell }}</td><td>{{ row.profit }}</td></tr>
    {% endfor %}
  </table>
</body>
</html>

✅ 6. 실행 예시

# 전략별 분석
poetry run python backtest/analyze_backtest.py

# HTML 리포트 생성
poetry run python backtest/generate_html_report.py

📌 마무리

이제 각 전략의 수익률과 시그널 발생 로그를 시각화하고, HTML로 자동 저장하는 백테스트 분석 자동화 환경이 구축되었습니다.
다음 포스팅에서는 수익률 기반 리밸런싱 전략과 텔레그램 자동 보고서를 구현할 예정입니다.