特质波动率

  • “特质波动率之谜”的介绍
  • 特质波动率的度量方法
  • Python代码
  • 相关文章
  • 获取代码

“特质波动率之谜”的介绍

风险与收益一直是金融学中形影不离的两个概念。经典的CAPM模型,只考虑了系统性风险,认为股票预期收益率只与市场风险溢价有关。直到1972年,Jensen,Black和Scholes对传统金融学理论提出了不同的看法,认为非系统性风险与股票收益率是存在一定的相关关系,并首次提出了特质波动率的概念。Merton曾从供需的角度来解释这两者之间的关系,认为投资者会对系统风险和非系统风险都要求进行一定的风险补偿,而这一解释也被大家广泛地接受与认可。

一般来讲,我们都认为风险与收益应该是正相关,即风险越高,收益率越高。但在2006年,Ang等人却得出了不一样的结论,他们借助Fama-French三因子模型却发现特质波动率与预期收益率之间的关系变为负相关关系。目前尚未有公认的理论可以解释这种异象,因此引起了剧烈的争论,而这一异象也被称为“特质波动率之谜”。

特质波动率的度量方法

在特质波动率的度量方面,我利用Fama-French三因子模型进行计算
有关三因子模型的介绍与代码在之前的文章有所讲解,读者们可见文末链接

首先,通过三因子模型,得到每日的残差,即ε

然后,计算残差的波动率,即当月残差标准差乘以当月总交易天数。

这样就得到我们所要的特质波动率了。

Python代码

Python实现的过程中,我们只需要使用pandas、statsmodels.formula.api两个包即可完成:

import pandas as pd
import statsmodels.formula.api as smf

首先,读取数据,我从锐思数据库中,下载了创业板中2015-2019年所有股票每日收益率、无风险收益率以及创业板每日的三因子:

Factors = pd.read_excel("F:\\公众号\\图文素材\\特质波动率\\Data.xlsx", sheetname = 0, header = 0)
Return = pd.read_excel("F:\\公众号\\图文素材\\特质波动率\\Data.xlsx", sheetname = 1, header = 0)
NoRisk = pd.read_excel("F:\\公众号\\图文素材\\特质波动率\\Data.xlsx", sheetname = 2, header = 0)

为了后续筛选日期方便,我们需要将“日期”的数据类型更改为日期型:

Factors['Date'] = pd.to_datetime(Factors['Date'])
Return['Date'] = pd.to_datetime(Return['Date'])
NoRisk['Date'] = pd.to_datetime(NoRisk['Date'])

通过pd.merge()将数据进行合并:

Data = pd.merge(pd.merge(Factors, Return, on = 'Date'), NoRisk, on = 'Date')


