C# 实战:基础回测1.0

一.主要流程
数据→策略→成交→资金变化
二.核心代码
1.读取历史数据

var bars = LoadBars("data.csv");

private static List<Bar> LoadBars(string path)
{
    return File.ReadAllLines(path)
        .Skip(1)
        .Select(line =>
        {
            var parts = line.Split(',');
            return new Bar
            {
                Time = DateTime.Parse(parts[0]),
                Close = decimal.Parse(parts[1])
            };
        })
        .ToList();
}

2.初始化账户

var account = new Account
{
    Cash = 100_000m,
    Position = 0,
};
int maPeriod = 15;
var equityCurve = new List<decimal>();

3.回测主循环

  for (int i = 0; i < bars.Count; i++)
  {
      var bar = bars[i];
      account.LastPrice = bar.Close;
      var ma = CalculateMA(bars, i, maPeriod);
      if (ma==0)
      {
          equityCurve.Add(account.TotalValue);
          continue;
      }
      //策略逻辑:收盘价>MA:全仓买入
      if (bar.Close > ma && account.Position == 0)
      {
          account.Position = account.Cash / bar.Close;
          account.Cash = 0;
      }
      //收盘价<MA:清仓卖出
      else if (bar.Close < ma && account.Position > 0) 
      {
          account.Cash = account.Position * bar.Close;
          account.Position = 0;
      }
      equityCurve.Add(account.TotalValue);
  }
 private static decimal CalculateMA(List<Bar> bars, int i, int maPeriod)
 {
     if (i < maPeriod)
         return 0;
     return bars.Skip(i-maPeriod).Take(maPeriod).Average(b => b.Close);
 }

4.输出结果

 Console.WriteLine("回测结束");
 Console.WriteLine($"最终资金:{account.TotalValue:F2}");
 Console.WriteLine($"收益率:{(account.TotalValue/100_000m-1)*100:F2}%");
 File.WriteAllLines("equity.csv",equityCurve.Select(s=>s.ToString("F2")));
 Console.WriteLine("资金曲线已输出到 equity.csv");

三.源码下载 https://github.com/doujun1988/personal-quantitative-trading.git

posted @ 2026-01-17 17:58  十一点起床  阅读(0)  评论(0)    收藏  举报