📘 영웅문4 OpenAPI + C# 완전 정복 - 5단계: 백테스트 + 전략 수익률 시각화

반응형

OpenAPI + C# 완전 정복 - 5단계: 백테스트 + 전략 수익률 시각화

✅ 왜 백테스트가 중요한가요?

  • 자동매매 전략이 실제 수익을 낼 수 있는지 확인하려면,
    과거 데이터를 기반으로 전략을 시뮬레이션해봐야 합니다.
  • 수익률, 승률, MDD(최대 낙폭) 등을 분석하여 전략의 유효성을 판단합니다.

🛠️ STEP 1. 과거 데이터 가져오기 (opt10081)

🔹 일봉 차트 요청 (TR: opt10081)

C#

private void RequestChartData(string code)
{
    axKHOpenAPI1.SetInputValue("종목코드", code);
    axKHOpenAPI1.SetInputValue("기준일자", "20240411"); // 오늘 기준
    axKHOpenAPI1.SetInputValue("수정주가구분", "1");
    axKHOpenAPI1.CommRqData("일봉데이터", "opt10081", 0, "9000");
}

🔹 응답 처리 이벤트 구현

C#

private void axKHOpenAPI1_OnReceiveTrData(object sender, _DKHOpenAPIEvents_OnReceiveTrDataEvent e)
{
    if (e.sRQName == "일봉데이터")
    {
        for (int i = 0; i < 100; i++)
        {
            string date = axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, i, "일자").Trim();
            string open = axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, i, "시가").Trim();
            string high = axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, i, "고가").Trim();
            string low = axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, i, "저가").Trim();
            string close = axKHOpenAPI1.GetCommData(e.sTrCode, e.sRQName, i, "현재가").Trim();

            listBox1.Items.Add($"{date}: {close}원");
            // 백테스트용 데이터 리스트로 저장 가능
        }
    }
}

📈 STEP 2. 간단한 전략 예제: 이동평균선 (MA)

C#

public class CandleData
{
    public DateTime Date;
    public double Close;
    public double MA5;
    public double MA20;
    public bool Signal;
}

🔸  MA5와 MA20을 계산하고, 골든크로스 시 매수, 데드크로스 시 매도

C#

for (int i = 20; i < candles.Count; i++)
{
    var c = candles[i];
    c.MA5 = candles.Skip(i - 4).Take(5).Average(x => x.Close);
    c.MA20 = candles.Skip(i - 19).Take(20).Average(x => x.Close);

    if (candles[i - 1].MA5 < candles[i - 1].MA20 && c.MA5 > c.MA20)
        c.Signal = true; // 골든크로스 매수 시그널
}

💹 STEP 3. 수익률 계산

C#

double capital = 1000000;
double position = 0;
double entryPrice = 0;

foreach (var candle in candles)
{
    if (candle.Signal && position == 0)
    {
        entryPrice = candle.Close;
        position = capital / entryPrice;
    }
    else if (!candle.Signal && position > 0)
    {
        capital = position * candle.Close;
        position = 0;
    }
}

🔸 최종 수익률 출력

C#

double returnRate = (capital - 1000000) / 1000000 * 100;
Console.WriteLine($"최종 수익률: {returnRate:F2}%");

📊 STEP 4. 수익률 시각화 (ZedGraph 사용)

🔹 NuGet으로 ZedGraph 설치

mathematica

Install-Package ZedGraph

🔹 간단한 수익률 라인차트 예제

C#

GraphPane pane = zedGraphControl1.GraphPane;
pane.Title.Text = "전략 누적 수익률";
pane.XAxis.Title.Text = "일자";
pane.YAxis.Title.Text = "자산";

PointPairList list = new PointPairList();
for (int i = 0; i < equityCurve.Count; i++)
{
    list.Add(i, equityCurve[i]);
}

LineItem curve = pane.AddCurve("수익률", list, Color.Blue, SymbolType.Circle);
zedGraphControl1.AxisChange();
zedGraphControl1.Invalidate();

📷 전략 수익률 시각화 예시

전략 수익률 시각화 예시


✅ 전체 구조 요약

단계 설명
과거 데이터 수집 opt10081으로 일봉 100개 가져오기
전략 시뮬레이션 MA5 / MA20 골든크로스 기반
수익률 계산 자본 변화 추적
시각화 ZedGraph 또는 Chart 컨트롤
반응형