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

浙公网安备 33010602011771号