参数说明:
pd.merge(left, right, how=‘inner’, on=None, left_on=None, right_on=None,
left_index=False, right_index=False, sort=True,
suffixes=(’_x’, ‘_y’), copy=True, indicator=False,
validate=None)
1、left: 拼接的左侧DataFrame对象
2、right: 拼接的右侧DataFrame对象
3、on: 要加入的列或索引级别名称。 必须在左侧和右侧DataFrame对象中找到。 如果未传递且left_index和right_index为False,则DataFrame中的列的交集将被推断为连接键。
4、left_on:左侧DataFrame中的列或索引级别用作键。 可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。
5、right_on: 左侧DataFrame中的列或索引级别用作键。 可以是列名,索引级名称,也可以是长度等于DataFrame长度的数组。
6、left_index: 如果为True,则使用左侧DataFrame中的索引(行标签)作为其连接键。 对于具有MultiIndex(分层)的DataFrame,级别数必须与右侧DataFrame中的连接键数相匹配。
7、right_index: 与left_index功能相似。
8、how: One of ‘left’, ‘right’, ‘outer’, ‘inner’. 默认inner。inner是取交集,outer取并集。比如left:[‘A’,‘B’,‘C’];right[’'A,‘C’,‘D’];inner取交集的话,left中出现的A会和right中出现的买一个A进行匹配拼接,如果没有是B,在right中没有匹配到,则会丢失。'outer’取并集,出现的A会进行一一匹配,没有同时出现的会将缺失的部分添加缺失值。
9、sort: 按字典顺序通过连接键对结果DataFrame进行排序。 默认为True,设置为False将在很多情况下显着提高性能。
10、suffixes: 用于重叠列的字符串后缀元组。 默认为(‘x’,’ y’)。
11、copy: 始终从传递的DataFrame对象复制数据(默认为True),即使不需要重建索引也是如此。
12、indicator: 将一列添加到名为_merge的输出DataFrame,其中包含有关每行源的信息。 _merge是分类类型,并且对于其合并键仅出现在“左”DataFrame中的观察值,取得值为left_only,对于其合并键仅出现在“右”DataFrame中的观察值为right_only,并且如果在两者中都找到观察点的合并键,则为left_only。

然后从日期中提取年份和月份:
Data[‘Year’] = Data[‘Date’].dt.year
Data[‘Month’] = Data[‘Date’].dt.month

我们创建一个函数,用于提取某只股票某月下的数据:

def get_month_data(data, code, year, month):month_data = data[(data.Stkcd == code) & (data.Year == year) & (data.Month == month)]
return month_data

接下来,我们计算一下300001这只股票在2019年12月份的特质波动率。
首先,我们获得这只股票当月的数据:

example = get_month_data(Data, 300001, 2019, 12)


统计当月交易总天数:

N = len(example)


建立回归模型,并计算残差:

model = smf.ols('Dretnd - Nrrdaydt ~ RiskPremium + SMB + HML', data = example).fit()
predict = model.params['Intercept'] + model.params['RiskPremium']*example['RiskPremium'] + model.params['SMB']*example['SMB'] + model.params['HML']*example['HML']
residual = example['Dretnd'] – predict


接着,计算得出特质波动率:

IV = residual.std(ddof=1) * N


参数说明:
pd.std(ddof = 1)
该函数是pandas所带的标准差计算方法,默认按照无偏估计进行计算,即ddof = 1,即n-ddof。

最后,我们可以用循环语句进行遍历计算,并创建一个DataFrame进行储存和导出:

特质波动率python相关推荐

  1. “特质波动率之谜”(Idiosyncratic Volatility),用Python计算特质波动率

    Hello,大家好,今天给大家介绍的是有关于"特质波动率"度量的相关内容.曾在写本科毕业论文时有所涉及,当时看了好多资料,发现它还有很多研究空间,并且由Ang所提出的"特 ...

  2. 复现东方证券研报--特质波动率因子研究

    最近发现特质波动率因子选股效果不错,于是按照东方证券研报的思路做了一些研究.研究发现该因子确实有显著的选股能力,并且在CAPM.Fama-French三因子.Carhart四因子.Fama-Frenc ...

  3. Python、MATLAB股票投资:ARIMA模型最优的选股、投资组合方案与预测

    全文链接:http://tecdat.cn/?p=31651 我们基于当前统计的股票数据为客户选择最优的选股方案和投资组合方案,以及预测股票价格未来一段时间的走向趋势以及波动程度,具有很大的实用价值. ...

  4. php股票波动率计算公式,因子选股系列:波动率因子的改进,异质波动率

    在多因子选股体系中,波动率作为常用的技术面因子,与股票收益率呈现显著的负相关关系.本文对波动率因子进行了深入的剖析,主要研究一般波动率的改进方式,试图提高波动率的选股能力.一般波动率是股票涨跌幅的标准 ...

  5. Python使用GARCH,EGARCH,GJR-GARCH模型和蒙特卡洛模拟进行股价预测

    全文下载链接:http://tecdat.cn/?p=20678 在本文中,预测股价已经受到了投资者,政府,企业和学者广泛的关注.然而,数据的非线性和非平稳性使得开发预测模型成为一项复杂而具有挑战性的 ...

  6. WinBUGS对多元随机波动率SV模型:贝叶斯估计与模型比较

    原文链接:http://tecdat.cn/?p=5312 在本文中,我们通过一个名为WinBUGS的免费贝叶斯软件,可以很容易地完成基于似然的多变量随机波动率(SV)模型的估计和比较(点击文末&qu ...

  7. 用Python代码自己写Python代码,竟如此简单

    用Python代码自己写Python代码,竟如此简单 Python作为一门功能强大且使用灵活的编程语言,可以应用于各种领域,具有"无所不能"的特质. Python甚至可以代替人,自 ...

  8. 波动率因子(Volatility factor)——投资组合分析(EAP.portfolio_analysis)

    实证资产定价(Empirical asset pricing)已经发布于Github和Pypi. 包的具体用法(Documentation)博主将会陆续在CSDN中详细介绍,也可以通过Pypi直接查看 ...

  9. R语言随机波动率(SV)模型、MCMC的Metropolis-Hastings算法金融应用:预测标准普尔SP500指数...

    原文链接:http://tecdat.cn/?p=23991 在这个例子中,我们考虑随机波动率模型 SV0 的应用,例如在金融领域. 统计模型 随机波动率模型定义如下 并为 其中 yt 是因变量,xt ...

最新文章

  1. debian下安装LNMP(三)
  2. 安装模块时提示Collecting package metadata (repodata.json): failed
  3. 在Linux系统下防火墙开放所需要访问的端口号
  4. wxWidgets:wxContextMenuEvent类用法
  5. 九度 1376 最近零子序列
  6. 构建高性能.NET应用之配置高可用IIS服务器-第三篇 IIS中三个核心组件的讲解(上)
  7. linux下各种小命令
  8. mysql正则表达式匹配非_MySQL的正则表达式
  9. 英伟达用GAN生成脑瘤图像,训练出的AI医生,准确率提高16%
  10. php fpm 报错,PHP-FPM安装报错解决
  11. 抓包工具Fiddler的安装与使用
  12. 数据库学习笔记【自学教程】—— 如何建立数据库
  13. stata15无法安装spost13命令包,报错:stacktrace not available如何解决?
  14. java解析excel日期格式_JAVApoi读取excel无法识别自定义格式年月日时分秒
  15. 一条命令解决macmnsvc.exe占用8081端口的问题
  16. 分享按钮-新浪微博开放平台
  17. 计算机内存不足提示栻框,【计算机】CIMS概论6.ppt
  18. 什么是ARM TCM内存
  19. 一体化低压伺服电机在注塑机械手上的应用
  20. 这是广告clearview ai用来将您的脸卖给警察的广告

热门文章

  1. Spartan-6的存储元件、多路复用器、快速先行进位逻辑、算术逻辑
  2. “讯推官”招募令:变现你的影响力
  3. 深入理解ES6笔记(九)JS的类(class)
  4. 基于MSM 的tomcat session 共享
  5. Spark和Hadoop,孰优孰劣?
  6. iOS开发-单例模式
  7. 趋势科技4月移动client病毒报告
  8. Dreamweaver 8的后台文件传输
  9. 手机息屏后停止_手机息屏还能这样玩?华为这几个隐藏小功能快学起来
  10. DFS、DTFT、DFT、 FFT的定义和区别