马尔可夫链模型实际运用(以金融领域为例)(超详细代码)

Posted 漩涡脆波波

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了马尔可夫链模型实际运用(以金融领域为例)(超详细代码)相关的知识,希望对你有一定的参考价值。

运用马尔可夫链模型进行量化金融分析

文章目录

1 介绍马尔可夫模型


2 数据格式与处理

数据来源于锐思数据库平安银行2021年1月1日至7月1日股票收盘价数据,共119条,部分数据及数据格式如下:

这119天平安银行股票的日收盘价的均值为22.51标准差为1.44
根据均值-标准差分级法对平安银行的股票日收盘价进行状态划分,如下图所示:

根据得到的状态分级表,对2021年1月1日至2021年7月1日期间的119条平安银行股票的日收盘价序列进行状态划分结果如下图:

根据天数-状态等级图进一步得到转频数矩阵转移概率矩阵为:


由一步转移频数矩阵可以得到边际概率值为:p1=20/119,p2=21/119,p3=35/119,p4=25/119,p5=18/119。统计量的值,如下表:

3 预测结果

通过查看数据可得,7月1日的收盘价为23.2,处于稳定区间,设其状态N为:[0,0,1,0,0]
根据状态转移概率矩阵于7月1日状态矩阵预测2021年7月2日平安银行收盘价状态矩阵为:
[0,0.212,0.588,0.2,0.158]
可得,7月2日股票处于稳定状态得概率大于50%,预测7月2日平安银行股票收盘价处于稳定状态,即在[21.78,23,22)区间内。

4 结果检验

通过在锐思数据库中查看2021年平安银行7月2日得股票收盘价可知,该天得收盘价为21.8,处于稳定状态,表明预测成功。

5 代码(含标注)

import math
import numpy as np
import pandas as pd
import xlwt

data=pd.read_csv('lh期末.csv',encoding='gbk')
dadie=0
xiadie=0
wending=0
shangzhang=0
dazhang=0
a=[]
b=[]
c=[]
d=[]
e=[]
#print(data)
counter=np.array(data)
# print(list(counter[:,1]))
set=list(counter[:,1])
#按照范围将数据分段并统计不同分段的数的个数
# 第一天 平稳 2
# 第二天 大跌 3
# 第三天 平稳 4
# 第四天 平稳 5
# 第五天 上涨 6
for i in set:
    if 0<i<21.06:
        dadie=dadie+1
        a.append(i)
    elif 21.06<=i<21.78:
        xiadie=xiadie+1
        b.append(i)
    elif 21.78<=i<23.22:
        wending=wending+1
        c.append(i)
    elif 23.22<=i<23.94:
        shangzhang=shangzhang+1
        d.append(i)
    elif i>=23.29:
        dazhang=dazhang+1
        e.append(i)
print("******************不同状态的数量*********************")
print("大跌个数为:",dadie)
print("下跌个数为:",xiadie)
print("稳定的个数为:",wending)
print("上涨的个数为:",shangzhang)
print("大涨的个数为:",dazhang)
# print(a)
# print(b)
# print(c)
# print(d)
# print(e)
#将不同数据原始数据里的是数据转换成等级
# for i in range(len(set)):
#     if set[i]in a:
#         set[i]=1
#     elif set[i] in b:
#         set[i]=2
#     elif set[i] in c:
#         set[i]=3
#     elif set[i] in d:
#         set[i]=4
#     elif set[i] in e:
#         set[i]=5
#print(set)
#print(n)
#将数据变成数据类型为[什么类型,第几天]
# set1=[]
# for i in range(len(set)):
#     set1.append([i+1,set[i]])
# print(set1)
#制作1-119的数组
# hhh=[]
# for i in range(1,120):
#     hhh.append(i)
# print(hhh)

