pandas_收益率的分布
目錄
目的
概念
先貼結果
?代碼
?數據
目的
step1 收益波動率和夏普比率的計算是基于收益率是正態分布的假設
step2 為什么收益率正態分布會讓收益和風險計算比較容易?
如果收益率的分布可以用正態分布來近似擬合的話,投資管理將變得更加容易
1). 當風險收益對稱時,標準差是一個很好的衡量標準
2). 如果各個資產的收益具有正態分布,那么其組成的投資組合的收益也服從正態分布
3). 可以僅適用均值和標準差來估計未來的情境
step3 收益率的分布偏離正態分布怎么辦?
此時,
1). 標準差不再是一個衡量風險的完美度量工具
2). 夏普比率不再是證券表現的完美度量工具
因此,
需要考慮偏度和峰度
概念
1. 偏度(Skewness)用來度量隨機變量概率分布的不對稱性
偏度取值范圍為(負無窮,正無窮)
當偏度<0,概率分布左偏
當偏度=0, 表示數據相對均勻的分布在平均值兩側,不一定是絕對的對稱分布
當偏度>0, 概率分布右偏
2. 峰度(Kurtosis)用來度量隨機變量概率分布的陡峭程度
峰度取值范圍為[1,正無窮),完全服從正態分布的數據的峰度值為3,峰度值越大,概率分布圖越高尖;峰度值越小,越矮胖
3. 假設檢驗:檢驗是否服從正態分布
3.1 假設H0:是正態分布【這個是期望的結果】;HA:不是正態分布
3.2 Jarque Bera是用來檢驗正態分布【要求樣本數在2000個以上】
3.3 置信區間
1). 設置99%的置信區間,表示有99%的信心認為結果是正態分布。
2). 剩余的1%叫做顯著性水平
3). 如果置信區間設置為99%,顯著水平就是1%;如果置信區間設置為95%,顯著性水平就是5%。檢驗要求越嚴格,顯著性水平就越小,例如醫藥行業一般設為1%,銀行做風險可行性會將顯著性水平設置小于1%
4. 看結果p-value值,p-value值越小越拒絕
p<1%,拒絕原假設,結果:不是正態分布
p>1%,接受原假設,結果:是正態分布
先貼結果
| 偏度:0.017862413071976304 峰度:0.0006589607625819838 檢驗p值:pvalue=0.501752635804537 檢驗結果:是正態分布 | 偏度:-1.0986798779690312 峰度:14.776922600537802 檢驗p值:pvalue=0.0 檢驗結果:不是正態分布 | 偏度:-1.4275663167447816 峰度:26.921066302426375 檢驗p值:pvalue=0.0 檢驗結果:不是正態分布 |
?代碼
import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline df_004 = pd.read_csv('600004.csv',encoding='utf-8') df_004['tradeDate'] = pd.to_datetime(df_004['tradeDate']) df_004.set_index('tradeDate',inplace=True) df_004['ret'] = df_004['closePrice'].pct_change() df = df_004.iloc[-2016:] df['ret'].plot.hist(bins=200)?
# 偏度 bias=False不自動糾正 ss.skew(df['ret'],bias=False) # out: -1.0986798779690312# 峰度 bias=False不自動糾正 ss.kurtosis(df['ret'],bias=False) # out: 14.776922600537802# 檢驗是否正態分布 ss.jarque_bera(df['ret']) # out: Jarque_beraResult(statistic=18648.83420095886, pvalue=0.0)df_015 = pd.read_csv('600015.csv',encoding='utf-8') df_015['tradeDate'] = pd.to_datetime(df_015['tradeDate']) df_015.set_index('tradeDate',inplace=True) df_015['ret'] = df_015['closePrice'].pct_change() df02 = df_015.iloc[-2016:] df02['ret'].plot.hist(bins=200)?
# 偏度 bias=False不自動糾正 ss.skew(df02['ret'],bias=False) # out: -1.4275663167447816# 峰度 bias=False不自動糾正 ss.kurtosis(df02['ret'],bias=False) # out: 26.921066302426375# 檢驗是否正態分布 ss.jarque_bera(df02['ret']) # out: Jarque_beraResult(statistic=61247.39825308066, pvalue=0.0)# 生成一個正態分布 normal_numbers = pd.Series(np.random.normal(0,0.2,10000)) ss.skew(normal_numbers ,bias=False) # out: 0.017862413071976304 ss.kurtosis(normal_numbers,bias=False) # out: 0.0006589607625819838 ss.jarque_bera(normal_numbers) # out: Jarque_beraResult(statistic=1.379296076193386, pvalue=0.501752635804537) normal_numbers.plot.hist(bins=200)?
?將檢驗是否為正態分布寫成一個函數
import scipy def is_normal(r,level=0.01):'''對一個Series實施Jarque-Bera檢驗,默認顯著性水平為1%若p值大于顯著性水平,則無法拒絕原假設(正態分布)返回True 表明該Series是正態分布'''if isinstance(r,pd.DataFrame):return r.aggregate(is_normal)else:test_statistic,p_value = scipy.stats.jarque_bera(r)return p_value>level is_normal(normal_numbers) # out: True is_normal(df['ret']) # out: False is_normal(df01['ret']) # out: False?數據
?鏈接:https://pan.baidu.com/s/1StHFKCZPBcj-Y0EXpQkjbA?
提取碼:w3e7
總結
以上是生活随笔為你收集整理的pandas_收益率的分布的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金山词霸2009sp3 (解决字典消失、
- 下一篇: skynet:cluster