我想从头开始构建一个数据帧,并基于命名屏障选项之前的值进行计算。我知道我可以用蒙特卡罗模拟来解决这个问题,但它不能按我想要的方式工作
公式是:
Value in row before * np.exp((r-sigma**2/2)*T/TradingDays+sigma*np.sqrt(T/TradingDays)*z)
我编写的第一个代码只计算第一列。我知道我需要第二个循环,但无法真正管理它
结果应该是,对于每次模拟,它将使用之前的值计算一个新值,对于500天,这意味着S_1应为S_500,总共1000次模拟。(在使用公式之前,我需要根据该值生成新列。) 与此类似: 所以对于1。模拟500天,2。模拟500天等等
import numpy as np
import pandas as pd
from scipy.stats import norm
import random as rd
import math
simulation = 0
S_0 = 42
T = 2
r = 0.02
sigma = 0.20
TradingDays = 500
df = pd.DataFrame()
for i in range (0,TradingDays):
z = norm.ppf(rd.random())
simulation = simulation + 1
S_1 = S_0*np.exp((r-sigma**2/2)*T/TradingDays+sigma*np.sqrt(T/TradingDays)*z)
df = df.append ({
'S_1':S_1,
'S_0':S_0
}, ignore_index=True)
df = df.round ({'Z':6,
'S_T':2
})
df.index += 1
df.index.name = 'Simulation'
print(df)
我在这里找到了另一个可能的代码,它确实解决了这个问题,但是对于一行,下一行的计算是相同的Generate a Dataframe that follow a mathematical function for each column / row
如果我用公式来代替它,我会遇到同样的问题
替换:
exp(r - q * sqrt(sigma))*T+ (np.random.randn(nrows) * sqrt(deltaT)))
与:
exp((r-sigma**2/2)*T/nrows+sigma*np.sqrt(T/nrows)*z))
import numpy as np
import pandas as pd
from scipy.stats import norm
import random as rd
import math
S_0 = 42
T = 2
r = 0.02
sigma = 0.20
TradingDays = 50
Simulation = 100
df = pd.DataFrame({'s0': [S_0] * Simulation})
for i in range(1, TradingDays):
z = norm.ppf(rd.random())
df[f's{i}'] = df.iloc[:, -1] * np.exp((r-sigma**2/2)*T/TradingDays+sigma*np.sqrt(T/TradingDays)*z)
print(df)
我更可能使用最后一个代码并用它解决问题
在循环并将所有模拟保留在一个列表中时,用新的值S_1覆盖S_0的值,怎么样? 像这样:
也许我遗漏了什么,但我不认为有必要进行第二次循环
此外,这消除了在循环中调用
df.append()
,这应该避免。(见here)基于bartaelterman答案的解决方案,非常感谢
相关问题 更多 >
编程相关推荐