量化策略08—双剑合璧:双均线结合通道突破择时策略(下)

在上篇文章《双剑合璧:双均线结合通道突破择时策略(上)》中,我们介绍了双均线结合通道突破择时并动态止损的策略思路。本文以沪深300指数为例,介绍如何用Python实现这个这个策略。由于上篇文章介绍的策略涉及比较多的参数,而过多的参数一来增加了策略调优的难度,二来也容易过拟合。因此本文对策略参数进行了精简,并使用 Pandas TA 库来计算相关指标,以减少代码量。
一、获取基础数据
1. 导入需要的库
# 导入需要使用的库import akshare as akimport pandas as pdimport numpy as npimport pandas_ta as ta# 在matplotlib绘图中显示中文和负号import matplotlib.pyplot as pltimport matplotlib as mplmpl.rcParams['font.family'] = 'STKAITI' # 中文字体'STKAITI'plt.rcParams['axes.unicode_minus'] = False   # 解决坐标轴负数的负号显示问题# 关闭警告信息import warningswarnings.filterwarnings('ignore')
2. 从AKShare数据源获取沪深300指数的数据
关于AKShare的使用,可以参看后附的文章《如何用AKShare获取金融数据》。AKShare的接口有时会有变动,如果获取数据出错请参考AKShare的官网解决。
# 获取指数数据index_code = 'sh000300'start_date = pd.to_datetime('2014-01-01')end_date = pd.to_datetime('2023-12-31')price_df = ak.stock_zh_index_daily(symbol=index_code)price_df['date'] = pd.to_datetime(price_df['date']).dt.dateprice_df = price_df[(price_df['date']>=start_date) & (price_df['date']<=end_date)]price_df = price_df.sort_values('date').set_index('date')
上述代码从AKShare数据源获取沪深300指数2014年1月1日至2023年12月31日的行情数据,并将日期设置为索引。
3. 计算每日的收益率
# 计算每日的收益率price_df['returns'] = price_df['close'].pct_change().shift(-1).fillna(0)
数据格式如下:
图片
二、构建双均线结合通道突破择时并动态止损的策略
1. 计算双均线
我们设置长(慢)短(快)两条均线。当快均线位于慢均线上方时,说明可能处于上升趋势;当快均线位于慢均线下方时,说明可能处于下降趋势。
# 计算长短双均线值FastWindow = 9  # 快速均线窗口长度SlowWindow = 2 * FastWindow  # 慢速均线窗口长度price_df['ma_s'] = ta.sma(price_df['close'], length=FastWindow)price_df['ma_l'] = ta.sma(price_df['close'], length=SlowWindow)
上述代码将快均线的计算窗口设为9个交易日,为了减少参数的个数,将慢均线的计算窗口设为快均线的2倍。接着调用 Pandas TA 来计算简单移动平均线(SMA)。关于 Pandas TA 库的使用,可以参看后附文章《量化宝藏工具箱:技术指标库 Pandas TA 教程》。Pandas TA 支持二十余种移动平均线,详细介绍可见后附文章《均线解密:如何有效利用移动平均线》。
2. 计算通道
通道是价格的波动范围,通常包括上轨、中轨和下轨。通道有多种,本文以布林带为例。
# 计算布林带std = 2.0  # 上下轨的标准差倍数channel = ta.bbands(price_df['close'], length=SlowWindow, std=std)up = f'BBU_{SlowWindow}_{std}'  # 通道上轨down = f'BBL_{SlowWindow}_{std}'  # 通道下轨middle = f'BBM_{SlowWindow}_{std}'  # 通道中轨
price_df[['up_channel','down_channel']] = channel[[up, down]]
上述代码调用 Pandas TA 库的bbands()函数计算布林带,参数 length 为计算中轨的均线周期,本例中跟慢均线的窗口SlowWindow一致;参数 std 为通道宽度,本例取值2.0,表示通道的上轨和下轨距离中轨都是2个标准差。
除了布林带外,常见的通道还有肯特纳通道、唐奇安通道、霍尔特-温特通道和加速带等,具体计算方法可以参见后附文章《通道突破择时交易策略详解》。
3. 计算均线和通道结合的择时信号
均线择时和通道择时都可能遇到假信号,本策略将均线信号和通道突破信号相结合,增加信号的可靠性。策略的择时信号为:当短均线位于长均线上方,且价格突破通道上轨时开仓;当短均线位于长均线下方,且价格跌破通道下轨时清仓。需要注意的时,双重确认虽然能增加信号的可靠性,但也牺牲了部分交易机会。
# 计算择时信号# 开仓信号:当短均线位于长均线上方,并且价格突破了通道上轨时开仓# 清仓信号:当短均线位于长均线下方,并且价格突破了通道下轨时清仓timing_df = pd.DataFrame()timing_df['择时'] = ((price_df['ma_s']>price_df['ma_l']) & (price_df['close']>price_df['up_channel'])) * 1. + \                    ((price_df['ma_s']<price_df['ma_l']) & (price_df['close']<price_df['down_channel'])) * -1.timing_df = timing_df.replace(0, np.nan)  # 先将0替换为NAtiming_df = timing_df.fillna(method='ffill').fillna(0)  # 使用前值填充NAtiming_df[timing_df<=0] = 0timing_df['不择时'] = 1.
上述代码中timing_df用于保存择时信号,’择时’列的值为 1(开仓)和 0(清仓)。另外还有一个’不择时’列,值均为1。
4. 动态止损
动态止损指开仓后如果发现趋势判断错误,则进行止损。止损后如果趋势恢复,则重新进场。
# 设定止损触发价为通道中轨price_df['stop_price'] = channel[middle]# 如果收盘价低于止损触发价,则清仓止损timing_df['择时'] = ((timing_df['择时'] == 1) & (price_df['close'] > price_df['stop_price'])) * 1.
上述代码将通道的中轨设置为止损触发价,如果开仓后(即’择时’列的值为1)价格跌破中轨,则止损清仓(将择时信号设为0),如果价格恢复到通道中轨之上,则重新开仓。
5. 计算策略的择时收益
# 计算择时和不择时的每日收益率timing_ret = timing_df.mul(price_df['returns'], axis=0)# 计算累计收益率cumul_ret = (1 + timing_ret.fillna(0)).cumprod() - 1.
上述代码先将日收益和择时信号相乘,如果择时信号为1,则保留该日收益;如果择时信号为0,则该日收益为0。然后计算累计收益。关于各种收益的计算,可以参看后附的文章《一文讲清7种收益率的python实现》。
6. 可视化输出择时效果
# 可视化输出cumul_ret.plot(figsize=(10, 6), title='双均线结合通道突破择时和动态止损策略')
结果如下:
图片
从上图可以看出,该择时策略取得了一定的效果,在提高收益的同时降低了回撤。
三、策略调优
我们可以从以下几个方面对策略进行调优:
1. 调整均线的类型和参数
本例中用了简单移动平均来计算均线,我们还可以使用其他的均线类型;此外还可以调整均线的长周期和短周期,来观察策略效果。
2. 调整通道的类型和参数
我们可以尝试更换其他类型的通道,或调整通道的参数。
3. 调整止损触发价
本例中使用通道中轨作为止损触发价,我们还可以设定其他的止损触发价,比如用均线作为止损触发价。
通过调优,我们可能会获得更好的择时效果。借助 Pandas TA 库,很容易就能修改相关的代码。

相关文章:

量化策略解析系列—连载

量化投资入门系列—连载

如何用AKShare获取金融数据
量化宝藏工具箱:技术指标库 Pandas TA 教程
均线解密:如何有效利用移动平均线

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/105997
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 5天前
下一篇 5天前

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注