利用Python预测股票价格(1)


股票数据通常可从新浪股票、雅虎股票等网页上获取,此外还有一些炒股软件,如同花顺、通达信等都提供了非常清楚的股票数据展示和图表呈现。如果要获得实时的股票数据,可以考虑使用新浪股票提供的接口获取数据。以大秦铁路(股票代码:601006)为例,如果要获取它的最新行情,只需访问新浪的股票数据接口(具体可以百度),该接口会返回一串文本,例如:

var hq_str_sh601006=“大秦铁路,6.980,6.960,7.010,7.070,6.950,7.010,7.020,121033256,847861533.000,18900, 7.010,214867,7.000,66500,6.990,386166,6.980,336728,6.970,273750,7.020,836066,7.030,630800,7.040,936306,7.050,579400,7.060,2016-03-18,15:00:00,00”;

这个字符串由许多数据拼接在一起,不同含义的数据用逗号隔开了,按照程序员的思路,顺序号从0开始。

0:<大秦铁路>,股票名字

1:<< span=“”>6.980>,今日开盘价

2:<< span=“”>6.960>,昨日收盘价

3:<< span=“”>7.010>,当前价格

4:<< span=“”>7.070>,今日最高价

5:<< span=“”>6.950>,今日最低价

6:<< span=“”>7.010>,竞买价,即“买一”报价

7:<< span=“”>7.020>,竞卖价,即“卖一”报价

8:<< span=“”>121033256>,成交的股票数,由于股票交易以一百股为基本单位,所以在使用时,通常把该值除以一百

9:<< span=“”>847861533.000>,成交金额,单位为“元”,为了一目了然,通常以“万元”为成交金额的单位,所以通常把该

值除以一万

10:<< span=“”>18900>,“买一”申请4695股,即47手

11:<< span=“”>7.010>,“买一”报价

12:<< span=“”>214867>,“买二”

13:<< span=“”>7.000>,“买二”

14:<< span=“”>66500>,“买三”

15:<< span=“”>6.990>,“买三”

16:<< span=“”>386166>,“买四”

17:<< span=“”>6.980>,“买四”

18:<< span=“”>336728>,“买五”

19:<< span=“”>6.970>,“买五”

20:<< span=“”>273750>,“卖一”申报3100股,即31手

21:<< span=“”>7.020>,“卖一”报价

(22,23),(24,25),(26,27),(28,29)分别为“卖二”至“卖四的情况”

30:<< span=“”>2016-03-18>,日期

31:<< span=“”>15:00:00>,时间

这个接口对于JavaScript程序非常方便,如果要查看该股票的日K线图,可访问新浪股票的K线图接口(具体可百度),便可得到日K线图。

在这里插入图片描述

如果要查看该股票的分时线,可访问链接新浪股票的分时线图接口(具体可百度),便可得到分时线图。

在这里插入图片描述

对于周K线和月K线的查询,可分别访问新浪股票的周K线图和月K线图的接口(具体可百度)。Python中我们可以使用pandas_datareader库来获取股票数据,默认是访问yahoofinance的数据,其中包括上证和深证的股票数据,还有港股数据,该库只能获取股票的历史交易记录信息:如最高价、最低价、开盘价、收盘价以及成交量,无法获取个股的分笔交易明细历史记录。上证代码是ss,深证代码是sz,港股代码是hk,比如茅台:6000519.ss,万科000002.sz,长江实业0001.hk。这里以贵州茅台股票为例,说明pandas_datareader库中股票数据的获取方法及简单的可视化,代码如下:

1import pandas as pd

2import pandas_datareader.data as web

3import datetime as dt

4data = web.DataReader(‘600519.ss’,‘yahoo’, dt.datetime(2019,8,1),dt.datetime(2019,8,31))

5data.head()

6 High Low Open Close Volume Adj Close

7# Date

8# 2019-08-01 977.000000 953.020020 976.51001 959.299988 3508952 959.299988

9# 2019-08-02 957.979980 943.000000 944.00000 954.450012 3971940 954.450012

10# 2019-08-05 954.000000 940.000000 945.00000 942.429993 3677431 942.429993

11# 2019-08-06 948.000000 923.799988 931.00000 946.299988 4399116 946.299988

12# 2019-08-07 955.530029 945.000000 949.50000 945.000000 2686998 945.000000

13

14kldata=data.values[:,[2,3,1,0]] # 分别对应开盘价、收盘价、最低价和最高价

15from pyecharts import options as opts

16from pyecharts.charts import Kline

17

