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

Pypi: pip install --upgrade EAP

Github: GitHub - whyecofiliter/EAP: empirical asset pricing

根据CAPM和APT,投资者可以通过持有大量证券的多元化投资组合,创建对公司特定风险零敞口的投资组合。因此,特定于公司的风险并不需要风险溢价。这一点的实证含义是,企业特定风险应该与未来的股票收益率没有关系。然而,Merton(1987)提出市场均衡模型,放松了CAPM的假设,其主要应用是,在均衡状态下,企业特定风险被定价。具体而言,与公司特定风险相关的风险溢价为正。

Ang、Hodrick、Xing and Zhang(2006)对公司特定风险和预期股票收益之间的横截面关系进行了的全面研究,该研究发现特异波动率(idiosyncratic volatility)和未来股票收益之间存在强烈的负相关关系。

整体波动率

特异性波动率

RSE是

n是数据点的数量,k是回归估计的参数数量,回归模型为

计算期为12个月。在这个demo中,数据集从2000年1月开始,从CSMAR数据集中收集。警告:请勿将此演示中的数据集用于任何商业目的。

# %% set system path
import sys,ossys.path.append(os.path.abspath(".."))# %% import data
import pandas as pdmonth_return = pd.read_hdf('.\\data\\month_return.h5', key='month_return')
company_data = pd.read_hdf('.\\data\\last_filter_pe.h5', key='data')
trade_data = pd.read_hdf('.\\data\\mean_filter_trade.h5', key='data')
beta = pd.read_hdf('.\\data\\beta.h5', key='data')
risk_premium = pd.read_hdf('.\\data\\risk_premium.h5', key='data')

数据预处理

# %% data preprocessing
# forward the monthly return for each stock
# emrwd is the return including dividend
month_return['emrwd'] = month_return.groupby(['Stkcd'])['Mretwd'].shift(-1)
# emrnd is the return including no dividend
month_return['emrnd'] = month_return.groupby(['Stkcd'])['Mretnd'].shift(-1)
# select the A share stock
month_return = month_return[month_return['Markettype'].isin([1, 4, 16])]# % distinguish the stocks whose size is among the up 30% stocks in each month
def percentile(stocks) :return stocks >= stocks.quantile(q=.3)month_return['cap'] = month_return.groupby(['Trdmnt'])['Msmvttl'].apply(percentile)# merge data
data = month_return[['Stkcd', 'Trdmnt', 'Mretwd']]
data['Date_merge'] = pd.to_datetime(data['Trdmnt'])
risk_premium['Date_merge'] = risk_premium.index
data = pd.merge(data, risk_premium[['MKT', 'SMB', 'HML', 'Date_merge']], on=['Date_merge']).dropna()

构建代理变量

# %% construct proxy variable
import numpy as np
import statsmodels.api as smvolatility = pd.Series(index=data.index, dtype=float, name='volatility')
idiovolatility = pd.Series(index=data.index, dtype=float, name='idiovolatility')
for i in data.groupby('Stkcd'):row, col = np.shape(i[1])for j in range(row-12):volatility.loc[i[1].index[j+11]] = np.std(i[1].iloc[j:j+12, 2])model_idiovol = sm.OLS(i[1].iloc[j:j+12, 2], sm.add_constant(i[1].iloc[j:j+12, 4:7])).fit()idiovolatility.loc[i[1].index[j+11]] = np.std(model_idiovol.resid)return_company = pd.concat([data, volatility, idiovolatility, month_return[['cap', 'Msmvttl', 'Ndaytrd', 'emrwd']]], axis=1)

数据集#1:整体波动率。数据集#1的结果与文献不一致,即在单变量分析中,由于绝对t值小于2.3,差异收益不显著,且收益序列的顺序不一致。

在双变量分析中,由于绝对t值小于2.3,差异收益率不显著,这表明整体波动率不提供超额收益。