#*********************************************************画图**************************************
# pyplot 是专门用来画图的存在于matplotlib里面的函数
# from matplotlib import pyplot as plt
#
# # 设置图片大小
# fig = plt.figure(figsize= (20,8),dpi = 80) # plt.figure用来设置图像大小,dpi参数调节图片清晰度
# x = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 5, 4, 5, 5, 5, 5, 5, 4, 5, 4, 3, 3, 3, 3, 2, 2, 2, 3, 3, 3, 2, 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 1, 1, 2, 2, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4, 3, 3, 4, 4, 4, 4, 5, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 4, 4, 4, 5, 5, 5, 5, 5, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 3, 3, 3, 3]
# y = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119]
#  # x,y一起组成了要绘制图形的图标
#
# # 绘图
# # plot中参数的含义分别是横轴值,纵轴值,线的形状,颜色,透明度,线的宽度和标签
# plt.plot(x, y, 'ro-', color='black', alpha=1, linewidth=1)  # 传入x,y绘制出折线图
# plt.xlabel('x轴数字')
# plt.ylabel('y轴数字')
# # 设置x轴刻度
# plt.xticks(x) # 设置x轴刻度 可以以plt.xticks(range(2,26))的样式来调节x刻度参数
# # 另一种一列表的形式来传递步长
# # _xtick_labels = [i/2 for i in range(4,49)]
# # plt.xticks(_xtick_labels)   同时也可以在这一步里面设置步长plt.xticks(_xtick_labels[::3])
# # 传y的时候 plt.yticks(range(min(y),max(y)+1)) +1以免最后一个取不到 直接最大值最小值 刻度不均匀,range无意义
# # 保存图片
# plt.savefig("./sig_size.png")  # 保存图片 要在绘制之后保存 plt.savefig保存图片 保存为svg这种矢量图,放大不会有锯齿
#
# # 展示图形
# plt.show()  # 在执行程序的同时显示出图形

#******************************************将数据导出为文件
# import openpyxl
# data = ... #此处是要写入的数据
# wb = openpyxl.Workbook()
# ws = wb.create_sheet("test")

#写数据函数cell,cell中column和row至少为1
# for i in range(1,len(set1)):
#     for j in range(1,2):
#         ws.cell(row=i, column = j, value = set1[i][j])
# import xlwt
# import xlrd
# #xlwt,xlrd是python将数据导入excel表格使用的库
#
# wb = xlwt.Workbook()
# # 添加一个表
# ws = wb.add_sheet('test')

#添加数据使用.write函数(横坐标,纵坐标,内容)注意横纵坐标从0开始,横纵坐标即对于excel而言
##################################################将数据导出为excel#########################
# for i in range(len(set1)):
#     for j in range(0,2):
#         ws.write(i,  j,  set1[i][j])
#例:ws.write(0, 0, '股票编号')
#   ws.write(0, 0, a),a是变量

#将数据导出,保存格式为xxx.xls。其中xxx与上文表名同步
#注意此处一定要保存为.xls形式,如果是xlsx会打不开
# wb.save('succees.xls')
################################求转移矩阵和转移概率矩阵##################


# 转移频数矩阵
a = np.mat([[10,6,0,0,0],
            [10,8,7,5,3],
            [0,7,20,7,0],
            [0,0,3,5,7],
            [0,0,3,8,8]
            ])
# print(np.sum(a[0,:])) #计算行的和
# print(np.sum(a[:,0])) #计算列的和
# print(a[1,1])
#计算状态转移概率
sum=[]
for i in range(len(a)):
    sum.append(np.sum(a[i,:]))
print("*********************行的和**********")
print(sum)
gaiv=[]
juzhen=[]
for i in range(len(sum)):
    以上是关于马尔可夫链模型实际运用(以金融领域为例)(超详细代码)的主要内容,如果未能解决你的问题,请参考以下文章

机器学习——隐马尔可夫模型

随机模型(stochastic models)

从马尔可夫模型到隐马尔可夫模型

备战数学建模21-马尔可夫算法

01 隐马尔可夫模型 - 马尔可夫链、HMM参数和性质

隐马尔可夫模型