本文所用文件的百度云链接:
链接:https://pan.baidu.com/s/15-qbrbtRs4frup24Y1i5og
提取码:pm2c
线性预测
假设一组数据符合一种线性规律, 那么就可以预测未来将会出现的数据.
a b c d e f g h ....
ax + by + cz = d
bx + cy + dz = e
cx + dy + ez = f
np提供了求解三元一次方程组的相关API,其实原理很简单,就是矩阵运算,可以参考线性代数中利用矩阵求解非线性方程组的唯一解,求出拟合系数代入方程即可:
x = np.linalg.lstsq(A, B)
观察一下数据,一部分是日期,另一部分则是当天的收盘价。绘制一下这些数据。如图:可以看出每天的收盘价是有一个波动的,然后我们按照这个数据来进行预测,首先申明,这个预测仅仅为了演示数据处理的相关方法,并不能用于炒股的实际应用。
整理三元一次方程组, 基于线性模型, 实现线性预测
如下代码就是一个预测过程:
首先根据现有的数据计算出要预测的数据的数量。因为是预测,所以需要一定的依据,这里我们利用前10天的数据来预测后一天的结果,所以N=5,pred_vals是预测的所有结果的数组。
N = 5
pred_vals = np.zeros(closing_prices.size-2*N+1)
然后开始进行预测,每次预测的时候,都将10天的数据构建成一个5*5的矩阵,将6到10天的数据作为前五天的输出,这就相当于列了一个五元一次方程组,其实这样的构建方式并没有什么依据,只是自己设计的,后面自己如果做数据处理写算法就会知道,算法都是自己设计的,效果好不好,只能看结果。
for i in range(pred_vals.size):
A = np.zeros((N, N))
for j in range(N):
A[j,] = closing_prices[j+i:i+j+N]
B = closing_prices[i+N:i+N*2]
这里的解方程其实就是矩阵求解,其实就是高斯约旦消元法求逆矩阵,然后得出x的解,也就是变换矩阵,再将变换矩阵逐个与对应需要预测的矩阵B相乘,就可以得到想要预测的结果pred。
x = np.linalg.lstsq(A, B)[0]
pred = B.dot(x) # B点乘x [3]*x + [4]*y + [5]*z
pred_vals[i] = pred
然后看一下案例的完整代码和预测结果:看一下结果总体来说预测的走势还是差不多的,但是会有一些极端值的问题,当然这只是最简单的预测。
"""
线性预测
"""
import numpy as np
import matplotlib.pyplot as mp
import datetime as dt
import matplotlib.dates as md
# 当numpy解析文本时,将会把第一列中的每个字符串
# 都传给函数进行处理, 将处理完毕后的返回值
# 转成需要的M8[D]类型
def dmy2ymd(dmy):
dmy = str(dmy, encoding='utf-8')
# 把dmy转成日期对象
d = dt.datetime.strptime(dmy, '%d-%m-%Y')
t = d.date()
s = t.strftime('%Y-%m-%d')
return s
# 加载文件
dates, closing_prices = np.loadtxt(
'../da_data/aapl.csv', delimiter=',',
usecols=(1,6), unpack=True,
dtype='M8[D], f8' ,
converters={1:dmy2ymd})
# 绘制收盘价
mp.figure('Linear Predict', facecolor='lightgray')
mp.title('Linear Predict', fontsize=18)
mp.xlabel('Date', fontsize=14)
mp.ylabel('Price', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
# 设置主刻度定位器为每周一
ax = mp.gca()
ax.xaxis.set_major_locator(
md.WeekdayLocator(byweekday=md.MO))
ax.xaxis.set_major_formatter(
md.DateFormatter('%Y/%m/%d'))
# 把M8[D]转为matplotlib识别的date类型
dates = dates.astype(md.datetime.datetime)
mp.plot(dates, closing_prices,
color='dodgerblue', linewidth=1,
linestyle='--', label='closing_prices')
# 整理三元一次方程组, 基于线性模型, 实现线性预测
N = 5
pred_vals = np.zeros(closing_prices.size-2*N+1)
# print(dates.shape)
for i in range(pred_vals.size):
A = np.zeros((N, N))
for j in range(N):
A[j,] = closing_prices[j+i:i+j+N]
# print(A)
B = closing_prices[i+N:i+N*2]
# print(B)
x = np.linalg.lstsq(A, B)[0]
print(x)
pred = B.dot(x) # B点乘x [3]*x + [4]*y + [5]*z
pred_vals[i] = pred
# print(pred_vals)
# 绘制预测折线图
mp.plot(dates[2*N:], pred_vals[:-1], 'o-',
color='red', label='Predict Prices')
mp.legend()
# 自动格式化x轴的日期输出
# mp.gcf().autofmt_xdate()
mp.show()