先簡單介紹下AKShare,內容截至官網。
AKShare 是基於 Python 的開源金融數據接口庫,目的是實現對股票、期貨、期權、基金、債券、外匯等金融產品和另類數據從數據采集,數據清洗到數據下載的工具,滿足金融數據科學家、數據科學愛好者在數據獲取方面的需求。
它的特點是利用 AKShare 獲取的是基於可信任數據源發布的原始數據,廣大數據科學家可以利用原始數據進行再加工,從而得出科學的結論。
pip install akshare
該數據來源新浪,使用時候注意頻率,不然會被封IP
代碼:
import akshare as ak
stock_zh_a_spot_df = ak.stock_zh_a_spot()
stock_zh_a_spot_df.to_csv('E:/file/gupiao.csv',encoding="gbk")
測試記錄:
date
交易日open
開盤價high
最高價low
最低價close
收盤價volume
成交量;單位:股outstanding_share
流動股本;單位:股trunover
換手率=成交量/流動股本
代碼:
import akshare as ak
stock_zh_a_daily_qfq_df = ak.stock_zh_a_daily(symbol = "sh600497",adjust = '')
stock_zh_a_daily_qfq_df.to_csv('E:/file/sh600497.csv')
測試記錄:
我們以收盤價為基准來預測
代碼:
import pandas as pd
import numpy as np
import datetime as dt
import matplotlib.pylab as plt
import seaborn as sns
from matplotlib.pylab import style
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import statsmodels.api as sm
# 一些配置
style.use('ggplot')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 讀取數據源
stockFile = 'E:/file/sh600497.csv'
stock = pd.read_csv(stockFile, index_col=0, parse_dates=[0])
# 查看每周的均價
# 首先需要將dataframe的索引設置為時間列
stock.index = pd.to_datetime(stock['date'])
stock_week = stock['close'].resample('W-MON').mean()
stock_train = stock_week['2020':'2022']
stock_train.plot(figsize=(12,8))
plt.legend(bbox_to_anchor=(1.25, 0.5))
plt.title("Stock Close")
sns.despine()
# 一階差分
stock_diff = stock_train.diff()
stock_diff = stock_diff.dropna()
plt.figure()
plt.plot(stock_diff)
plt.title('一階差分')
#plt.show()
# ACF
acf = plot_acf(stock_diff, lags=20)
plt.title("ACF")
#acf.show()
# PACF
pacf = plot_pacf(stock_diff, lags=20)
plt.title("PACF")
#pacf.show()
# 進行預測
stock_train[np.isnan(stock_train)] = 0
stock_train[np.isinf(stock_train)] = 0
model = ARIMA(stock_train, order=(1, 1, 1), freq='W-MON')
result = model.fit()
#pred = result.predict('2022/1/1', '2022/6/1',dynamic=True, typ='levels')
#print (pred)
#print(help(result.predict))
pred = result.predict(start=len(stock_train)-3, end=len(stock_train)+3, dynamic=True, typ='levels')
print(pred)
plt.figure(figsize=(6, 6))
plt.xticks(rotation=45)
plt.plot(pred)
plt.plot(stock_train)
plt.show()
測試記錄:
預測只能預測一個趨勢,從下圖我們可以看到,預測的股價趨勢趨於平穩。