本文分享的是量化投资中回测实现方法的最简单例子,该例子仅仅说明回测的原理实现,在实际的情况中,要比该例子更加复杂。
1,买入卖出信号构建
构建买入信号 signal=1,卖出信号 signal=0,其他为 NaN。
注意,这里假设都是全仓操作,连续的信号只有第一个是有实际的操作意义。即一旦第 1 个信号成交后,后面虽然仍有信号发出,但由于买入全仓,所以没有钱再买了。卖出同理。
2,信号转化为持股状态
构建持有 keep=1,空仓为 0,假设都是全仓操作,则 keep=signal。
# 由于假设都是全仓操作所以 signal=keep,即 1 代表买入持有,0 代表卖出空仓
test_kl['keep'] = test_kl['signal']
对 keep=NaN 的数据进行向下填充,即 NaN 都与其前面的元素保持一致。
# 将 keep 列中的 nan 使用向下填充的方式填充,结果使 keep 可以代表最终的交易持股状态
test_kl['keep'].fillna(method='ffill', inplace=True)
3,计算基准收益
这里的基准收益的概念是从第 1 天开始持有股票,到最后 1 天的每一天收益。其每一天收益的计算为:(当天收盘价 - 前一天收盘价)/ 前一天收盘价。
test_kl['benchmark_profit2'] =
test_kl['close'] / test_kl['close'].shift(1) - 1
test_kl['benchmark_profit'] =
np.log(test_kl['close'] / test_kl['close'].shift(1))
4,计算策略收益
策略收益即为持仓与否 * 基准收益。其中持仓与否只有 1 和 0 的数据,* 基准收益后就类似于创建了一个滤波器,自动过滤 0 的数据。
test_kl['trend_profit'] = test_kl['keep'] * test_kl['benchmark_profit']
5,可视化收益对比
将基准收益和策略收益逐日累加,并进行对比。
test_kl[['benchmark_profit','trend_profit']].cumsum().
plot(grid=True, figsize=14, 7));