开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 17 天,点击查看活动详情
前言
前面咱们整合了股票数据,方便我们获取各种股票数据
接下来我们就尝试各种比较流行的策略, 例如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);
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
计算累计收益率
累计收益率函数如下
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到现在的收益率,收益率好高呀,真的假的
我们看一下同花顺对比一下
还是比较符合的,good