借助雅虎财经的API,获得股票价格数据,然后使用小波变换对数据进行去噪,给出可以在Jupiter notebook上运行的代码
时间: 2023-12-06 11:42:26 浏览: 155
以下是借助雅虎财经API获得股票价格数据和进行小波变换去噪的Jupyter Notebook代码:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import pywt
import requests
# 获取股票价格数据
symbol = 'AAPL'
url = f'https://query1.finance.yahoo.com/v8/finance/chart/{symbol}?interval=1d'
response = requests.get(url)
data = response.json()
df = pd.DataFrame(data['chart']['result'][0]['indicators']['quote'][0], index=pd.to_datetime(data['chart']['result'][0]['timestamp'], unit='s'))
# 绘制原始数据
plt.figure(figsize=(20,5))
sns.lineplot(x=df.index, y='close', data=df)
plt.title(f'{symbol} Price')
plt.show()
# 进行小波变换去噪
def waveletSmooth( x, wavelet="db4", level=1, title=None ):
# 小波变换
coeff = pywt.wavedec( x, wavelet, mode="per" )
# 将系数乘以一个系数因子,进行软阈值去噪
sigma = (1/0.6745) * mad( coeff[-level] )
uthresh = sigma * np.sqrt( 2*np.log( len(x) ) )
coeff[1:] = ( pywt.threshold( i, value=uthresh, mode="soft" ) for i in coeff[1:] )
# 小波反变换
y = pywt.waverec( coeff, wavelet, mode="per" )
if title:
plt.figure( figsize=(20,5) )
plt.plot( x, alpha=0.7 )
plt.plot( y, linewidth=2 )
plt.title( title )
plt.show()
return y
# 计算绝对中位差 MAD
def mad( data ):
return np.median( np.abs( data - np.median(data) ) )
# 对收盘价进行小波变换去噪
df['close_denoised'] = waveletSmooth(df['close'], title=f'{symbol} Price After Wavelet Denoising')
# 绘制去噪后的数据
plt.figure(figsize=(20,5))
sns.lineplot(x=df.index, y='close_denoised', data=df)
plt.title(f'{symbol} Price After Wavelet Denoising')
plt.show()
```
在运行代码之前,请先安装以下依赖包:
- numpy
- pandas
- matplotlib
- seaborn
- pywt
- requests
此外,代码中的 `symbol` 变量可以更改为其他股票代码来获取对应的价格数据。
阅读全文
相关推荐