18kobj = Kline().add_xaxis(data.index.strftime(“%Y-%m-%d”).tolist()).add_yaxis(“贵州茅台-日K线图”,kldata.tolist()).set_global_opts(

19 yaxis_opts=opts.AxisOpts(is_scale=True),

20 xaxis_opts=opts.AxisOpts(is_scale=True),

21 title_opts=opts.TitleOpts(title=“”))

22kobj.render()

贵州茅台股票日K线图如图。在这里插入图片描述

为给定时间序列的财务图表,代码中对象data包含6个属性,依次为Open(开盘价)、High(最高价)、Low(最低价)、Close(收盘价)、Volume(成交量)、Adjusted(复权收盘价)。基于收盘价的重要性,可从收盘价的历史数据中分割训练集、验证集、测试集,使用适当的特征,建立预测模型,并实施预测。

基于VAR算法的预测


向量自回归(VAR)模型就是非结构化的多方程模型,它的核心思想不考虑经济理论,而直接考虑经济变量时间时序之间的关系,避开了结构建模方法中需要对系统中每个内生变量关于所有内生变量滞后值函数建模的问题,通常用来预测相关时间序列系统和研究随机扰动项对变量系统的动态影响。VAR模型类似联立方程,将多个变量包含在一个统一的模型中,共同利用多个变量信息,比起仅使用单一时间序列的ARIMA等模型,其涵盖的信息更加丰富,能更好地模拟现实经济体,因而用于预测时能够提供更加贴近现实的预测值。此处拟基于贵州茅台股票数据,建立VAR的预测模型。使用后30天的数据作为验证集,剩余的数据用于建立预测模型。本节从VAR模型的平稳性检验出发,依次完成VAR模型的定阶及建模预测,最终通过分析验证集上的准确率来评估预测效果。

平稳性检验


只有平稳的时间序列才能够直接建立VAR模型,因此在建立VAR模型之前,首先要对变量进行平稳性检验。通常可利用序列的自相关分析图来判断时间序列的平稳性,如果序列的自相关系数随着滞后阶数的增加很快趋于0,即落入随机区间,则序列是平稳的;反之,序列是不平稳的。另外,也可以对序列进行ADF检验来判断平稳性。对于不平稳的序列,需要进行差分运算,直到差分后的序列平稳后,才能建立VAR模型。此处首先提取用于建立预测模型的基础数据,并对其进行单位根检验,对应的Python代码如下:

1import statsmodels.tsa.stattools as stat

2import pandas_datareader.data as web

3import datetime as dt

4import pandas as pd

5import numpy as np

6

7data = web.DataReader(‘600519.ss’,‘yahoo’, dt.datetime(2014,1,1),dt.datetime(2019,9,30))

8subdata = data.iloc[:-30,:4]

9for i in range(4):

10 pvalue = stat.adfuller(subdata.values[:,i], 1)[1]

11 print(“指标 “,data.columns[i],” 单位根检验的p值为:”,pvalue)

12# 指标 High 单位根检验的p值为:0.9955202280850401

13# 指标 Low 单位根检验的p值为:0.9942509439755689

14# 指标 Open 单位根检验的p值为:0.9938548193990323

15# 指标 Close 单位根检验的p值为:0.9950049124079876

可以看到,p值都大于0.01,因此都是不平稳序列。现对subdata进行1阶差分运算,并再次进行单位根检验,对应的Python代码如下:

1subdata_diff1 = subdata.iloc[1:,:].values - subdata.iloc[:-1,:].values

2for i in range(4):

3 pvalue = stat.adfuller(subdata_diff1[:,i], 1)[1]

4 print(“指标 “,data.columns[i],” 单位根检验的p值为:”,pvalue)

5# 指标 High 单位根检验的p值为:0.0

6# 指标 Low 单位根检验的p值为:0.0

7# 指标 Open 单位根检验的p值为:0.0

8# 指标 Close 单位根检验的p值为:0.0

如结果所示,对这4个指标的1阶差分单独进行单位根检验,其p值都不超过0.01,因此可以认为是平稳的。

VAR模型定阶


接下来就是为VAR模型定阶,可以让阶数从1逐渐增加,当AIC值尽量小时,可以确定最大滞后期。我们使用最小二乘法,求解每个方程的系数,并通过逐渐增加阶数,为模型定阶,Python代码如下:

1# 模型阶数从1开始逐一增加

2rows, cols = subdata_diff1.shape

3aicList = []

4lmList = []

5

6for p in range(1,11):

7 baseData = None

