-
2022-04-28 20:01:43
经济数据预测 | Python实现ARIMA模型股票趋势预测
基本介绍
随着人们生活水平的提高,人们的投资方式也在发生着巨大的变化,越来越多的人开始关注并参与到股票市场投资中去。股票具有高收益的同时也具有高风险性,股票市场受众多因素的影响,价格令人无法捉摸,股票价格预测的研究具有巨大的价值,因此对于股票价格的预测从股票市场诞生之日起,就成了股民与学者们不懈探索的难题。
本文以此为背景,建立ARIMA模型,用于研究股票的趋势,并且得出股票预测的估计值,拟合度较高,适应性良好。数据描述
- 本文的数据来源于某股市的交易数据,其中date 、 open 、high 、low 、close 、volumn各字段的含义分别为股票日期、开盘价、最高价、最低价、收盘价、股票价格。
import csv i
更多相关内容 -
Python预测股票走势
2021-01-14 02:55:03本文介绍了如何利用时间序列模型ARIMA进行股票走势预测。环境:windows 64平台:Jupyter Notebook (Kernel python3)库:tushare statsmodels pandas numpy seaborn matplotlib先来看看效果吧图1 预测结果图图1中橙.....Python的功能可谓相当强大,在很多行业具有相当的优势,这种优势很大程度上来源于各种第三方库。本文介绍了如何利用时间序列模型ARIMA进行股票走势预测。
环境:windows 64
平台:Jupyter Notebook (Kernel python3)
库:tushare statsmodels pandas numpy seaborn matplotlib
先来看看效果吧
图1 预测结果图
图1中橙色线条为股票行情实际数据,蓝色线条为模型预测的行情走势,预测结果显示股票呈上涨趋势,从长期来看,还是符合实际走势的,证明了ARIMA模型具有一定的可信性。但是在这里还是要提醒大家一句,股市有风险,投资需谨慎。模型只能提供一个参考,并不能完全正确的指导用户投资。
股票行情数据获取
数据的获取利用第三方库tushare,tushare是一个免费、开源的python财经数据接口包, 具体的介绍点我。
tushare的安装方法很简单, pip install tushare即可。
import tushare
data=tushare.get_h_data('600000',start='2005-05-05')
data.to_csv('600000_2005.csv')导入库,然后调用get_h_data函数获取数据,‘600000’指定股票代码,start指定数据开始的日期,最后将获取的数据使用to_csv函数以csv格式保存到本地。
注意:调用get_h_data时有时会出现错误,可能是由于服务器不稳定,重新执行即可。但两次调用之间要间隔一定时间。
数据读取与预处理
df=pd.read_csv('600000_2005.csv',index_col=0,parse_dates=[0])
#index_col表示把第一列设为index,parse_dates=[0]表示把第一列按datetime格式解析使用pandas的read_csv函数进行读取数据,各指标意义见代码段中的注释。
图2 读取数据展示
pandas读取出的数据如图2所示,我们将选取close,即收盘价作为考核指标来建立ARIMA模型。
ARIMA模型建立
stock_week=df['close'].resample('W-TUE').mean()
#将收盘价作为评判标准,resample指按周统计平均数据(可以指定哪天为基准日,此处是周二为基准)
stock_train=stock_week['2005':'2017'].dropna()
#选取2005-2017的数据原始数据是股票每天的行情,我们这里将数据进行重采样,按每周的平均行情来进行分析,‘W-TUE’表示按周为单位,指定周二为基准日,即周二到下个周二为一个计算周期。
画图看一下现在的数据
图3 重采样后的数据
图3使用matplotlib和seaborn绘制,代码如下
stock_train.plot(figsize=(12,8))
# plt.legend(bbox_to_anchor=(1.25,0.5))
plt.title('Close Price')
sns.despine() #边框控制,默认没有上方和右方的框
plt.show()
由图3可以看出,数据波动比较大,而时间序列模型要求数据平缓,满足平稳性的要求。因此需要对数据进行差分处理。
stock_diff=stock_train.diff().dropna() #对数据进行差分,目的使数据平缓,满足平稳性的要求
plt.figure()
plt.plot(stock_diff)
font_loc=''
plt.title('一阶差分',fontproperties=font_set) #注意要设置字体,否则会乱码
plt.show()
图4 一阶差分结果图
一阶差分的结果如图4所示,图4可以看出数据基本已经趋于平缓,为了确定一阶差分足以满足需求,再进行ACF和PACF检验,ACF和PACF可以直接调用statemodel里的函数进行求算。
from statsmodels.graphics.tsaplots import plot_acf,plot_pacf
acf=plot_acf(stock_diff,lags=20)
plt.title('ACF')
acf.show()
plt.show()
pacf=plot_pacf(stock_diff,lags=20)
plt.title('PACF')
pacf.show()
plt.show()
图5 ACF结果图
图6 PACF结果图
由图5和图6可以看出,进行一阶差分时,结果已经落在了置信区间内(图中蓝色区域),因此可以确定进行一阶差分是可靠有效的。
接下来就可以进行ARIMA模型训练了
model=ARIMA(stock_train,order=(1,1,1),freq='W-TUE')#训练模型,order表示(p,d,q)
result=model.fit()参数order=(1,1,1)表示一阶差分,ACF和PACF的取值均为1,关于差分阶数、ACF、PACF取值详细介绍点我。
最后一步就是利用建立好的result模型来预测走势了
pred=result.predict('20160816','20180112',dynamic=True,typ='levels')#注意预测的起始时间要在训练时间的范围内,结束时间没有要求需要注意的是,预测数据起始时间必须在训练集内,而终止时间则没有限制
plt.figure(figsize=(6,6))
plt.xticks(rotation=45)
plt.plot(pred)
plt.plot(stock_train)
plt.show()
画图
就可以看见文章开头的结果了
注:第一次发博客,不足之处欢迎大家提意见,另外该博文主要参考了唐宇迪机器学习视频以及很多已有博客,在此予以声明。
-
基于python实现股票价格走势预测.zip
2021-07-27 09:32:25基于tensorflow框架实现,通过tushare模块获取股票数据,pandas处理数据,matplotlib绘制真实价格走势和预测价格走势,当前只能预测第二天的开盘价,准确率还可以,日后会逐渐对其进行完善。 -
Python-使用Tensorflow运行CNN以预测股票走势,tensorflow股票分析,Python
2019-08-10 02:28:58股票预测涨跌这个是一个神经网络预测股票的程序,总而言之,给力,准,能够很好的拟合规律曲线划分股票数据进行卷积神经网络学习 -
Python-利用人工智能的最新进展来预测股市走势
2019-08-11 07:19:49利用人工智能的最新进展来预测股市走势 -
基于Python的股票红利预测
2022-05-01 19:43:19目的:数据文件data.csv是某股票从1997-2017的20年来各季度红利数据,找出时序数据的构成因素,并分别通过指数平滑法和自回归ARIMA模型方法,建立时序数据的预测模型,并预测下两年的红利(bonus)。目的:数据文件
data.csv
是某股票从1997-2017的20年来各季度红利数据,找出时序数据的构成因素,并分别通过指数平滑法和自回归ARIMA模型方法,建立时序数据的预测模型,并预测下两年的红利(bonus)。
data.csv❌注意:本文仅用于学习Python对时间序列数据的处理,不建议用于炒股决策!!!
1. 加载包
import pandas as pd import numpy as np from statsmodels.tsa import holtwinters as hw from statsmodels.tsa.stattools import adfuller from statsmodels.graphics.tsaplots import plot_acf from statsmodels.graphics.tsaplots import plot_pacf from statsmodels.graphics.gofplots import qqplot import matplotlib.pyplot as plt from statsmodels.tsa import arima_model import warnings
2. 导入数据
f = open('实验4数据.csv') mydata = pd.read_csv(f) # print(mydata) print(mydata.head())
3. 创建时序数据并绘图
ts = pd.period_range('1997/01', periods=len(mydata), freq='Q') # 创建DF结构的数据,以ts为索引,以bonus为列名 bonus_data = pd.DataFrame(mydata['bonus'].values, index=ts, columns=['bonus']) print(bonus_data.head())
# 显示所有的点 bonus_data.plot(style=['+-'], figsize=(16, 9))
4. 数据预处理
- 长期趋势:bonus(股票红利)随着时间变动呈上升趋势
- 季节变动:bonus(股票红利)在第四、一、二季度上升,在第三季度数值下降,并随着时间变化,呈现放大情况
# 数据对数化 bonus_log = np.log(bonus_data) bonus_log.plot(style='+-', figsize=(16, 9))
5. 建立模型–三次指数平滑法
一次指数平滑:适用于序列没有趋势和季节性特征
二次指数平滑:适用于序列有趋势特征但无季节性特征
三次指数平滑:适用于序列有趋势特征且有季节性特征
5.1 创建模型
# 长期趋势、季节趋势:add # 季节周期:季度 # seasonal_periods:季度数据为4,月度数据的为12,周周期数据为7 # trend、seasonal为add,任取一个时间段,数据增量为0 bonus_hw = hw.ExponentialSmoothing(bonus_log, trend='add', seasonal='add', seasonal_periods=4) hw_fit = bonus_hw.fit() hw_fit.summary()
bonus_data.plot() np.exp(hw_fit.fittedvalues).plot(label='fitted_values', legend=True)
5.2 残差图
plot_acf(hw_fit.resid)
5.3 残差(预测误差)的平稳性检验(单位根检验)
如果存在单位根,那么就是非平稳时间序列,会使回归分析中存在伪回归
第二项为p值,小于0.05。可以判定残差为平稳序列
adfuller(hw_fit.resid)
5.4 直方图+核密度图
核密度曲线类似于概率密度曲线,其曲线下的面积是1,因此其y轴上的单位通常是小于1的核密度分布值。
实质是一种对直方图的抽象。类似统计学中的频数分布图和概率密度函数的区别。plt.figure() # 需要注意的是:在直方图的基础上添加核密度图,必须将直方图的频数更改为频率,即density参数设置为True。 plt.hist(hw_fit.resid, density=True, label = '直方图') hw_fit.resid.plot(kind='kde', label = '核密度图') plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']#处理中文乱码 plt.legend()# 显示图例 plt.show()
5.5 正态qq图
qqplot(hw_fit.resid, line='s')
根据qq图可知,残差服从正态分布,峰度小于3
5.6 预测
bonus_forecast = np.exp(hw_fit.predict(start='2018/1', end='2019/12')) print(bonus_forecast)
bonus_data.plot() bonus_forecast.plot(label='forecast', legend=True)
6. 自回归移动平均法
差分整合移动平均自回归模型(ARIMA) 是指将非平稳时间序列转化为平稳时间序列,然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型。
ARIMA(p,d,q)中,AR是”自回归”,p为自回归项数;MA为”滑动平均”,q为滑动平均项数,d为使之成为平稳序列所做的差分次数(阶数)。
处理思路:
- 绘制数据随时间变化趋势,判断为平稳序列还是非平稳序列
- 若为非平稳序列,使用差分转化为平稳序列,得到参数d的取值
- 根据ACF、PACF寻找最优参数p、q
平稳序列:
基本上不存在趋势的序列,各观察值基本上在某个固定的水平上波动;或虽有波动,但并不存在某种规律,而其波动可以看成是随机的。
6.1 差分
差分,简单来说就是后一时间点的值减去当前时间点,也就是 y t − y t − 1 y_{t}-y_{t-1} yt−yt−1, 每做一次差分就少一个数据。
# 一阶差分并去除空值 bonus_log_diff1 = bonus_log.diff().dropna() bonus_log_diff1.plot()
# 可以看到通过 1 次差分数据已经平稳 adfuller(bonus_log_diff1['bonus'])
6.2 自相关图、偏自相关图
# 自相关图 拖尾 plot_acf(bonus_log_diff1, lags=30)
# 偏自相关图 拖尾 plot_pacf(bonus_log_diff1, lags=30)
6.3 确定模型参数
aic_values = [] find_index = () warnings.filterwarnings('ignore') for p in range(8): for q in range(8): try: myfit = arima_model.ARIMA(bonus_log, (p,1,q)).fit() aic_values.append(myfit.aic) print('(%d:%d,1,%d), AIC:%d' %(find_index, p, q, myfit.aic)) find_index += 1 except: pass
print(aic_values.index(min(aic_values)), min(aic_values))
arima_fit = arima_model.ARIMA(bonus_log, (3,1,2)).fit() arima_fit.summary()
6.4 单位根检验
# 平稳性检验 # plot_acf(arima_fit.resid) adfuller(arima_fit.resid)
6.5 QQ图
qqplot(arima_fit.resid, line='s') plt.figure() plt.hist(arima_fit.resid, density=True) arima_fit.resid.plot(kind='kde') plt.show() # 残差符合正态分布
6.6 预测
bonus_forecast = np.exp(arima_fit.forecast(8)[0]) print(bonus_forecast)
plt.figure() plt.plot(range(len(bonus_data)), bonus_data['bonus'], label='bonus') plt.plot(range(len(bonus_data), len(bonus_data)+len(bonus_forecast)), bonus_forecast, label='forecast', color='r') plt.xlim(0, 100) plt.ylim(0, 25) plt.legend() plt.show()
7. 比较两种模型的优劣
print('指数平滑法:AIC=%d, SSE=%.2f \n ARIMA模型:AIC=%d, SSE=%.2f' %(hw_fit.aic, sum(hw_fit.resid**2), arima_fit.aic, sum(arima_fit.resid**2)))
-
Python-使用Tensorflow运行CNN以预测股票走势
2019-08-10 02:28:58使用Tensorflow运行CNN以预测股票走势。 希望找出跟随价格上涨的模式。 -
Python --相似K线匹配--实现股票走势预测 Tushare
2022-04-18 15:04:12Python --相似K线匹配–实现股票走势预测 Tushare 前言 同花顺和东方财富都提供了一个免费的功能可以查找相似走势的K线,提供参考。差不多,东方财富可以选择分析的周期,同花顺是固定120日的分析周期。我们可以...Python --相似K线匹配–实现股票走势预测 Tushare
前言
同花顺和东方财富都提供了一个免费的功能可以查找相似走势的K线,提供参考。差不多,东方财富可以选择分析的周期,同花顺是固定120日的分析周期。我们可以通过tushare的数据源获取历史交易数据自己实现一个类似功能。
得到的K线匹配效果如下:
一、获取历史交易数据
1.引入库,读取历史交易数据
Tushare是一个免费、开源的python财经数据接口包。注册用户后到个人中心改一下名字获取积分,基本的功能都可以用了。大家可以用我的邀请码注册
①首先要安装tushare库
pip install tushare --upgrade
②注册Tushare大数据社区的账号,在个人中心获取你的token
③Tushare官网接口使用手册,可以查看如何调用各个接口。import tushare as ts # 个人账号tushareToken ts.set_token('dce74e113985d5da2a8dffe05cccdba7c72aa1e0c34601dbb8d2cbc0') pro = ts.pro_api() #调用000001.sz的的历史日线数据 df = pro.daily(ts_code='000001.SZ', start_date='20180701', end_date='20180718') print(df)
至此我们实现了某只股票的交易数据获取。
接下来,我们需要获取当前所有正常上市交易的股票列表,然后获取他们的的历史走势与我们选取的对象做比较。
import tushare as ts # 个人账号tushareToken ts.set_token('dce74e113985d5da2a8dffe05cccdba7c72aa1e0c34601dbb8d2cbc0') pro = ts.pro_api() # 获取当前所有正常上市交易的股票列表 stock_all = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date') for eachCode in stock_all.iterrows(): # 获取历史交易数据 stock_history=ts.get_hist_data(eachCode[1]['symbol']) # 打印调试 print(eachCode[1]['symbol'],eachCode[1]['name']) print(stock_history)
2.认识K线,如何分析走势
当我们描述股票的一根K线组成,会用开盘价open、收盘价close、最高价high、最低价low,因为周期不同,会使得K线表现形式产生差异,因此我们往往在讲K线时,在K线前指明周期,比如:日级K线、60分钟K线、15分钟K线等等。
均线指标是反映价格运行趋势的重要指标,其运行趋势一旦形成,将在一段时间内继续保持。五日均线指的是近5天内收盘价的加权平均价,是均线系统中的短期均线,反映股价或指数的短期运行趋势。如图所示,黑色的是5日均线,黄色为10日均线,粉色为20日均线。
那么我们如何定义一根K线相似,对于单根K线其开盘价、收盘价、最高价、最低价越相似那么它就越相似。同理我们如何定义短期趋势的相似,计算Ma5的相关系数。在统计学中,皮尔逊相关系数( Pearson correlation coefficient),又称皮尔逊积矩相关系数,是用于度量两个变量X和Y之间的相关(线性相关),其值介于-1与1之间。我们可以利用numpy.corrcoef()函数,来计算两个矩阵之间的相关性。那么我们定义两段K线的相似度K=(开盘价相关系数+收盘价相关系数+最低价相关系数+最高价相关系数+5日均线的相似度)/5。
stock_compare=ts.get_hist_data(code)[0:day_range] #获取选取范围的分析对象的交易数据 compare_open=stock_compare['open'] compare_close=stock_compare['close'] compare_high=stock_compare['high'] compare_low=stock_compare['low'] compare_ma5=stock_compare['ma5'] stock_all = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date') stock_all = stock_all[0:100] # 逐一获取A股上市股票的历史走势做比较 for eachCode in stock_all.iterrows(): stock_history=ts.get_hist_data(eachCode[1]['symbol']) # 旧接口获取历史数据,因为就接口直接提供ma5数据 trade_days = len(stock_history) #获取的历史交易数据长度 k_list=[] x_list=[] # /**截取30_days的长度,滑动窗口为5*/ for i in range(5,trade_days, 5): # 截取判空,滑动数据不满足range后跳出 if(i+day_range>=trade_days): break stock_offer=stock_history[i:i+day_range] #截取后的数据 open_o =stock_offer['open'] close_o =stock_offer['close'] high_o =stock_offer['high'] low_o =stock_offer['low'] ma5_o =stock_offer['ma5'] open_k =np.corrcoef(compare_open,open_o)[0][1] #/**-------------计算相关系数-------------------*/ close_k=np.corrcoef(compare_close,close_o)[0][1] high_k =np.corrcoef(compare_high,high_o)[0][1] low_k =np.corrcoef(compare_low,low_o)[0][1] ma5_k =np.corrcoef(compare_ma5,ma5_o)[0][1] ave_k = (open_k+close_k+high_k+low_k+ma5_k)/5
总结
例如:
本文仅仅简单介绍了如何通过tushare数据源获取A股的历史交易数据,通过皮尔逊相关系数实现一种查找相似K线的算法。
资本市场没有新鲜事,历史总是重演但不是简单重复,该方法提供一种实现方法,并不构成投资建议。enjoy🥰!
本文参考了以下博主的文章
如何用Python量化“相似K线”实现形态选股? -
Python 时间序列建模:用指数平滑法预测股价走势
2021-10-11 00:11:16指数平滑方法适用于非平稳数据(即具有趋势和/或季节性的数据),其工作方式类似于指数移动平均线。预测是过去观察的加权平均值。这些模型更加强调最近的观察结果,因为权重随时间呈指数级变小。平滑方... -
Python学员作品-基于Tushare对单只股票进行预测
2020-12-10 02:45:35基于Tushare对单只股票进行预测由于股票数据不是很稳定,受一些政策和其它环境的影响,所以效果不是很好,主要是通过这个小项目具体应用一下。1. ARIMA模型(差分自回归移动平稳模型)ARIMA模型是时间序列预测方法中的... -
python时间序列预测股票走势
2020-11-24 09:09:59首先调用tushare包import tushare as tsimport pandas as pdimport matplotlib.pyplot as plt查自己比较感兴趣的股票,这里我查找的是新能源/燃料电池/氢燃料,在数据库里查找下concept = ts.get_concept_classified... -
利用 TensorFlow 预测股票走势的例子包含 Python 服务器端 Android 端和 iOS 端
2021-02-04 10:20:35利用 TensorFlow 预测股票走势的例子包含 Python 服务器端 Android 端和 iOS 端,完整的代码,非常具有参考性的例子 -
python线性回归预测股票走势
2020-05-27 15:22:40提前说明:虽然最后预测股价和真实价之间有差距,但涨跌的趋势大致相同。而且在预测时没有考虑到涨跌停的因素,所以预测结果的涨跌幅度比真实数据要大。 本人上传只作学习练习笔记作用,并不打算用在实操的 直接... -
【python量化】搭建一个CNN-LSTM模型用于股票价格预测
2021-12-23 00:47:08写在前面下面的这篇文章主要教大家如何搭建一个基于CNN-LSTM的股票预测模型,并将其用于股票价格预测当中。原代码在文末进行获取。1CNN-LSTM模型这篇文章将带大家通过Tensorfl... -
Python-使用Tensorflow运行CNN以预测股票走势,tensorflow股票分析,Python源码.zip.zip
2021-10-14 23:39:53Python-使用Tensorflow运行CNN以预测股票走势,tensorflow股票分析,Python源码.zip.zip -
用Python快速分析和预测股票价格
2019-06-19 17:49:32点击上方“Python数据之道”,选择“星标公众号”精品文章,第一时间送达作者 |Vincent Tatan译者 | 李洁编辑 | Lemonbit出品 | Pyth... -
Python预测基金净值:keras神经网络
2021-01-19 21:36:41有一种观点:利用股票历史股价数据,搭建神经网络深度学习,预测股票未来走势,是外行人士的发神经。原因不外乎这些:首先,现有的量价指标等分析工具,远比仅研究历史股价数据靠谱;其次,涨停板的限制、新股N个... -
基于Python的循环神经网络股票价格预测
2022-01-12 22:08:491.1 训练过程中所有的股票日 K 数据均来自 tushare import tushare pro = ts.pro_api(token) df = pro.daily(ts_code, start_date, end_date) df.to_csv(filename) 二、 数据预处理 2.1 获取到的数据格式如图所示 ... -
一文教你如何用Python预测股票价格
2018-01-25 00:00:00翻译 | AI科技大本营(rgznai100)参与 | 刘畅编辑 | 周翔【AI科技大本营导读】最近,A股尤其是上证指数走势凌厉,让营长有种身在牛市中的错觉。然而大盘天天涨,营长账户中还是那几百万,甚至还有所缩水。夜深人静... -
通过机器学习的线性回归算法预测股票走势(用Python实现)
2019-10-22 10:14:42这里给出以线性回归算法预测股票的案例,以此讲述通过Python的sklearn库实现线性回归预测的技巧。 本文先讲以波士顿房价数据为例,讲述线性回归预测模型的搭建方式,随后将再这个基础上,讲述以线性预测模型预测... -
python深度学习之基于LSTM时间序列的股票价格预测
2021-03-17 19:42:44我们先来看看数据集,这里包含了一只股票的开盘价,最高价,最低价,收盘价,交易量的信息。 本文基于LSTM对收盘价(close)进行预测 2. 单维对单步的预测 我们这是用前n天的数据预测第n+1天的数据。 单维单步的蛤... -
利用Python获取公司股票的利润走势并生成图表
2022-04-02 11:48:20python获取公司的利润走势图 -
Python使用RNN股市预测.zip
2020-09-28 21:14:45股票也不例外,量化交易要做的就是通过数学模型发现股票的走势趋势。“趋势”要这样理解:对于股票的预测,不是说我知道这个股票昨天指数是多少,然后预测今天他的指数能涨到多少。而是,我们通过过去一段时间股票的...