基于波动率熵的择时策略

论坛 期权论坛 期权     
BP量化服务平台   2019-9-7 09:25   4643   0
文章摘要
      本文主要探讨波动率熵作为一个指标在股票市场择时方面的应用。运用波动率熵指标进行择时,我们发现该策略能够成功避开2015年的股灾以及2018年的下跌趋势,说明该指标有一定的参考意义。但是该指标形成交易信号十分稀少(2010年-2018年只产生了18次交易信号),我们认为该指标可以作为一种市场的风格转换的参考指标来辅助投资决策。文章分为两个部分,前半部分主要是复现浙商证券研报《风格轮动与择时——一种“波动率熵”方法》。后半部分对研报的策略逻辑进行探讨和改进。

[h1]一、熵的概念[/h1]熵原本是一个热力学概念,是用来描述热力学系统混沌(无序)程度的度量。在 Shannon 建立信息论之后,上述的概念和理论得到了延伸与发展。作为衡量时间序列中新信息发生率的非线性动力学参数,熵在生物统计、工程故障诊断等科学领域得到了应用,算法也得到不断的发展。八十年代最常用的熵的算法是 K-S 熵及由它发展来的 E-R 熵。九十年代初, Pincus 提出的近似熵(Aproximate Entropy)主要是从衡量时间序列复杂性的角度来度量信号中产生新模式的概率大小。产生新模式的概率越大,序列的复杂性越大,相应的近似熵也越大。
样本熵(Sample Entropy)是由 Richman 和 Moornan 提出的一种新的时间序列复杂性的度量方法。样本熵在算法上相对于近似熵算法的改进:相对于近似熵而言,样本熵计算的则是和的对数。样本熵旨在降低近似熵的误差,与已知的随机部分有更加紧密的一致性。与近似熵对比, 样本熵有两大优势:第一,样本熵不包含自身数据段的比较,它是条件概率的负平均自然对数的精确值,因此样本熵的计算不依赖数据长度,这对金融分析来说尤为重要,可以试验不同的历史时间参数;第二,样本熵具有更好的一致性。即如一时间序列比另一时间序列有较高的值的话,那对于其他的样本熵参数值,也具有较高的值,提升了指标的可靠性。
算法表述如下:




[h1]二、研报策略逻辑[/h1]研报中的策略主要逻辑是:用国证风格指数大盘成长(399372),大盘价值(399373)分别来代替成长风格和价值风格的股票,并用上证综指(000001)来计算波动率熵。通过回归验证波动率熵的滞后一期对(价值-成长)组合(V-G)有着较强的预测作用。通过设定不同阈值的规则来买入 V-G 组合进行探索, 选择在波动率熵指标小于滞后 120天的波动率熵序列均值减去 1.5 倍标准差的时候买入 V-G 组合,持有固定N个交易日后平仓,再次进行买入判断,研报给这个策略命名为“波动率熵策略”。

首先我们载入策略需要的Python工具包。


  1. import pandas as pd
复制代码
  1. import numpy as np
复制代码
  1. import matplotlib.pyplot as plt
复制代码
  1. import statsmodels.api as sm
复制代码
  1. import warnings
复制代码
  1. warnings.filterwarnings('ignore')
复制代码
     然后我们读取相关指数的数据,由于国证指数从2010年1月4日启用,所以我们的数据时间区间为2010年1月4日至2019年2月14日。数据包括上证指数,沪深300,大盘成长以及大盘价值。
  1. data = pd.read_hdf('entropy.h5', key='indices')
复制代码
  1. data.index = pd.to_datetime(data.index)
复制代码
  1. #查看一下数据
复制代码
  1. data.head()
复制代码


  1. #计算各个指数,以及V-G组合的对数收益率
复制代码
  1. ret = np.log(data) - np.log(data).shift()
复制代码
  1. V_G = ret['399373'] - ret['399372']
复制代码
  1. vol_bench = ret['000001'].rolling(25).std().dropna()
复制代码
  1. # 查看一下V-G的图像
复制代码
  1. V_G.plot(figsize=(16,9))
复制代码


      下面我们计算上证指数的波动率熵,这里我们采用过去25个交易日的数据滚动计算上证指数(000001)的波动率,然后采用样本熵的计算方法来计算波动率熵。波动率熵计算函数定义如下:
  1. def SampEn_fast(U, m, r):
复制代码
  1.     def _phi(m):
复制代码
  1.         x = np.array([U[i:i+m] for i in range(N-m+1)])
复制代码
[code]        C = [np.sum(np.abs(xi - x).max(axis=1)
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:10
帖子:2
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP