为每一列/行生成一个遵循数学函数的数据框
Generate a Dataframe that follow a mathematical function for each column / row
有没有办法从头开始 create/generate 一个 Pandas DataFrame,这样每条记录都遵循特定的数学函数?
背景:在金融数学中,非常基本的金融衍生品(例如看涨期权和看跌期权)具有封闭形式的定价公式(例如 Black Scholes)。这些定价公式可以称为随机函数(因为它们涉及随机项)
我正在尝试创建一个 Monte Carlo 股票价格模拟(以及随后基于股票价格的期权收益和价格)。比方说,我需要 1000 条路径(行)和 100 个时间步长(列)。我想要 "initiate" 一个 1000 x 100 并遵循随机方程的数据框。
# Psuedo-code
MonteCarloDF = DataFrame(rows=1000, columns=100, customFunc=TRUE,
appliedBy='by column',
FUNC={s0=321;
s_i=prev*exp(r-q*sqrt(sigma))*T +
(etc)*NormDist(rnd())*sqr(deltaT)}
)
每一行的第0列就是321,后面的每一列都是根据上面的FUNC
计算出来的。
这是在 VBA
中完成的类似操作的示例
Function MonteCarlo_Vanilla_call(S, K, r, q, vol, T, N)
sum = 0
payoff = 0
For i = 1 To N
S_T = S * Exp((r - q - 0.5 * vol ^ 2) * T + vol * Sqr(T) * Application.NormSInv(Rnd()))
payoff = Application.Max(S_T - K, 0)
sum = sum + payoff
Next i
MonteCarlo_Vanilla_call = Exp(-r * T) * sum / N
End Function
每一个传入的变量都是常量。
在我的例子中,我希望同一行中的每一列都像 VBA 代码中的 S_T
一样。这真的是唯一重要的。我想应用 S_T = S * Exp((r - q - 0.5 * vol ^ 2) * T + vol * Sqr(T) * Application.NormSInv(Rnd()))
之类的函数。每个 S_T
是同一行中的下一列。有 N
列进行一次模拟。例如,我将进行 1000 次模拟。
321 | 322.125 | 323.277 | ... | column 100 value
321 | 320.704 | 319.839 | ... | column 100 value
321 | 321.471 | 318.456 | ... | column 100 value
...
row 1000| etc | etc | ... | value (1000,100)
IIUC,您可以创建自己的函数来生成 DataFrame
。
在函数中迭代使用 .iloc
[:, -1]
以使用最后创建的列。
我们还将使用 numpy.random.randn
生成一组正态分布的随机值。
您可能需要调整变量的默认值,但想法是这样的:
函数
import pandas as pd
import numpy as np
from math import exp, sqrt
def monte_carlo_df(nrows,
ncols,
col_1_val,
r=0.03,
q=0.5,
sigma=0.002,
T=1.0002,
deltaT=0.002):
"""Returns stochastic monte carlo DataFrame"""
# Create first column
df = pd.DataFrame({'s0': [col_1_val] * nrows})
# Create subsequent columns
for i in range(1, ncols):
df[f's{i}'] = (df.iloc[:, -1] * exp(r - q * sqrt(sigma)) * T
+ (np.random.randn(nrows) * sqrt(deltaT)))
return df
使用示例
df = monte_carlo_df(nrows=1000, ncols=100, col_1_val=321)
对我来说,您的问题是以下版本的特定版本:Pandas calculations based on other rows。既然您可以旋转,那么我们谈论的是行还是列应该无关紧要。
还有一个关于使用列计算的问题:Pandas complex calculation based on other columns which has a good suggestion of using a rolling window (rolling
function) or using shift
function:
类似计算的速度考虑(或numpy
vs pandas
讨论):
总而言之 - 您的问题似乎有些重复。
有没有办法从头开始 create/generate 一个 Pandas DataFrame,这样每条记录都遵循特定的数学函数?
背景:在金融数学中,非常基本的金融衍生品(例如看涨期权和看跌期权)具有封闭形式的定价公式(例如 Black Scholes)。这些定价公式可以称为随机函数(因为它们涉及随机项)
我正在尝试创建一个 Monte Carlo 股票价格模拟(以及随后基于股票价格的期权收益和价格)。比方说,我需要 1000 条路径(行)和 100 个时间步长(列)。我想要 "initiate" 一个 1000 x 100 并遵循随机方程的数据框。
# Psuedo-code
MonteCarloDF = DataFrame(rows=1000, columns=100, customFunc=TRUE,
appliedBy='by column',
FUNC={s0=321;
s_i=prev*exp(r-q*sqrt(sigma))*T +
(etc)*NormDist(rnd())*sqr(deltaT)}
)
每一行的第0列就是321,后面的每一列都是根据上面的FUNC
计算出来的。
这是在 VBA
中完成的类似操作的示例Function MonteCarlo_Vanilla_call(S, K, r, q, vol, T, N)
sum = 0
payoff = 0
For i = 1 To N
S_T = S * Exp((r - q - 0.5 * vol ^ 2) * T + vol * Sqr(T) * Application.NormSInv(Rnd()))
payoff = Application.Max(S_T - K, 0)
sum = sum + payoff
Next i
MonteCarlo_Vanilla_call = Exp(-r * T) * sum / N
End Function
每一个传入的变量都是常量。
在我的例子中,我希望同一行中的每一列都像 VBA 代码中的 S_T
一样。这真的是唯一重要的。我想应用 S_T = S * Exp((r - q - 0.5 * vol ^ 2) * T + vol * Sqr(T) * Application.NormSInv(Rnd()))
之类的函数。每个 S_T
是同一行中的下一列。有 N
列进行一次模拟。例如,我将进行 1000 次模拟。
321 | 322.125 | 323.277 | ... | column 100 value
321 | 320.704 | 319.839 | ... | column 100 value
321 | 321.471 | 318.456 | ... | column 100 value
...
row 1000| etc | etc | ... | value (1000,100)
IIUC,您可以创建自己的函数来生成 DataFrame
。
在函数中迭代使用 .iloc
[:, -1]
以使用最后创建的列。
我们还将使用 numpy.random.randn
生成一组正态分布的随机值。
您可能需要调整变量的默认值,但想法是这样的:
函数
import pandas as pd
import numpy as np
from math import exp, sqrt
def monte_carlo_df(nrows,
ncols,
col_1_val,
r=0.03,
q=0.5,
sigma=0.002,
T=1.0002,
deltaT=0.002):
"""Returns stochastic monte carlo DataFrame"""
# Create first column
df = pd.DataFrame({'s0': [col_1_val] * nrows})
# Create subsequent columns
for i in range(1, ncols):
df[f's{i}'] = (df.iloc[:, -1] * exp(r - q * sqrt(sigma)) * T
+ (np.random.randn(nrows) * sqrt(deltaT)))
return df
使用示例
df = monte_carlo_df(nrows=1000, ncols=100, col_1_val=321)
对我来说,您的问题是以下版本的特定版本:Pandas calculations based on other rows。既然您可以旋转,那么我们谈论的是行还是列应该无关紧要。
还有一个关于使用列计算的问题:Pandas complex calculation based on other columns which has a good suggestion of using a rolling window (rolling
function) or using shift
function:
类似计算的速度考虑(或numpy
vs pandas
讨论):
总而言之 - 您的问题似乎有些重复。