量化策略—择时新思路:波动率与换手率中的牛熊密码(下)

量化投资学
50705-23 10:09

作者:量化投资学

题图:量化投资学微信公众号


在上一篇文章《择时新思路:波动率与换手率中的牛熊密码(上)》中,我们介绍了用波动率和换手率构建牛熊指标进行择时的思路。本文将用一个具体的例子说明如何用Python实现牛熊指标择时。

本文以沪深300指数为例,用沪深300指数的波动率和换手率计算牛熊指标,然后对沪深300指数进行择时交易。

一、获取基础数据

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')

2. 从AKShare数据源获取沪深300指数的数据

关于AKShare的使用,可以参看后附的文章《如何用AKShare获取金融数据》。AKShare的接口有时会有变动,如果获取数据出错请参考AKShare的官网解决。

# 获取指数数据
index_code = '000300'
start_date = pd.to_datetime('2010-01-01')
end_date = pd.to_datetime('2023-12-31')
price_df = ak.index_zh_a_hist(symbol=index_code, period="daily", start_date=start_date, end_date=end_date)
price_df['日期'] = pd.to_datetime(price_df['日期'])
price_df = price_df.sort_values('日期').set_index('日期')

上述代码用AKShare的index_zh_a_hist接口获取沪深300指数2010年至2023年的行情数据。数据格式如下:

图片

我们将会用到收盘价和换手率这两列数据。

3. 计算每日的收益率

# 计算每日的涨跌幅(即日收益率)
price_df['涨跌幅'] = price_df['收盘'].pct_change().fillna(0)
# 将日收益率向上位移1位,用于计算策略收益,避免涉及未来数据
price_df['returns'] = price_df['涨跌幅'].shift(-1)

二、用波动率和换手率构建牛熊指标

牛熊指标 = 波动率 / 换手率
其中:
波动率:为某个时间段内股票指数日收益率的标准差
换手率:为同一时间段内股票指数日换手率的移动平均值

1. 计算波动率

# 计算滚动窗口的波动率
days = 244
price_df[f'波动率_{days}'] = price_df['涨跌幅'].rolling(days, min_periods=int(days/2)).std()

在《择时新思路:波动率与换手率中的牛熊密码(上)》中提到,较长周期的牛熊指标更能反映长期趋势。因此我们以一年(约244个交易日)为周期来计算牛熊指标。上述代码计算滚动244个交易日的波动率。

2. 计算换手率

# 计算移动平均的换手率
price_df[f'换手率_{days}'] = price_df['换手率'].rolling(days, min_periods=int(days/2)).mean()

上述代码计算换手率的移动平均值。移动平均的窗口跟波动率一致,都是244个交易日。

3. 计算牛熊指标

# 计算牛熊指标
price_df['牛熊指标'] = price_df[f'波动率_{days}'] / price_df[f'换手率_{days}']

4. 可视化指数跟牛熊指标的关系

# 可视化指数与牛熊指标的关系
fig, ax1 = plt.subplots(figsize = (10,6))
# 指数收盘价曲线
ax1.plot(price_df['收盘'], label='收盘价', color='r')
plt.legend(loc='upper left')
# 牛熊指标曲线
ax2 = ax1.twinx() 
ax2.plot(price_df['牛熊指标'], label='牛熊指标', color='b')
ax2.legend(loc = 'best')
ax1.set_title(f'指数{index_code}收盘价与牛熊指标')
plt.show()

结果如下:

图片

从上图可以看出牛熊指标的走势和指数呈现较为明显的负相关。

5. 计算牛熊指标和指数收盘价的相关系数

# 计算指数与牛熊指标的相关系数
corr = price_df['收盘'].corr(price_df['牛熊指标'])
print(f'指数{index_code}与牛熊指标的相关系数为:',corr)

牛熊指标与指数的相关系数为:-0.75,负相关较为显著。

三、用牛熊指标构建择时策略

根据上述分析我们知道牛熊指标与股票指数的走势呈现负相关性。当牛熊指标上升时,市场通常处于下跌状态;而当牛熊指标下降时,市场往往处于上涨状态。我们可以利用牛熊指标的这个特性进行择时:当牛熊指标下降时开仓,当牛熊指标上升时空仓。

在《择时新思路:波动率与换手率中的牛熊密码(上)》一文中介绍了用牛熊指标择时的方法有:斜率择时法、单均线择时法、双均线择时法、通道突破择时法等。本文以双均线择时法为例,具体方法如下:

1. 计算牛熊指标的长短两条均线

# 计算牛熊指标的双均线
days_s = 20  # 短均线天数
days_l = 60  # 长均线天数
price_df[f'牛熊指标_ma{days_s}'] = ta.sma(price_df['牛熊指标'], length=days_s)
price_df[f'牛熊指标_ma{days_l}'] = ta.sma(price_df['牛熊指标'], length=days_l)

