Python 使用精确解对均值回复过程向量进行矢量化

问题描述

我有三个 Vasicek 进程。

我通过 numpy 函数 random.multivariate_normal(MeanVect,CovMat) 模拟这些过程。

MeanVect 是系数矩阵的点积,即下对角线,以及这三个变量的值。

可以这样写。

令 Rho = 系数矩阵(3x3 numpy 数组) 让 F_0 = 变量值(1x3 numpy 数组)

MeanVect = np.dot(Rho,F_0)

协方差矩阵是单位矩阵。

我想模拟这三个因素的 n 个路径。 (因为这是一个精确的解决方案,我不需要小的时间步长,只需要三个变量的实现值的时间)。

目前我可以使用循环来完成此操作。

注意:time_step 内置于协方差矩阵中。

import numpy as np

def F__t(F_0):
    
    MeanVect = np.dot(Rho,F_0)

    CovMat = np.identity(3)

    x,y,z = np.random.multivariate_normal(MeanVect,CovMat)

    return [x,z]

F_t = [0,0]

n = 100
t = 10

for sim in range(n):
    #Do some other stuff
    for step in range(t):
        F_t = F__t(F_t)
        #Do some stuff

这里的代码必须经过每个模拟。我认为它可以在没有外循环的情况下完成,当涉及到 MeanVect 时,我被卡住了。

例如我可以做

np.random.multivariate_normal(np.dot(Rho,F_t),np.identity(3),(n,1))

要在时间步长 1 中获得三个变量的 n 个值。我不确定如何为时间步长 2 生成三个变量的 n 个值,此时 n 次绘制中的每一次的 MeanVect 都会不同。

>

在单个变量的情况下,例如 Ornstein-Uhlenbeck 过程,可以通过代码对过程进行矢量化

import pandas as pd
import numpy as np
def OU_estimation(M=100000,N=25,T=25,sigma=.1,mu=1,lambda_est=1,S0=1):
    dt = T/N # simulation time step 
    S = np.zeros((M,N+1))
    S[:,0] = S0
    for n in range(N):
        #Partially vectorized
        eps = np.random.normal(0,1,(M))
        S[:,n+1] = S[:,n] + lambda_est*(mu - S[:,n])*dt + sigma*eps 
    df = pd.DataFrame(S)
    return df

任何关于如何进步的建议将不胜感激,如果实际上可以消除这两个循环,那将是一个真正的奖励。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)