我想將下面的 R 代碼翻譯成 Python。
它主要是一個隨機程序,我需要將其轉換為 Python。
該代碼實作了具有兩個波動性階段的跳躍程序的馬爾可夫鏈模擬。
set.seed(42)
nSim <- 1E5
tau <- 3
K <- 105
S0 <- 100
rf <- 0.05
vol_lo <- 0.25
vol_hi <- 0.75
lambda <- c(3,2) # away-from-lo, away-from-hi
sim_time_in_lo <- function(state0){
t <- 0
s <- state0
time_lo <- 0
while (t<tau){
dt <- rexp(n=1,lambda[s])
if ((t dt)>tau){ dt <- tau - t}
if (s==1){time_lo <- time_lo dt }
if (s==1){s<-2} else {s <-1}
t <- t dt
}
time_lo
}
tau_lo <- sapply(1:nSim,function(i){sim_time_in_lo(1)})
tau_hi <- tau - tau_lo
total_var <- tau_lo * vol_lo^2 tau_hi * vol_hi^2
drift <- rf * tau-0.5*total_var
randomness <- sqrt(total_var)*rnorm(nSim,)
Python 嘗試如下:
我認為我在熊貓中錯誤地使用了類似 sapply 的功能。
import numpy as np
import pandas as pd
np.random.seed(42)
nSim = 1000
tau = 3
K = 105
S0 = 100
r = 0.05
vol_lo = 0.25
vol_hi = 0.75
lambd = [3,2] # away-from-lo, away-from-hi
def sim_time_in_lo(state0):
t = 0
s = state0
time_lo = 0
while (t<tau):
dt = np.random.exponential(scale = lambd[s],size = nSim)
if (t dt)>tau:
dt = tau - t
elif s == 1:
time_lo = time_lo dt
elif s == 1:
s = 2
else : s = 1
t = t dt
time_lo
df = pd.DataFrame([sim_time_in_lo(1) for i in range(1,nSim)]);df
tau_hi = tau - tau_lo
total_var = tau_lo * vol_lo**2 tau_hi * vol_hi**2
drift = r * tau-0.5*total_var
randomness = np.sqrt(total_var)*np.random.normal(size=nSim)
但我收到一個錯誤
df = pd.DataFrame([sim_time_in_lo(1) for i in range(1,nSim)]);df
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
我的錯誤是什么?
uj5u.com熱心網友回復:
以下是使其運行的一些改進:
nSim = int(1e5)
tau = 3
K = 105
S0 = 100
r = 0.05
vol_lo = 0.25
vol_hi = 0.75
lambd = [3, 2] # away-from-lo, away-from-hi
def sim_time_in_lo(state0):
t = 0
s = state0
time_lo = 0
while t < tau:
dt = np.random.exponential(size=1, scale=1/lambd[s])
if (t dt) > tau:
dt = tau - t
if s == 0:
time_lo = time_lo dt
s = 1
else:
s = 0
t = t dt
if isinstance(time_lo, np.ndarray):
return time_lo[0]
return time_lo
tau_lo = np.array([sim_time_in_lo(0) for i in range(nSim)])
tau_hi = tau - tau_lo
total_var = tau_lo * vol_lo ** 2 tau_hi * vol_hi ** 2
drift = r * tau - 0.5 * total_var
randomness = np.sqrt(total_var) * np.random.normal(size=nSim)
nSim是 1e5,而不是 1000。此語法也適用于 Python,但您需要轉換為 int。- 與 R 不同,Python 使用零索引,因此狀態需要為 0 和 1 才能從
lambd. size指數的引數應為 1,以回傳標量,而不是nSim- 這就是您收到錯誤的原因。- 您必須使用顯式
return陳述句,這與 R 不同(否則 Python 函式 returnNone)。 - 修復了一些奇怪的縮進,這也導致了我認為的問題。
- 首先初始化
time_lo為大小為 1 的陣列,否則有時會回傳標量。然后最后從大小為 1 的陣列中提取標量。 - 使用陣列而不是資料框。(現在不需要匯入熊貓。)
- NB
np.random.exponential的scale引數是 $\beta$,即 $\frac{1}{\lambda}$。的rrexp的rate是$ \ $拉姆達。
uj5u.com熱心網友回復:
你的錯誤是在條件中if (t dt)>tau。dt是一個陣列,它生成(t dt)>tau一個布林值陣列。
使用((t dt)>tau).any()或((t dt)>tau).all()賦予 if 陳述句含義。.all()意味著您希望的每個值都t dt大于 tau,并且.any()意味著如果只有一個值更大,那就足夠了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/380560.html
上一篇:如何處理NumPy中的大整數?
下一篇:如何根據值從串列中選擇r%樣本?