# %% construct test_data for bivariate analysis
# dataset 1
from portfolio_analysis import Bivariate, Univariate
import numpy as np# select stocks whose size is among the up 30% stocks in each month and whose trading
# days are more than or equal to 10 days
test_data_1 = return_company[(return_company['cap']==True) & (return_company['Ndaytrd']>=10)]
test_data_1 = test_data_1[['emrwd', 'Msmvttl', 'volatility', 'Date_merge']].dropna()
test_data_1 = test_data_1[(test_data_1['Date_merge'] >= '2000-01-01') & (test_data_1['Date_merge'] <= '2019-12-01')]# Univariate analysis
uni_1 = Univariate(np.array(test_data_1[['emrwd', 'volatility', 'Date_merge']]), number=9)
uni_1.summary_and_test()
uni_1.print_summary_by_time()
uni_1.print_summary()
====================================================================================================
+---------+-------+-------+-------+-------+-------+-------+-------+-------+-------+--------+-------+
|  Group  |   1   |   2   |   3   |   4   |   5   |   6   |   7   |   8   |   9   |   10   |  Diff |
+---------+-------+-------+-------+-------+-------+-------+-------+-------+-------+--------+-------+
| Average | 0.009 | 0.009 | 0.008 | 0.009 | 0.008 | 0.009 |  0.01 | 0.008 | 0.009 | 0.011  | 0.002 |
|  T-Test | 8.083 | 8.567 | 8.566 | 8.338 | 8.097 | 9.132 | 9.712 | 8.322 | 8.402 | 11.275 | 1.471 |
+---------+-------+-------+-------+-------+-------+-------+-------+-------+-------+--------+-------+# Bivariate analysis
bi_1 = Bivariate(np.array(test_data_1), number=4)
bi_1.average_by_time()
bi_1.summary_and_test()
bi_1.print_summary_by_time()
bi_1.print_summary()
=====================================================================
+-------+--------+--------+---------+--------+---------+--------+
| Group |   1    |   2    |    3    |   4    |    5    |  Diff  |
+-------+--------+--------+---------+--------+---------+--------+
|   1   | 0.024  | 0.026  |  0.021  | 0.022  |  0.024  |  -0.0  |
|       | 13.854 | 14.019 |  13.417 | 13.479 |  14.148 | -0.181 |
|   2   |  0.01  |  0.01  |  0.013  | 0.011  |  0.011  | 0.001  |
|       | 7.093  | 6.576  |  9.397  | 7.681  |  7.068  | 0.416  |
|   3   | 0.006  | 0.009  |  0.008  | 0.005  |  0.007  | 0.001  |
|       | 4.114  | 6.551  |  5.156  | 3.951  |   5.56  | 0.411  |
|   4   | 0.004  | 0.003  |  0.005  | 0.006  |  0.008  | 0.004  |
|       | 2.283  | 2.044  |  3.007  | 3.804  |  4.639  | 1.377  |
|   5   | -0.001 | -0.006 |  -0.005 |  -0.0  |  -0.003 | -0.002 |
|       | -0.501 | -3.827 |  -3.517 | -0.287 |  -1.802 | -0.884 |
|  Diff | -0.025 | -0.032 |  -0.026 | -0.022 |  -0.026 | -0.001 |
|       | -10.79 | -13.72 | -12.341 | -9.892 | -12.785 | -0.487 |
+-------+--------+--------+---------+--------+---------+--------+

数据集#2:特质波动率。数据集#2的结果与文献不一致,即在单变量分析中,由于绝对t值小于2.3,差异收益不显著,且收益序列的顺序不一致。

在双变量分析中,由于绝对t值小于2.3,差异收益率不显著,这表明特质波动率不提供超额收益。

# %% construct test_data for bivariate analysis
# dataset 2
from portfolio_analysis import Bivariate, Univariate
import numpy as np# select stocks whose size is among the up 30% stocks in each month and whose trading
# days are more than or equal to 10 days
test_data_2 = return_company[(return_company['cap']==True) & (return_company['Ndaytrd']>=10)]
test_data_2 = test_data_2[['emrwd', 'Msmvttl', 'idiovolatility', 'Date_merge']].dropna()
test_data_2 = test_data_2[(test_data_2['Date_merge'] >= '2000-01-01') & (test_data_2['Date_merge'] <= '2019-12-01')]# Univariate analysis
uni_2 = Univariate(np.array(test_data_2[['emrwd', 'idiovolatility', 'Date_merge']]), number=9)
uni_2.summary_and_test()
uni_2.print_summary_by_time()
uni_2.print_summary()
=====================================================================================================
+---------+-------+-------+-------+-------+-------+-------+--------+-------+-------+--------+-------+
|  Group  |   1   |   2   |   3   |   4   |   5   |   6   |   7    |   8   |   9   |   10   |  Diff |
+---------+-------+-------+-------+-------+-------+-------+--------+-------+-------+--------+-------+
| Average | 0.009 | 0.008 | 0.008 | 0.009 | 0.009 | 0.008 |  0.01  | 0.007 | 0.009 |  0.01  | 0.001 |
|  T-Test | 9.291 | 9.162 | 7.904 | 8.555 | 9.006 | 9.615 | 10.437 | 7.742 | 9.179 | 10.445 | 0.941 |
+---------+-------+-------+-------+-------+-------+-------+--------+-------+-------+--------+-------+# Bivariate analysis
bi_2 = Bivariate(np.array(test_data_2), number=4)
bi_2.average_by_time()
bi_2.summary_and_test()
bi_2.print_summary_by_time()
bi_2.print_summary()
==================================================================
+-------+---------+--------+---------+--------+---------+--------+
| Group |    1    |   2    |    3    |   4    |    5    |  Diff  |
+-------+---------+--------+---------+--------+---------+--------+
|   1   |  0.025  | 0.021  |  0.023  | 0.022  |  0.025  | -0.001 |
|       |  13.38  | 12.289 |  12.749 | 12.311 |  15.666 | -0.34  |
|   2   |   0.01  | 0.009  |  0.012  | 0.011  |  0.011  | 0.001  |
|       |  7.286  | 6.693  |  8.082  | 8.541  |  8.022  | 0.514  |
|   3   |  0.006  | 0.006  |  0.007  | 0.008  |  0.008  | 0.002  |
|       |  4.009  | 4.115  |  5.047  | 5.496  |  5.562  | 0.928  |
|   4   |  0.005  | 0.008  |  0.005  | 0.003  |  0.006  | 0.002  |
|       |  3.072  | 4.216  |  2.919  | 1.984  |  4.165  | 0.852  |
|   5   |  -0.003 | -0.003 |  -0.004 | -0.001 |  -0.003 |  -0.0  |
|       |  -2.12  | -1.627 |  -2.343 | -0.898 |  -2.162 | -0.012 |
|  Diff |  -0.028 | -0.024 |  -0.027 | -0.023 |  -0.028 | 0.001  |
|       | -11.514 | -9.464 | -11.654 | -9.987 | -13.271 |  0.25  |
+-------+---------+--------+---------+--------+---------+--------+

