收益序列计算
下载上证综指过去一年的收盘数据,计算收益序列,画数据直方图,计算各个描述统计量。
from scipy import stats
import pandas as pd
import numpy as np
from pandas_datareader import data, wb # 需要安装 pip install pandas_datareader
import datetime
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib
matplotlib.style.use('ggplot')
%matplotlib inline
start = datetime.datetime(2013, 1, 1)
end = datetime.datetime(2014,6,1)
sh = data.DataReader("000001.SS", 'yahoo', start, end)
close = sh['Close']
close.plot();
收益率计算
一般有两种计算方式,一种是单期的简单收益率,另一种是计算复利的连续复合收益率。
单期简单收益率: \begin{equation} 1 + Rt = \frac{P_t}{P{t-1}} \ Rt = \frac{(P_t-P{t-1})}{P_{t-1}} \end{equation}
Matlab文档里有一个对应的算例.
连续复合收益率(单期): \begin{equation} rt = ln(1+R_t) = ln \frac{P_t}{P{t-1}} = ln(Pt) - ln(P{t-1}) \end{equation}
这里采用以下复合收益率计算return series,多谢太子弹琴同学指导。
# 第一种最方便的是pct_change函数
return_series = close.pct_change()[1:]
# return series https://www.zhihu.com/question/20064721
# accept stock price and give return series back
def get_rs(price):
return np.log((price.shift(1)/price).dropna())
return_series = get_rs(close)
# close price and return series differ in size by one
print close.shape, return_series.shape
(337,) (336,)
return_series.head()
Date
2013-01-07 -0.003669
2013-01-08 0.004073
2013-01-09 0.000321
2013-01-10 -0.003650
2013-01-11 0.017965
Name: Close, dtype: float64
# 波动情况
return_series.plot();
# series也可以便捷的计算描述统计量
rs = return_series
rs.max(),rs.min()
(0.054449171819962665, -0.033330981281467977)
# 均值
rs.mean() # 对比上图,均值接近0
0.0003282497540976614
# 将样本观测值从小到大依次排列,位于中间的那个观测值,称为样本中位数,它描述了样本观测数据的中间位置。median函数用来计算样本的中位数。
rs.median()
0.0003507633101338261
# mode函数用来计算样本的众数,众数描述了样本观测数据中出现次数最多的数。
rs.mode()
Series([], dtype: float64)
# 方差
rs.var()
0.00012068806084068744
# 标注差
rs.std()
0.010985811797072051
rs.std()**2 - rs.var()
0.0
# 样本方差与标注差
print rs.var(ddof=1); rs.std(ddof=1)
0.000120688060841
0.010985811797072051
# skewness函数用来计算样本的偏度,样本偏度反映了总体分布密度曲线的对称性信息,偏度越接近于0,说明分布越对称,否则分布越偏斜。
# 若偏度为负,说明样本服从左偏分布(概率密度的左尾巴长,顶点偏向右边);
# 若偏度为正,样本服从右偏分布(概率密度的右尾巴长,顶点偏向左边)。
rs.skew()
0.3059801240105236
# 箱线图
sns.boxplot(rs,orient='h');
sns.distplot(rs,kde=False,fit=stats.norm);