python_scipy使用

本文通过对比DIA和SPY股票的对数收益率,使用统计检验如T-test和Kolmogorov-Smirnov检验来评估它们的均值和分布差异。Jarque-Bera检验结果显示其差值符合正态分布。接着,对QQQ股票的收盘价进行线性趋势去除,展示了去除趋势后的信号,并对其进行了滤波处理,利用傅里叶变换滤除噪声,揭示了信号的频谱特征。
摘要由CSDN通过智能技术生成

目录

1. 比较股票对数收益率

2. 检验QQQ股价的线性趋势

3. 对去除趋势后的信号进行滤波处理

数据:


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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值