本方案由 EasyQuant AI量化助手 提供。如有更多问题,直接用 EasyQuant AI量化助手 帮您快速解决量化交易编程难题。
问题背景
未来函数是导致“回测收益很好、实盘无法复现”的常见原因。策略在每一个时点只能使用当时已经确定的数据,不能借用未来 K 线的价格,也不能把未收盘 K 线的最终高低收当作已知信息。
策略逻辑
-
使用
Close[1]判断上一根已完成 K 线的状态。 -
使用当前与上一根均线的关系确认真正的交叉。
-
信号确认后,按照下一次可执行价格处理交易。
-
禁止使用负数索引引用未来数据。
TB简语言示例
Params
Numeric FastLength(5);
Numeric SlowLength(20);
Numeric Lots(1);
Vars
NumericSeries FastMA(0);
NumericSeries SlowMA(0);
BoolSeries LongSignal(false);
BoolSeries ExitSignal(false);
BoolSeries TrendWasDown(false);
BoolSeries TrendWasUp(false);
Begin
// 使用当前与过去已经形成的K线数据计算均线
FastMA = Average(Close, FastLength);
SlowMA = Average(Close, SlowLength);
// 上一根K线:短均线位于长均线下方
TrendWasDown = FastMA[1] <= SlowMA[1];
// 上一根K线:短均线位于长均线上方
TrendWasUp = FastMA[1] >= SlowMA[1];
// 当前上穿 + 上一根尚未上穿,确认金叉
LongSignal = FastMA > SlowMA
And TrendWasDown;
// 当前下穿 + 上一根尚未下穿,确认死叉
ExitSignal = FastMA < SlowMA
And TrendWasUp;
// 空仓时才根据信号开多
If MarketPosition = 0 And LongSignal Then
Begin
Buy(Lots, Open);
Commentary("均线金叉确认,按下一可执行价格开多");
End;
// 持仓时根据信号平仓
If MarketPosition > 0 And ExitSignal Then
Begin
Sell(0, Open);
Commentary("均线死叉确认,执行平多");
End;
// 以下写法不能用于真实策略:
// If Close[-1] > Close Then Buy(Lots, Open);
// 负数索引可能引用未来数据,会使回测结果失真。
End
注意事项
-
正数索引通常表示过去数据,例如
Close[1]是上一根 K 线。 -
负数索引可能引用未来数据,不能用于实盘交易信号。
-
即使不使用负数索引,也应注意当前 K 线是否已经收盘。
-
跨周期、跨品种和盘后数据都要检查时间是否已经对齐。
总结
避免未来函数的原则很简单:策略在任意时点,只能使用当时已知的信息。这个原则决定了回测结果是否具备实际参考价值。
本方案由 EasyQuant AI量化助手 提供。

167

被折叠的 条评论
为什么被折叠?



