基础知识
对于股票数据的模型构建,一般采用几何布朗运动模型。若股票价格S是一个连续的时间序列,则认为有
d
S
=
μ
S
d
t
+
σ
S
d
z
dS=\mu Sdt+\sigma Sdz
dS=μSdt+σSdz
根据上式可以推出股票价格的对数
l
n
S
ln S
lnS
d
(
l
n
S
)
=
(
μ
−
σ
2
2
)
d
t
+
σ
d
z
d(ln S)=(\mu-\frac{\sigma^2}{2})dt+\sigma dz
d(lnS)=(μ−2σ2)dt+σdz
对于离散的股票数据而言,假设t时刻股票的价格为
S
t
S_t
St,而t+1时刻的股票价格为
S
t
+
1
S_{t+1}
St+1。由上式可以得到
l
n
(
S
t
+
1
S
t
)
~
N
[
(
μ
−
σ
2
2
)
(
T
−
t
)
,
σ
T
−
t
]
ln(\frac{S_{t+1}}{S_t}) ~ N[ (\mu-\frac{\sigma^2}{2})(T-t),\sigma \sqrt{T-t}]
ln(StSt+1)~N[(μ−2σ2)(T−t),σT−t]
上式左边为股票的对数收益率(和
S
T
+
1
−
S
T
S
T
\frac{S_{T+1}-S_T}{S_T}
STST+1−ST几乎相同)。所以理论上认为股票收益率服从对数正态分布。
实际验证
为了验证A股市场上的股票收益率是否满足上述分布,分析过程包括以下几个步骤:获取股票数据,计算对数收益率,画图分析等。
获取数据
通过pandas_datareader获得单个股票的数据,这里以上证指数(000001.SS)为例。
import pandas_datareader as web
import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
start=datetime(2015,1,1)
end=datetime(2016,1,1)
data=web.DataReader("000001.SS","yahoo",start,end)
print(data.head())
data["Close"].plot()
plt.show()
计算对数收益率
data["lgreturns"]=(data["Close"]/data["Close"].shift(1)).apply(np.log)
data["lgreturns"].plot.bar()
plt.xticks([])
plt.show()
data["lgreturns"].plot.hist(bins=50,rwidth=0.8,color="red")
plt.show()
由上面两幅图可以看到,收益率呈现出正态分布的特征。如果增加数据样本,收益率的分布会更加接近正态分布的特征。