对现有的股票数据进行预测并用matplotlib绘图

本文所用文件的百度云链接:

链接: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()

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在MATLAB中,可以使用灰度图来展示矩阵中不同数值所对应的区域。可以通过设置不同深度的灰度值来区分不同的数值。以下是一个示例代码,展示了如何使用灰度图进行模型预测画图: ```matlab % 假设已经有了要预测的原始数据 x0 和预测的期数 predict_num % 调用子函数 metabolism_gm11 进行预测 result = metabolism_gm11(x0, predict_num); % 绘制灰度图 figure; imshow(result, 'Colormap', gray); % 设置不显示坐标轴标签 set(gca, 'Visible', 'off'); % 设置在画布上全屏显示 set(gcf, 'Units', 'Normalized', 'OuterPosition', \[0, 0, 1, 1\]); % 保存图像 saveas(gcf, 'prediction_gray.png'); ``` 请注意,上述代码中的 `metabolism_gm11` 是一个子函数,用于使用新陈代谢的GM(1,1)模型对数据进行预测。你可以根据自己的需求修改该函数或者使用其他预测模型。同时,你也可以根据需要调整灰度图的显示效果,例如调整灰度值的范围、添加颜色条等。 希望以上代码能够帮助你实现在MATLAB中进行灰度图的模型预测画图。 #### 引用[.reference_title] - *1* [matlab 绘制灰度图](https://blog.csdn.net/qq_22163371/article/details/129580524)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [灰色预测(MATLAB)](https://blog.csdn.net/qq_53471484/article/details/125839119)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值