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

本文是量化策略解析系列的第8篇,本系列的内容为各种量化策略的思路和实现代码,系列连载见:

量化策略解析系列—连载
在上篇文章《双剑合璧:双均线结合通道突破择时策略(上)》中,我们介绍了双均线结合通道突破择时并动态止损的策略思路。本文以沪深300指数为例,介绍如何用Python实现这个这个策略。由于上篇文章介绍的策略涉及比较多的参数,而过多的参数一来增加了策略调优的难度,二来也容易过拟合。因此本文对策略参数进行了精简,并使用 Pandas TA 库来计算相关指标,以减少代码量。
一、获取基础数据

  1. 导入需要的库
#导入需要使用的库

import akshare as ak
import pandas as pd
import numpy as np
import pandas_ta as ta

#在matplotlib绘图中显示中文和负号

import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams[‘font.family’] = ‘STKAITI’ # 中文字体’STKAITI’
plt.rcParams[‘axes.unicode_minus’] = False # 解决坐标轴负数的负号显示问题

#关闭警告信息

import warnings
warnings.filterwarnings(‘ignore’)

  1. 从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.date
price_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日的行情数据,并将日期设置为索引。

  1. 计算每日的收益率
#计算每日的收益率

price_df[‘returns’] = price_df[‘close’].pct_change().shift(-1).fillna(0)
数据格式如下:

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


二、构建双均线结合通道突破择时并动态止损的策略

  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 支持二十余种移动平均线,详细介绍可见后附文章《均线解密:如何有效利用移动平均线》。

  1. 计算通道
    通道是价格的波动范围,通常包括上轨、中轨和下轨。通道有多种,本文以布林带为例。
#计算布林带

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个标准差。
除了布林带外,常见的通道还有肯特纳通道、唐奇安通道、霍尔特-温特通道和加速带等,具体计算方法可以参见后附文章《通道突破择时交易策略详解》。

  1. 计算均线和通道结合的择时信号
    均线择时和通道择时都可能遇到假信号,本策略将均线信号和通道突破信号相结合,增加信号的可靠性。策略的择时信号为:当短均线位于长均线上方,且价格突破通道上轨时开仓;当短均线位于长均线下方,且价格跌破通道下轨时清仓。需要注意的时,双重确认虽然能增加信号的可靠性,但也牺牲了部分交易机会。
#计算择时信号
#开仓信号:当短均线位于长均线上方,并且价格突破了通道上轨时开仓
#清仓信号:当短均线位于长均线下方,并且价格突破了通道下轨时清仓

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替换为NA
timing_df = timing_df.fillna(method=’ffill’).fillna(0) # 使用前值填充NA
timing_df[timing_df<=0] = 0
timing_df[‘不择时’] = 1.
上述代码中timing_df用于保存择时信号,’择时’列的值为 1(开仓)和 0(清仓)。另外还有一个’不择时’列,值均为1。

  1. 动态止损
    动态止损指开仓后如果发现趋势判断错误,则进行止损。止损后如果趋势恢复,则重新进场。
#设定止损触发价为通道中轨

price_df[‘stop_price’] = channel[middle]

#如果收盘价低于止损触发价,则清仓止损

timing_df[‘择时’] = ((timing_df[‘择时’] == 1) & (price_df[‘close’] > price_df[‘stop_price’])) * 1.
上述代码将通道的中轨设置为止损触发价,如果开仓后(即’择时’列的值为1)价格跌破中轨,则止损清仓(将择时信号设为0),如果价格恢复到通道中轨之上,则重新开仓。

  1. 计算策略的择时收益
#计算择时和不择时的每日收益率

timing_ret = timing_df.mul(price_df[‘returns’], axis=0)

3计算累计收益率

cumul_ret = (1 + timing_ret.fillna(0)).cumprod() – 1.
上述代码先将日收益和择时信号相乘,如果择时信号为1,则保留该日收益;如果择时信号为0,则该日收益为0。然后计算累计收益。关于各种收益的计算,可以参看后附的文章《一文讲清7种收益率的python实现》。

  1. 可视化输出择时效果
#可视化输出

cumul_ret.plot(figsize=(10, 6), title=’双均线结合通道突破择时和动态止损策略’)
结果如下:

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


从上图可以看出,该择时策略取得了一定的效果,在提高收益的同时降低了回撤。
三、策略调优
我们可以从以下几个方面对策略进行调优:

  1. 调整均线的类型和参数
    本例中用了简单移动平均来计算均线,我们还可以使用其他的均线类型;此外还可以调整均线的长周期和短周期,来观察策略效果。
  2. 调整通道的类型和参数
    我们可以尝试更换其他类型的通道,或调整通道的参数。
  3. 调整止损触发价
    本例中使用通道中轨作为止损触发价,我们还可以设定其他的止损触发价,比如用均线作为止损触发价。
    通过调优,我们可能会获得更好的择时效果。借助 Pandas TA 库,很容易就能修改相关的代码。
    相关文章:


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

(0)
爱吃肉的小猫的头像爱吃肉的小猫
上一篇 2024 年 6 月 19 日 上午11:23
下一篇 2024 年 6 月 19 日 上午11:56

相关推荐

发表回复

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