开发自己的量化交易系统,5年一个亿(四)------数据回测编写

386 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天,点击查看活动详情

前言

前面咱们整合了股票数据,方便我们获取各种股票数据

image.png 接下来我们就尝试各种比较流行的策略, 例如macd,kdj等策略,进行不断的回测数据,然后找到各种回测指标相对较高的策略

数据回测

整合信号

我们才开始实现的信号是比较简单的,每次都是全仓买入,全仓卖出,所以我们买入了以后在卖出之前不能再出现买入信号,卖出同理

痛点

因为有假期,长假等原因,所以在我买入后,有可能还没有卖出,就又要开始买入了

# 整合信号
# 只留下buy_signal为1,sell_signal为-1的日期
data = data.loc[(data['buy_signal'] != 0) | (data['sell_signal'] != 0)]
# buy_signal 为买入信号,设置为1,如果当前买入信号为1并且前一个买入信号也为1,那么设置当前买入信号为零
data.loc[(data['buy_signal'] == 1) & (data['buy_signal'].shift(1) == 1), 'buy_signal'] = 0
# sell_signal 为卖出信号,设置为-1,如果当前卖出信号为-1并且前一个卖出信号也为-1,那么设置当前卖出信号为零
data.loc[(data['sell_signal'] == -1) & (data['sell_signal'].shift(1) == -1), 'sell_signal'] = 0
# signal
data_copy = data.copy();
data_copy.loc[:, 'signal'] = data_copy['buy_signal'] + data_copy['sell_signal']
return data_copy

我们以周期策略,每周的买入卖出进行测试

def week_period_strategy(code, start_time, end_time=None):
    # 首先获取股票数据
    data = st.get_csv_price(code, start_time, end_time);
    # 每周四买入,注意weekday的值为0~6
    data['buy_signal'] = np.where(data.index.weekday == 3, 1, 0);
    # 每周二卖出
    data['sell_signal'] = np.where(data.index.weekday == 1, -1, 0);
    data = bs.compose_signal(data);
    print(data);

然后测试如下代码

code = '000001';
data = week.week_period_strategy(code, '2022-10-20');
print(data);

image.png

good没有问题,接下来我们计算收益率

收益率函数如下

def calculate_profit_pct(data):
    # 计算单次收益率:开仓、平仓(开仓的全部股数)
    # profit 利润
    # percent 百分比
    # 下面这种写法会引起settingWithCopyWarning, 因为你修改数据,会影响原始数据
    # # 只留下有交易信号的数据 筛选
    # data = data[data['signal'] != 0];
    # # 计算收益率  (市价-成本价)/成本价
    # data['profit_pct'] = (data['close']-data['close'].shift(1))/data['close'].shift(1) * 100
    # 修改以后
    data['profit_pct'] = data.loc[data['signal'] != 0, 'close'].pct_change()
    # 获得每一次平仓的收益
    data = data[data['signal'] == -1]
    return data

image.png

计算累计收益率

累计收益率函数如下

def calculate_cum_prof(data):
    """
    计算累计收益率 1*(1+3%)
    :param data: dataframe
    :return:
    """
    data['cum_profit'] = pd.DataFrame((1 + data['profit_pct'])).cumprod() - 1
    return data

为了方便查看累计收益率,我们封装chart来查看

def show_chart(data, code):
    data.plot();
    plt.title(code);
    plt.show();

最后的代码

def week_period_strategy(code, start_time, end_time=None):
    # 首先获取股票数据
    data = st.get_csv_price(code, start_time, end_time);
    # 每周四买入,注意weekday的值为0~6
    data['buy_signal'] = np.where(data.index.weekday == 3, 1, 0);
    # 每周二卖出
    data['sell_signal'] = np.where(data.index.weekday == 1, -1, 0);
    data = bs.compose_signal(data);
    data = bs.calculate_profit_pct(data);
    data = bs.calculate_cum_prof(data)  # 计算累计收益率
    data['cum_profit'] = data['cum_profit']*100;
    bs.show_chart(data[['cum_profit']], code);

此图就是我们使用周线投资策略的自2022-10-20到现在的收益率,收益率好高呀,真的假的

我们看一下同花顺对比一下

image.png

还是比较符合的,good