马尔科夫链预测国内某高校金融数学学子,课余时间对数据分析方向的编程很感兴趣。这是我学习随机过程中对学到的马尔可夫链写下的简单预测方案,~~第一次写博客,不足之处多多包涵

主要思想是首先进行状态划分,利用历史数据计算一步转移概率矩阵,利用公式

math

得到多步转移概率矩阵,对于每个状态,我们取它转向所有状态中“最大可能”的点作为它的预测点即

math

def Markov_forecast(price_data:pd.DataFrame, conclude_P = True):
    # 由于时间跨度过长,为了避免通货膨胀对预测结果发生不利影响
    # 我们采用对数单日收益率进行预测
    log_rate = np.log(price_data.shift(1) / price_data).dropna()
    a = log_rate.describe()
    # 以四分位点作为分界点(四个状态)
    # 根据收益率不可能大于1的特性,做出如下处理
    states = log_rate# 创立副本,防止数据标记广播到原数据
    states[(log_rate>=a.iloc[6])]=4
    states[((log_rate>=a.iloc[5]) & (log_rate<a.iloc[6]))]=3
    states[((log_rate>=a.iloc[4]) & (log_rate<a.iloc[5]))]=2
    states[(log_rate<a.iloc[4])]=1
    # 状态标签完毕
    # 转移概率矩阵计算
    P_matrix = np.zeros((4, 4))
    array =np.array(states)
    if conclude_P == True:# 有需要才会计算
        for j in range(4):
            # 四行,每行单独计算
            for i in range(len(array)-1):
                if (array[i] == j+1 and array[i+1] == 1):
                    P_matrix[j, 0] += 1
                elif (array[i] == j+1 and array[i+1] == 2):
                    P_matrix[j, 1] += 1
                elif (array[i] == j+1 and array[i+1] == 3):
                    P_matrix[j, 2] += 1
                elif (array[i] == j+1 and array[i+1] == 4):
                    P_matrix[j, 3] += 1
            P_matrix[j: ] = P_matrix[j: ]/np.sum(P_matrix[j: ])
    return P_matrix, states

实践环节在下一个帖子

86 views
Comments
登录后评论
Sign In
·

刚发现标题没打标点符号= =