目录
1. 比较股票对数收益率
import numpy as np
import pandas as pd
from scipy import stats
from scipy import signal
from scipy import fftpack
from statsmodels.stats.stattools import jarque_bera
import matplotlib.pyplot as plt
%matplotlib inline
# 1. 比较股票对数收益率
'''
1. 比较DIA和SPY收盘价的对数收益率
2. 在两只股票对数收益率的差值上应用Jarque-Bera正态性检验
'''
dia_df = pd.read_csv('DIA.csv',encoding='utf-8')
spy_df = pd.read_csv('SPY.csv',encoding='utf-8')
dia_df = dia_df.iloc[-252:]
spy_df = spy_df.iloc[-252:]
spy = np.diff(np.log(spy_df['Close']))
dia = np.diff(np.log(dia_df['Close']))
# 均值检验可以检查两组不同的样本是否有相同的均值。返回值有两个,其中第二个为p-value,取值范围为0~1
# 结果为 Ttest_indResult(statistic=0.23703418134398255, pvalue=0.8127273567868357)
# 有81%的概率两组样本对数收益率的均值相同
print('Means comparison',stats.ttest_ind(spy,dia))
# Kolmogorov-Smirnov检验可以判断两组样本同分布的可能性。返回值有两个,第二个为p-value
# 结果为 KstestResult(statistic=0.06772908366533864, pvalue=0.613452591221265)
# 有61%的概率两组样本的分布相同
print('Kolmogorov-Smirnov test',stats.ks_2samp(spy,dia))
# 两只股票对数收益率差值Jarque-Bera正态性检验(检验使用方法:如果结果比0大很多,说明不符合正态分布)
# 结果为 Jarque Beta test 2.9045533682935356e-05 数值很小,说明符合正态分布
print('Jarque Beta test',jarque_bera(spy-dia)[1])
plt.hist(spy,histtype='step',lw=1,label='SPY')
plt.hist(dia,histtype='step',lw=2,label='DIA')
plt.hist(spy-dia,histtype='step',lw=3,label='Delta')
plt.legend()
2. 检验QQQ股价的线性趋势
# 2. 检验QQQ股价的线性趋势
qqq_df = pd.read_csv('QQQ.csv',encoding='utf-8')
qqq_df = qqq_df.iloc[-252:]
qqq = qqq_df['Close']
# 去除信号中的线性趋势
y = signal.detrend(qqq)
fig = plt.figure()
ax = fig.add_subplot(111)
# 绘制股价数据以及将去除趋势后的信号从原始数据中减去所得到的潜在趋势
plt.plot(qqq,'o',qqq-y,'-')
3. 对去除趋势后的信号进行滤波处理
# 3. 对去除趋势后的信号进行滤波处理
'''
傅里叶变换是处理信号的常用工具。傅里叶变换是一种从时域到频域的变换,也就是将周期信号线性分解为不同频率的正弦函数和余弦函数
'''
# 应用傅里叶变换,得到信号的频谱
amps = np.abs(fftpack.fftshift(fftpack.rfft(y)))
# 滤除噪声。如果某一频率分量的大小低于最强分量的10%,则将其滤除
amps[amps<0.1*amps.max()]=0
# 将滤波后的信号变换回时域,并和去除趋势后的信号一起绘制出来
fig = plt.figure()
fig.subplots_adjust(hspace=.3)
ax = fig.add_subplot(211)
plt.plot(y,'o',label='detrended')
plt.plot(-fftpack.irfft(fftpack.ifftshift(amps)),label='filtered')
plt.legend()
# 绘制滤波后的频谱
ax2 = fig.add_subplot(212)
N = len(qqq)
plt.plot(np.linspace(-N/2,N/2,N),amps,label='transformed')
plt.legend()
数据:
链接:https://pan.baidu.com/s/1EzRTwbb2hq9wOjOu5WbvRQ
提取码:zuq3