上市公司股价的变化可以直接反映上市公司的经营状况和市场的认可度。股票价格的建模和预测一直是一个难题。最重要的因素是股票价格既有趋势因素又有随机因素。因此,股票市场是一个非常典型的非线性复杂系统。在解决非线性复杂系统建模方面,实践证明混沌理论是一种有效的理论,并在电力、通信等领域取得了一定的理论和应用效果。由于股票市场也是一个非线性的复杂系统,我们能否利用混沌理论的思想和理论来建立股票价格模型?请利用所提供的三只股票的交易数据,使用数学建模方法解决以下问题:
①分析每日、每周和每月的趋势三个股票,和定性或定量分析股票的趋势(包括混沌特征的测试),并给出相关的分析结果(注意:每周和月度数据可以由股票价格的日常数据)。
②根据不同股票价格的趋势,我们尝试建立股票价格趋势和随机性的数学模型,并使用过去的20天的数据来评估模型的预测结果。
③有一个反向现象在股票价格的趋势,也就是说,如果它上升太多,它会下降,如果它下降太多,它将上升,显示一定的周期性变化。请利用问题2的研究结果建立股票价格反转判断模型,并用数据进行检验。
提交的文件应包括:
页表
目录
1—2页的文章
您的解决方案不超过20页,最多24页的摘要,目录,文章
注意:参考列表和任何附录不计入页面限制,应该出现在您的完整解决方案之后。您不应该使用未经授权的图像和材料,其使用受到版权法的限制。确保你在报告中引用了你的想法和材料的来源。
本文验证了三只股票的混沌特征,并预测了它们的涨跌走势。首先,基于混沌理论计算李雅普诺夫指数,验证股票数据的混沌特征;然后建立隐马尔可夫模型(HMM)来预测股票的涨跌趋势。最后,针对股市价格波动的随机性,引入弹性反馈算法提高模型的预测精度。
对于第一个问题,一开始,根据这三只股票近五年的日线、周线和月线图发现,这三只股票总体上都呈现非线性波动上升趋势。然后,测试了三只股票的混沌特征。对库存数据进行对数预处理后,采用自相关数据处理方法确定最佳延迟时间,结合G-P算法得到嵌入维数。最后,采用Wolf方法计算李雅普诺夫指数,验证了股票数据的混沌性。
对于第二个问题,首先,我们建立了HMM,使用正向-后向算法、鲍姆-韦尔奇算法和维特比算法求解HMM所需的参数。其次,我们测试隐藏状态的敏感性。研究发现,不同隐藏状态下的结果无显著差异。最后,我们用近20天的数据对其进行了测试。
对于第三个问题,一开始,在问题2建立的HMM的基础上,采用弹性反馈算法,其中HMM用于预测隐藏状态,弹性反馈算法用于预测分类状态。因此,两者的线性组合可用于进一步预测股票的趋势。之后,再次对模型进行测试,结果表明,三只股票的预测准确率分别提高了15%、10%和5%。
本文的创新之处在于HMM和弹性反馈算法的结合,从而得到了复合态。基于此,可以预测股票的涨跌趋势,进一步提高了模型的预测精度。
假设1:在预测过程中,不考虑市场本身的波动性,只用基本面数据来预测模型。
假设2:在分析过程中,股票涨跌的计算方法与目前常用的方法相同。
假设3:数据在分析过程中可靠;
假设4:建立的模型在可接受的误差范围内有效。
假设5:马尔可夫链在任何时刻的状态只与前一时刻的状态有关,与其他时刻的状态无关。
假设6:观察到的状态仅取决于当前时刻隐马尔可夫链的状态,与其他状态无关。
对问题一的分析
对于第一个问题,我们需要定性分析股票并测试其混沌特征。首先,我们使用Matlab绘制这三只股票从2016年1月到2020年10月的日K线图、周K线图和月度K线图,并在图表中绘制相应的60天平均线和10天平均线。通过分析图表得出,这三只股票都具有非线性波动趋势,其中股票600519近五年增长了730.8%。其次,我们使用李雅普诺夫指数模型运行股票开盘价的相关数据,得出股票开盘价数据混乱的结论;同时,还对其他股票数据进行了测试,结果表明其他五类股票数据也具有混沌特征。
对问题二的分析
对于第二个问题,需要建立库存涨跌的预测模型,用最近二十天的数据来检验。首先,基于混沌理论,主要利用HMM建立库存涨跌预测模型,利用提供的3只股票的数据训练模型的状态转移参数,最后得到HMM所需的参数。然后,根据训练模型,使用最近20天的数据进行回溯测试,并分析模型的预测精度。最后,根据模型精度,分析了HMM存在的问题。
对问题三的分析
对于第三个问题,我们需要考虑股市中的反向现象,从而进一步提高模型的预测精度。因此,首先,根据问题2中建立的模型,使用股票的趋势,将股票的状态分为三类。然后,结合HMM的状态分类结果,采用线性组合建立弹性反馈算法;最后,对模型的预测结果进行了更准确的分析。
1. %% 清空工作区
2. clc
3. clear
4. close all
5. %% 读取数据
6. data1 = xlsread('000400.SZ.SZ.xls');
7. data2 = xlsread('002281.SZ.SZ.xls');
8. data3 = xlsread('600519.SH.SH.xls');
9. %% 混沌因子分析
10. data1=data3;
11. %% 箱线图
12. %箱线图
13. set(0,'defaultfigurecolor','w')
14. opengl hardwarebasic
15. opengl software
16. Date=[];
17. i=1;
18. while i<size(data1,1)
19. Date(i,1)=i;
20. i=i+1;
21. end
22. OpenPrice=data1(:,1); %开盘
23. HighPrice=data1(:,4); %收盘
24. LowPrice=data1(:,3); %最低
25. ClosePrice=data1(:,2); %最高
26. Vol=data1(:,5); %成交量
27. % save Data Date OpenPrice HighPrice LowPrice ClosePrice Vol; %存储mat文件方便下次使用
28. candle(HighPrice,LowPrice,ClosePrice,OpenPrice,'r')%高 低 收 开 红色 时间 时间格式
29. hold on
30. h1=plot(data1(:,7),'Color',[124/255,187/255,0/255]);
31. h2=plot(data1(:,8),'Color',[62/255,43/255,109/255]);
32. h=legend([h1,h2],'M10','M60');
33. legend('boxoff')
34. dates = { '2016-1' '2016-10' '2017-8' '2018-4' '2019-2' '2019-12' '2020-10' }';
35. set(gca,'xtick',0:200:1200) ;%y 轴的增长幅度
36. set(gca,'xticklabel',dates(1:7));
37. set(gca,'fontname','Times New Roman','FontSize',10);
38. xlabel('Time','fontname','Times New Roman','Color','k','FontSize',15)
39. ylabel('Price','fontname','Times New Roman','Color','k','FontSize',15)
40. title('Stock 600519.SH.SH prices change','fontname','Times New Roman','Color','k','FontSize',20);%图形的标题
41. print('3-year','-djpeg','-r1000')
1. function T_mean=period_mean_fft(data)
2. %该函数使用快速傅里叶变换 FFT 计算序列平均周期
3. %data:时间序列
4. %T_mean:返回快速傅里叶变换 FFT 计算出的序列平均周期
5. Y = fft(data); %快速 FFT 变换
6. N = length(Y); %FFT 变换后数据长度
7. Y(1) = [];%去掉 Y 的第一个数据,它是 data 所有数据的和
8. power = abs(Y(1:N/2)).^2;%求功率谱
9. nyquist = 1/2;
10. freq = (1:N/2)/(N/2)*nyquist; %求频率
11. period = 1./freq; %计算周期
12. [mp,index] = max(power);%求最高谱线所对应的下标
13. T_mean=period(index);%由下标求出平均周期
1. from hmmlearn import hmm
2. import numpy as np
3. from matplotlib import pyplot as plt
4. import pandas as pd
5. n = 2 # 6 个隐藏状态
6.
7. data = pd.read_csv('6.csv', index_col=0)
8. volume = data['volume']
9. close = data['close']
10.
11. logDel = np.log(np.array(data['high'])) - np.log(np.array(data['low']))
12. logRet_1 = np.array(np.diff(np.log(close)))
13. logRet_5 = np.log(np.array(close[20:])) - np.log(np.array(close[:-20]))
14. logVol_5 = np.log(np.array(volume[20:])) - np.log(np.array(volume[:-20]))
15.
16. # 保持所有的数据长度相同
17. logDel = logDel[20:]
18. logRet_1 = logRet_1[19:]
19. close = close[20:]
20.
21. Date = pd.to_datetime(data.index[20:])
22. A = np.column_stack([logDel, logRet_5, logVol_5])
23. #print(A)
24. model = hmm.GaussianHMM(n_components=n, covariance_type="full", n_iter=2000).fit(A)
25. hidden_states = model.predict(A)
26.
27. fig1=plt.figure(figsize=(20, 15))
28. ax = plt.subplot(111)
29. ax.set_title(..., fontsize=30)
30. ax.set_xlabel(..., fontsize=30)
31. ax.set_ylabel(..., fontsize=30) # 设置轴标题字体大小
32. for i in range(n):
33. pos = (hidden_states == i)
34. plt.plot_date(Date[pos], close[pos], 'o', label='hidden state %d' % i, lw=2)
35. plt.xticks(fontsize=30)
36. plt.yticks(fontsize=30) # 设置坐标标签字体大小
37. plt.title('Six implicit state distributions 002281.SZ.SZ stock price ')
38. plt.legend(loc='upper left')
39. plt.rcParams.update({'font.size': 20}) #设置图例字体大小
40. #plt.grid(True) #是否要显示网格线
41. plt.xlabel('Time')
42. plt.ylabel('The implicit state of a stock')
43. plt.show()
44. fig1.savefig("C:/Users/19766/Desktop/third/stocks.jpg")
45.
46. res = pd.DataFrame({'Date': Date, 'logReg_1': logRet_1, 'state': hidden_states}).set
_index('Date')
47. series = res.logReg_1
48.
49. templist = []
50. fig2=plt.figure(figsize=(20, 15))
51. ax = plt.subplot(111)
52. ax.set_title(..., fontsize=30)
53. ax.set_xlabel(..., fontsize=30)
54. ax.set_ylabel(..., fontsize=30) # 设置轴标题字体大小
55. for i in range(n):
56. pos = (hidden_states == i)
57. pos = np.append(1, pos[:-1])
58. res['state_ret%d' % i] = series.multiply(pos)
59. data_i = np.exp(res['state_ret%d' % i].cumsum())
60. templist.append(data_i[-1])
61. plt.plot_date(Date, data_i, '-', label='hidden state %d' % i)
62. plt.xticks(fontsize=30)
63. plt.yticks(fontsize=30) # 设置坐标标签字体大小
64. plt.title('Six categories of 002281.SZ.SZ hidden states')
65. plt.legend(loc='upper left')
66. plt.rcParams.update({'font.size': 20}) #设置图例字体大小
67. #plt.grid(True) #是否要显示网格线
68. plt.xlabel('Time')
69. plt.ylabel('The implicit state of a stock')
70. plt.show()
71. fig2.savefig("C:/Users/19766/Desktop/third/predict.jpg")
72.
73.
74. templist = np.array(templist).argsort()
75. long = (hidden_states == templist[-1]) + (hidden_states == templist[-2]) # 买入
76. short = (hidden_states == templist[0]) + (hidden_states == templist[1]) # 卖出
77. long = np.append(0, long[:-1])
78. short = np.append(0, short[:-1])
79.
80. plt.figure(figsize=(20, 15))
81. res['ret'] = series.multiply(long) - series.multiply(short)
82. plt.plot_date(Date, np.exp(res['ret'].cumsum()), 'r-')
83. plt.show()