波动率因子(Volatility factor)——投资组合分析(EAP.portfolio_analysis)相关推荐

  1. 市场因子(Market Factor)——投资组合分析(EAP.portfolio_analysis)

    实证资产定价(Empirical asset pricing)已经发布于Github. 包的具体用法(Documentation)博主将会陆续在CSDN中详细介绍. Github: GitHub - ...

  2. 投资组合分析:portfolio_analysis.Tangenvy_portfolio(切点组合)

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

  3. 盈利因子(Profitability factor)——投资组合分析(EAP.portfolio_analysis)

    本文根据Bail et al.的著作Empirical Asset Pricing编写相关程序,投资组合分析的模块是EAP.portfolio_analysis.本文的Package已发布于Githu ...

  4. 投资组合的风险因子调整——投资组合分析(EAP.portfolio_analysis)

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

  5. 投资组合分析:EAP.portfolio_analysis

    投资组合分析是实证资产定价中最常用的工具之一.它的主要用途是研究因子对资产价格的影响,主要方法是通过构建投资组合(portfolios)和投资组合差分(differenced portfolios), ...

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

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

  7. 常见因子的Fama-Macbeth回归:EAP.fama_macbeth

    本文根据Bail et al.的著作Empirical Asset Pricing编写相关程序,投资组合分析的模块是EAP.fama_macbeth,下面将对该模块进行详细介绍.本文的Package已 ...

  8. 使用Python进行交易策略和投资组合分析

    我们将在本文中衡量交易策略的表现.并将开发一个简单的动量交易策略,它将使用四种资产类别:债券.股票和房地产.这些资产类别的相关性很低,这使得它们成为了极佳的风险平衡选择. 动量交易策略 这个策略是基于 ...

  9. 波动率因子在中国A股市场的表现——从波动率异象出发

    引言 >>> 研究目的 本文参考民生证券因子专题研究四<低波动异象:解析.改进及成因实证>内容,对波动率因子进行探索.在量化投资的领域,波动率是最常见的选股因子之一.全球 ...

  10. R语言ggplot2可视化:使用ggplot2按照热力图的方式显示全是分类变量的dataframe数据、并自定义因子(factor)的图例颜色legend

    R语言ggplot2可视化:使用ggplot2按照热力图的方式显示全是分类变量的dataframe数据.并自定义因子(factor)的图例颜色legend(use heatmap to visuali ...

最新文章

  1. 打通docker api
  2. oracle library cache lock,【DB】彻底搞清楚library cache lock的成因和解决方法(一)
  3. LoRaWAN 巩固了其作为低功耗广域网主导技术的地位
  4. BugkuCTF-WEB题file_get_contents
  5. 计算机三级-数据库-数据库应用系统开发方法
  6. go语言 字符串处理
  7. FusionSphere整体介绍
  8. android 百度室内地图开发,androidsdk | 百度地图API SDK
  9. 泰山站和泰安站怎么区分?
  10. 17.20. 连续中值 堆
  11. qq企业邮箱 pop3服务器是什么意思,腾讯qq端口是什么? QQ企业邮箱POP3SMTP设置
  12. 吝啬SAT问题是NP完全问题的证明
  13. 【教程】迅为iTOP-4412精英版exynos4412开发板搭建原生Linux最小系统(二)
  14. 海龟图c语言编程,【编程课堂】海龟作图
  15. Excel如何快速在指定字符后面插入文本
  16. 农历日期组件 【恋爱小清单开发总结】
  17. C#中将图片的背景去除
  18. 提示找不到d3dx9.h及dxerr.lib
  19. element ts vue 中的表单验证出现红色波浪线的解决方法
  20. Kafka Broker 基本架构二

热门文章

  1. 商业智能BI和数据可视化的区别
  2. Python- // 算术运算符的精度问题
  3. MySQL主从复制中的“show slave status”详细含义
  4. linux蓝牙小车,蓝牙控制遥控车制作教程
  5. Java计算机毕业设计大学生健康电子档案系统源码+系统+数据库+lw文档
  6. 打算或正在学习新版标准日本语中级的同学请看过来
  7. 计算机成就未来作文,【精选】成就未来作文4篇
  8. Laravel页面多个列表 多个分页
  9. RSA由密文解密的奇偶性确定原始明文
  10. 深度技术 + 雨林木风 + 电脑公司 + 萝卜家园 ...