8 for i in range(p,rows):

9 tmp_list = list(subdata_diff1[i,:]) + list(subdata_diff1[i-p:i].flatten())

10 if baseData is None:

11 baseData = [tmp_list]

12 else:

13 baseData = np.r_[baseData, [tmp_list]]

14 X = np.c_[[1]*baseData.shape[0],baseData[:,cols:]]

15 Y = baseData[:,0:cols]

16 coefMatrix = np.matmul(np.matmul(np.linalg.inv(np.matmul(X.T,X)),X.T),Y)

17 aic = np.log(np.linalg.det(np.cov(Y - np.matmul(X,coefMatrix),rowvar=False))) + 2*(coefMatrix.shape[0]-1)**2*p/baseData.shape[0]

18 aicList.append(aic)

19 lmList.append(coefMatrix)

20

21#对比查看阶数和AIC

22pd.DataFrame({“P”:range(1,11),“AIC”:aicList})

23# P AIC

24# 0 1 13.580156

25# 1 2 13.312225

26# 2 3 13.543633

27# 3 4 14.266087

28# 4 5 15.512437

29# 5 6 17.539047

30# 6 7 20.457337

31# 7 8 24.385459

32# 8 9 29.438091

33# 9 10 35.785909

如上述代码所示,当p=2时,AIC值最小为13.312225。因此VAR模型定阶为2,并可从对象lmList[1]中获取各指标对应的线性模型。

预测及效果验证


基于lmList[1]中获取各指标对应的线性模型,对未来30期的数据进行预测,并与验证数据集进行比较分析,Python代码如下:

1p = np.argmin(aicList)+1

2n = rows

3preddf = None

4for i in range(30):

5 predData = list(subdata_diff1[n+i-p:n+i].flatten())

6 predVals = np.matmul([1]+predData,lmList[p-1])

7 # 使用逆差分运算,还原预测值

8 predVals=data.iloc[n+i,:].values[:4]+predVals

9 if preddf is None:

10 preddf = [predVals]

11 else:

12 preddf = np.r_[preddf, [predVals]]

13 # 为subdata_diff1增加一条新记录

14 subdata_diff1 = np.r_[subdata_diff1, [data.iloc[n+i+1,:].values[:4] - data.iloc[n+i,:].values[:4]]]

15

16#分析预测残差情况

17(np.abs(preddf - data.iloc[-30:data.shape[0],:4])/data.iloc[-30:data.shape[0],:4]).describe()

18# High Low Open Close

19# count 30.000000 30.000000 30.000000 30.000000

20# mean 0.010060 0.009380 0.005661 0.013739

21# std 0.008562 0.009968 0.006515 0.013674

22# min 0.001458 0.000115 0.000114 0.000130

23# 25% 0.004146 0.001950 0.001653 0.002785

24# 50% 0.007166 0.007118 0.002913 0.010414

25# 75% 0.014652 0.012999 0.006933 0.022305

26# max 0.039191 0.045802 0.024576 0.052800

从上述代码第17行可以看出这4个指标的最大百分误差率分别为3.9191%、4.5802%、2.4576%、5.28%,最小百分误差率分别为0.1458%、0.0115%、0.0114%、0.013%,进一步,绘制二维图表观察预测数据与真实数据的逼近情况,Python代码如下:

1import matplotlib.pyplot as plt

2plt.figure(figsize=(10,7))

3for i in range(4):

4 plt.subplot(2,2,i+1)

5 plt.plot(range(30),data.iloc[-30:data.shape[0],i].values,‘o-’,c=‘black’)

6 plt.plot(range(30),preddf[:,i],‘o–’,c=‘gray’)

7 plt.ylim(1000,1200)

8 plt.ylabel(“ " + d a t a . c o l u m n s [ i ] + " "+data.columns[i]+" "+data.columns[i]+"”)

9plt.show()

10v = 100*(1 - np.sum(np.abs(preddf - data.iloc[-30:data.shape[0],:4]).values)/np.sum(data.iloc[-30:data.shape[0],:4].values))

11print(“Evaluation on test data: accuracy = %0.2f%% \n” % v)

12# Evaluation on test data: accuracy = 99.03%
文末有福利领取哦~

👉一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。img

👉二、Python必备开发工具

img
👉三、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
img

👉 四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。(文末领读者福利)
img

👉五、Python练习题

检查学习结果。
img

👉六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
img

img

👉因篇幅有限,仅展示部分资料,这份完整版的Python全套学习资料已经上传

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里无偿获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值