您的位置:首页 > 编程语言 > Python开发

通过多项式来拟合股票收盘价的趋势图

2016-09-10 19:18 218 查看
最近在研究Numpy,其功能非常强大,通过线性代数运算避开了很多的循环,从而使计算效率得到了明显的提高。

接下来,我就简单讲解一下,如何通过numpy构造多项式来拟合股票收盘价的趋势图。(如果有哪位朋友对这篇博文有兴趣,希望能够留下您的宝贵建议,我们一起交流学习。

手上有一份数据,是创业环保(股票代码:600874)在8月份的交易行情数据:



其中第4个字段为每天的收盘价。

通过numpy中的loadtxt函数来导入载入数据

c = np.loadtxt('CYHB.csv',delimiter = ',',usecols=(3,),unpack=True)
#其中unpack设为True代表使得不同列的数据分开存储。
#当然还有其他参数,比如coverters,表示可以转换指定列的数据类型,这里用不到。


然后构造一些样本点,再通过numpy中的polyfit函数来构造多项式:

t = np.arange(len(c))
poly = np.polyfit(t,c,6)
#其中c代表需要拟合的对象,6代表要构造一个六次多项式


接下来要求出多项式的极值点,也就是导数为0的位置,但是多项式的导数还是多项式,所以之后还要求出导数函数的根。这些都可以通过numpy中的函数实现,灰常牛逼。。。

der = np.polyder(poly)
result= np.roots(poly,t)
print result
结果为:
[ 73.66730469  53.83198733  32.72301285  18.03165253   1.63883066]
这样看并不直观,我们通过polyval来复核结果,计算出多项式函数的值并在图中画出来:
vals = np.polyval(poly,t)
plot(t,c,lw = 1.0)
plot(t,vals,lw = 2.0)
show()




图中锯齿状的线为真实的趋势图,平滑的线为拟合效果。可以看到效果并不是很好,即使我们已经使用到了6次多项式。

接下来,我们可以先将原趋势图进行平滑化(计算其简单移动平均线),然后再对其拟合,这样效果会好一些。

这次就直接上代码了:

import numpy as np
import os
os.chdir('/home/sunnyin/Project/Python/ProjectOfSelf/Stock')
c = np.loadtxt('CYHB.csv',delimiter = ',',usecols=(3,),unpack=True)
N = 10
weights = np.ones(N)/N
rwa_sma = np.convolve(weights,c)
sma = np.convolve(weights,c)[N-1:-N+1]
t = np.arange(N-1,len(c))
poly = np.polyfit(t,sma,6)
print "Next value: ",np.polyval(poly,t[-1]+1)
der = np.polyder(poly)
vals = np.polyval(poly,t)

plot(t,c[N-1:],lw = 3.0)
plot(t,sma,lw = 2.0)
plot(t,vals,lw = 1.0)
show()

#其中convolve函数是用来计算卷积的,对卷积不懂的可自行维基百科,还带动画哦,清晰易懂。
#权重我设为是一样的
#为什么会取这个区间[N-1:-N+1],是因为在这个区间内,卷积运算中的两个函数是完全重合的,具体讲解如下图所示:




运行以上代码之后,效果图:



可以看到这次拟合其简单移动平均线的效果比较好,当然有兴趣的朋友可以通过改变指数大小来调整拟合效果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  股票 趋势 python 数据