上述代码用Pandas TA库计算牛熊指标的20日和60日的简单移动平均线。Pandas TA库的使用可以参见后附文章《量化宝藏工具箱:技术指标库 Pandas TA 教程》

2. 根据牛熊指标的长短均线计算择时信号

当牛熊指标的短均线位于长均线之下时,说明指标为下降趋势,由于指数与牛熊指标负相关,因此指数处于上涨的趋势,此时开仓;反之则清仓。

# 根据牛熊指标的长短均线计算择时信号
timing_df = pd.DataFrame()
timing_df['牛熊指标择时'] = ~(price_df[f'牛熊指标_ma{days_s}']>price_df[f'牛熊指标_ma{days_l}']) * 1.

上述代码中,开仓信号为1,清仓信号为0。

3. 作为比较,用双均线直接对指数择时

为了比较牛熊指标的择时效果,我们还用双均线直接对指数择时:当指数的短均线位于长均线之上时开仓,反之清仓。

# 计算指数的双均线
price_df[f'指数_ma{days_s}'] = ta.sma(price_df['收盘'], length=days_s)
price_df[f'指数_ma{days_l}'] = ta.sma(price_df['收盘'], length=days_l)
# 计算择时信号:当指数的短均线在长均线之上时开仓,反之清仓
timing_df['指数均线择时'] = (price_df[f'指数_ma{days_s}']>price_df[f'指数_ma{days_l}']) * 1.
timing_df['不择时'] = 1.

4. 计算策略的择时收益

# 计算择时和不择时的每日收益率
timing_ret = timing_df.mul(price_df['returns'], axis=0)
# 计算累计收益率
cumul_ret = (1 + timing_ret.fillna(0)).cumprod() - 1.

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

5. 可视化择时效果

# 可视化择时效果
cumul_ret.plot(figsize = (10,6))

结果如下:

图片

从上图可以看出,用双均线对牛熊指数进行择时的结果不仅比不择时好,也比直接用双均线对指数进行择时的效果要好。

四、策略调优的思路

用牛熊指标进行择时的策略,可以从这么几个方面进行调优:

1. 调整牛熊指标的计算参数。

本例采用了244个工作日的周期来计算牛熊指标,我们可以调整和优化这个参数。

2. 使用不同的均线和均线参数。

本例使用了牛熊指标20日和60日的简单移动平均线。我们还可以使用其他的均线以及均线参数。除了双均线择时方法,还可以尝试单均线择时方法。具体方法可以常见后附的文章《均线解密:如何有效利用移动平均线》和《均线择时策略全攻略》。

3. 使用通道突破择时

除了使用均线择时,我们还可以使用通道突破择时:计算牛熊指标的通道值,当牛熊指标突破通道上轨时表明指标处于上涨趋势,此时指数就处于相反的下跌趋势,应该清仓;反之,当牛熊指标跌破通道下轨时,表明指数处于上涨趋势,应该开仓。具体方法可以参见后附文章《通道突破择时交易策略详解》。


版权声明:文章版权归原作者所有,部分文章由作者授权本平台发布,若有其他不妥之处的可与小编联系。

免责声明:
您在阅读本内容或附件时,即表明您已事先接受以下“免责声明”之所载条款:
1、本文内容源于作者对于所获取数据的研究分析,本网站对这些信息的准确性和完整性不作任何保证,对由于该等问题产生的一切责任,本网站概不承担;阅读与私募基金相关内容前,请确认您符合私募基金合格投资者条件。
2、文件中所提供的信息尽可能保证可靠、准确和完整,但并不保证报告所述信息的准确性和完整性;亦不能作为投资决策的依据,不能作为道义的、责任的和法律的依据或者凭证。
3、对于本文以及文件中所提供信息所导致的任何直接的或者间接的投资盈亏后果不承担任何责任;本文以及文件发送对象仅限持有相关产品的客户使用,未经授权,请勿对该材料复制或传播。侵删!
4、所有阅读并从本文相关链接中下载文件的行为,均视为当事人无异议接受上述免责条款,并主动放弃所有与本文和文件中所有相关人员的一切追诉权。

本篇来自以下专栏
0
好投汇
第一时间获取行业新鲜资讯和深度商业分析,请在微信公众账号中搜索「好投汇」,或用手机扫描左方二维码,即可获得好投汇每日精华内容推送和最优搜索体验,并参与编辑活动。

推荐阅读

0
0

评论

你来谈谈?
发表

联系我们

邮箱 :help@haotouxt.com
电话 :0592-5588692
地址 :福建省厦门市湖里区航空商务广场7号楼10F
好投汇微信订阅号
扫一扫
关注好投汇微信订阅号
Copyright © 2017-2024, All Rights Reserved 闽ICP备19018471号-6