# coding=utf-8
import pandas
as pd
import numpy
as np
from pandas
import Series
,DataFrame
import matplotlib.pyplot
as plt
####
股票时间序列分析
####
#
参数初始化
datafile=
u'E:/python
数据分析
/
第
12
周
/stock_px.xls'
import sys
reload(sys)
sys.setdefaultencoding(
'utf8')
#
读取数据
data=pd.read_
Excel(datafile
,
index_col=
u'
日期
')
data=DataFrame(data
,
dtype=np.float64)
data=data.iloc[:
,:-
1]
#
取三只股票数据
data
#
时序图
plt.rcParams[
'font.sans-serif']=[
'SimHei']
#
用来正常显示中文标签
plt.rcParams[
'axes.unicode_minus']=
False
#
用来正常显示负号
data.plot()
plt.title(
'
三只股票时序图
')
#
自相关数
from statsmodels.graphics.tsaplots
import plot_acf
#AAPL
取前
100
条数据
plot_acf(data[
'AAPL'].iloc[:
100]).show()
plt.title(
'AAPL
自相关图
')
#MSFT
取前
100
条数据
plot_acf(data[
'MSFT'].iloc[:
100]).show()
plt.title(
'MSFT
自相关图
')
#XOM
取前
100
条数据
plot_acf(data[
'XOM'].iloc[:
100]).show()
plt.title(
'XOM
自相关图
')
#
平稳性检测
from statsmodels.tsa.stattools
import adfuller
as ADF
#AAPL
的平稳性检测,看
pvalue
值
print
'AAPL
的
pvalue:'
,ADF(data[
'AAPL'])[
1]
#pvalue
值为
0.99,
大于
0.05,
不稳定,考虑差分数值建模
#MSFT
的平稳性检测,看
pvalue
值
print
'MSFT
的
pvalue:'
,ADF(data[
'MSFT'])[
1]
#pvalue
值为
0.04,
小于
0.05,
稳定
#XOM
的平稳性检测,看
pvalue
值
print
'MSFT
的
pvalue:'
,ADF(data[
'XOM'])[
1]
#pvalue
值为
0.45,
大于
0.05,
不稳定
###
差分
D_data=data.diff().dropna()
D_data.columns=[
u'AAPL
差分
'
,
u'MSFT
差分
'
,
u'XOM
差分
']
D_data
##
差分后的结果
#
差分时序图
D_data.plot()
plt.title(
'
三只股票差分时序图
')
#
差分自相关数
from statsmodels.graphics.tsaplots
import plot_acf
#AAPL
差分 取前
100
条数据
plot_acf(D_data[
'AAPL
差分
'].iloc[:
100]).show()
plt.title(
'AAPL
差分自相关图
')
#MSFT
差分 取前
100
条数据
plot_acf(D_data[
'MSFT
差分
'].iloc[:
100]).show()
plt.title(
'MSFT
差分自相关图
')
#XOM
差分 取前
100
条数据
plot_acf(D_data[
'XOM
差分
'].iloc[:
100]).show()
plt.title(
'XOM
差分自相关图
')
#
偏自相关图
from statsmodels.graphics.tsaplots
import plot_pacf
#AAPL
差分偏自相关 取前
100
条数据
plot_pacf(D_data[
'AAPL
差分
'].iloc[:
100]).show()
plt.title(
'AAPL
差分偏自相关图
')
#MSFT
差分偏自相关 取前
100
条数据
plot_pacf(D_data[
'MSFT
差分
'].iloc[:
100]).show()
plt.title(
'MSFT
偏差分自相关图
')
#XOM
差分偏自相关 取前
100
条数据
plot_pacf(D_data[
'XOM
差分
'].iloc[:
100]).show()
plt.title(
'XOM
偏差分自相关图
')
#
差分平稳性检测
from statsmodels.tsa.stattools
import adfuller
as ADF
#AAPL
差分的平稳性检测,看
pvalue
值
print
'AAPL
的
pvalue:'
,ADF(D_data[
'AAPL
差分
'])[
1]
#
远小于
0.05,
稳定!
#MSFT
差分的平稳性检测,看
pvalue
值
print
'MSFT
的
pvalue:'
,ADF(D_data[
'MSFT
差分
'])[
1]
#
远小于
0.05,
稳定!
#XOM
差分的平稳性检测,看
pvalue
值
print
'MSFT
的
pvalue:'
,ADF(D_data[
'XOM
差分
'])[
1]
#
远小于
0.05,
稳定!
#
白噪声检测
from statsmodels.stats.diagnostic
import acorr_ljungbox
#AAPL
差分白噪声检测
acorr_ljungbox(D_data[
'AAPL
差分
']
,
lags=
1)
#
返回统计量和
p
值
p
值大于
0.05
,不排除白噪声
#MSFT
差分白噪声检测
acorr_ljungbox(D_data[
'MSFT
差分
']
,
lags=
1)
#
返回统计量和
p
值
p
值小于
0.05
,排除白噪声
#XOM
差分白噪声检测
acorr_ljungbox(D_data[
'XOM
差分
']
,
lags=
1)
#
返回统计量和
p
值
p
值小于
0.05
,排除白噪声
#AAPL ARIMA
建模
from statsmodels.tsa.arima_model
import ARIMA
pmax=
3
qmax=
3
bic_matrix=[]
#bic
矩阵
for p
in
range(pmax+
1):
tmp=[]
for q
in
range(qmax+
1):
try:
#
存在部分报错,所以用
try
来跳过报错。
tmp.append(ARIMA(data[
'AAPL']
,(p
,
1
,q)).fit().bic)
except:
tmp.append(
None)
bic_matrix.append(tmp)
bic_matrix=pd.DataFrame(bic_matrix)
#
从中可找出最小值
p
,q=bic_matrix.stack().idxmin()
#
先用
stack
展平,然后用
idxmin
找出最小位置。
print
u'BIC
最小的
p
值和
q
值为
: %s
、
%s'%(p
,q)
#0,0
model=ARIMA(data[
'AAPL']
,(p
,
1
,q)).fit()
#
建立
ARIMA(0,1,0)
模型
model.summary()
#
股票
AAPL
给出一份模型报告
#MSFT ARIMA
建模
from statsmodels.tsa.arima_model
import ARIMA
pmax=
3
qmax=
3
bic_matrix=[]
#bic
矩阵
for p
in
range(pmax+
1):
tmp=[]
for q
in
range(qmax+
1):
try:
#
存在部分报错,所以用
try
来跳过报错。
tmp.append(ARIMA(data[
'MSFT']
,(p
,
1
,q)).fit().bic)
except:
tmp.append(
None)
bic_matrix.append(tmp)
bic_matrix=pd.DataFrame(bic_matrix)
#
从中可找出最小值
p
,q=bic_matrix.stack().idxmin()
#
先用
stack
展平,然后用
idxmin
找出最小位置。
print
u'BIC
最小的
p
值和
q
值为
: %s
、
%s'%(p
,q)
#0,1
model=ARIMA(data[
'MSFT']
,(p
,
1
,q)).fit()
#
建立
ARIMA(0,1,1)
模型
model.summary()
#
给出一份模型报告
#XOM ARIMA
建模
from statsmodels.tsa.arima_model
import ARIMA
pmax=
3
qmax=
3
bic_matrix=[]
#bic
矩阵
for p
in
range(pmax+
1):
tmp=[]
for q
in
range(qmax+
1):
try:
#
存在部分报错,所以用
try
来跳过报错。
tmp.append(ARIMA(data[
'XOM']
,(p
,
1
,q)).fit().bic)
except:
tmp.append(
None)
bic_matrix.append(tmp)
bic_matrix=pd.DataFrame(bic_matrix)
#
从中可找出最小值
p
,q=bic_matrix.stack().idxmin()
#
先用
stack
展平,然后用
idxmin
找出最小位置。
print
u'BIC
最小的
p
值和
q
值为
: %s
、
%s'%(p
,q)
#2,3
model=ARIMA(data[
'XOM']
,(p
,
1
,q)).fit()
#
建立
ARIMA(2,1,3)
模型
model.summary()
#
给出一份模型报告
result:
AAPL的ARIMA模型拟合报告:
ARIMA Model Results
==============================================================================
Dep. Variable: D.AAPL No. Observations: 2213
Model: ARIMA(0, 1, 0) Log Likelihood -5731.237
Method: css S.D. of innovations 3.225
Date: Sat, 24 Sep 2016 AIC 11466.474
Time: 13:12:28 BIC 11477.878
Sample: 01-03-2003 HQIC 11470.640
- 10-14-2011
==============================================================================
coef std err z P>|z| [95.0% Conf. Int.]
------------------------------------------------------------------------------
const 0.1873 0.069 2.733 0.006 0.053 0.322
==============================================================================
MSFT的ARIMA模型拟合报告:
ARIMA Model Results
==============================================================================
Dep. Variable: D.MSFT No. Observations: 2213
Model: ARIMA(0, 1, 1) Log Likelihood -1127.640
Method: css-mle S.D. of innovations 0.403
Date: Sat, 24 Sep 2016 AIC 2261.280
Time: 13:13:45 BIC 2278.387
Sample: 01-03-2003 HQIC 2267.529
- 10-14-2011
================================================================================
coef std err z P>|z| [95.0% Conf. Int.]
--------------------------------------------------------------------------------
const 0.0028 0.008 0.351 0.726 -0.013 0.018
ma.L1.D.MSFT -0.0752 0.021 -3.498 0.000 -0.117 -0.033
Roots
=============================================================================
Real Imaginary Modulus Frequency
-----------------------------------------------------------------------------
MA.1 13.3040 +0.0000j 13.3040 0.0000
-----------------------------------------------------------------------------
XOM的ARIMA模型拟合报告:
ARIMA Model Results
==============================================================================
Dep. Variable: D.XOM No. Observations: 2213
Model: ARIMA(2, 1, 3) Log Likelihood -3267.532
Method: css-mle S.D. of innovations 1.059
Date: Sat, 24 Sep 2016 AIC 6549.063
Time: 13:14:26 BIC 6588.978
Sample: 01-03-2003 HQIC 6563.644
- 10-14-2011
===============================================================================
coef std err z P>|z| [95.0% Conf. Int.]
-------------------------------------------------------------------------------
const 0.0219 0.017 1.284 0.199 -0.012 0.055
ar.L1.D.XOM -1.4970 0.090 -16.722 0.000 -1.672 -1.322
ar.L2.D.XOM -0.5351 0.085 -6.287 0.000 -0.702 -0.368
ma.L1.D.XOM 1.3333 0.087 15.238 0.000 1.162 1.505
ma.L2.D.XOM 0.1787 0.081 2.201 0.028 0.020 0.338
ma.L3.D.XOM -0.2140 0.021 -10.334 0.000 -0.255 -0.173
Roots
=============================================================================
Real Imaginary Modulus Frequency
-----------------------------------------------------------------------------
AR.1 -1.1026 +0.0000j 1.1026 0.5000
AR.2 -1.6948 +0.0000j 1.6948 0.5000
MA.1 -1.1927 -0.1691j 1.2046 -0.4776
MA.2 -1.1927 +0.1691j 1.2046 0.4776
MA.3 3.2206 -0.0000j 3.2206 -0.0000
-----------------------------------------------------------------------------
result:
figure_11.png (23.52 KB)
下载附件 保存到相册