接下来时应用实践环节:
我们采用的数据部分如下所示,可以根据自己的需求选择自己想要预测的数
data = pd.read_csv('.csv')
data_tarin = data.iloc[:-10]# 预留出最后十天用于检验
price_datas = ['open', 'high', 'low', 'close']
P_all = {}
states_all = {}
P_all_round4 = {}
# 创建两个字典存储状态标签与转移概率矩阵
for i in range(4):
P_all[price_datas[i]], states_all[price_datas[i]] = Markov_forecast(data_tarin[price_datas[i]])
P_all_round4[price_datas[i]] = P_all[price_datas[i]].round(4)
P_all_round4
# 字典存储的转移概率矩阵
# 可以看到四组数据的一步转移概率矩阵并不完全相同
### 注意:转移概率矩阵在此时为了观感舒适而保留四位小数,但后续处理必须严格沿用计算得出的直接结果
### 否则会造成马氏链达成平稳的时间极其长,结果也不再准确
查看一步转移概率矩阵如下,可以用热力图来直观表达
!](https://image.hackertalk.net/filters:format(webp)/pub/Dpz911-N9VkOdr)
还有后续,在我的下一个帖子上 然后是达成极限分布(平稳分布)所需天数,以及最终的平稳分布
# 因此我们得出四套数据的流动方向,状态是一致的,取其中一个研究即可
stabilizationperiod = {}
limiting_distribution = {}
for j in range(4):
for i in range(10000):
P_matrix = P_all[price_datas[j]]
if np.allclose(np.linalg.matrix_power(P_matrix, i), np.linalg.matrix_power(P_matrix, i+1)) == True:
# 保留一定的误差,完全相同则会导致则天数过多
break
# 用Python计算的时候,如果用scipy.linalg里面的solve,会有问题,因为这个方法要求传入的是一个方阵
# 可是这里有五个方程,四个未知数,无法求出。
# Return the least-squares solution to a linear matrix equation.
# 用最小二乘法来求解,P_matrix是系数矩阵,b是结果
P_matrix = P_matrix-np.eye(4)
P_matrix = np.append(P_matrix,np.array([1,1,1,1])).reshape(-1,4)
junyun = np.linalg.lstsq(P_matrix,np.array([0,0,0,0,1]))# 最终股票的分布
limiting_distribution[price_datas[j]] = junyun[0]
stabilizationperiod[price_datas[j]] = i
stabilizationperiod
# 达成平稳所需天数
# 如果采用截取四位小数的转移矩阵进行计算会导致达成平稳的天数超出10000天,误差也会变得很大
limiting_distribution