具有蒙特卡洛模拟计算的数据框下一行问题

问题描述 投票:0回答:1

我想通过基于“命名屏障之前的值”选项的计算从头开始构建数据框。我知道我可以使用蒙特卡洛模拟来解决它,但它无法按照我想要的方式工作。

公式是:

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)))

with:

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)

我将更可能使用最后的代码,并用它来解决问题。

python pandas dataframe montecarlo
1个回答
0
投票

在循环并将所有模拟保存在列表中时,仅用S_1的新值覆盖S_0的值怎么样?像这样:

import numpy as np
import pandas as pd
import random
from scipy.stats import norm


S_0 = 42
T = 2
r = 0.02
sigma = 0.20
trading_days = 50
output = []

for i in range(trading_days):
    z = norm.ppf(random.random())
    value = S_0*np.exp((r - sigma**2 / 2) * T / trading_days + sigma * np.sqrt(T/trading_days) * z)
    output.append(value)
    S_0 = value

df = pd.DataFrame({'simulation': output})

也许我错过了一些东西,但是我看不到需要第二个循环。

而且,这避免了在循环中调用df.append(),应避免。 (请参见here

© www.soinside.com 2019 - 2024. All rights reserved.