繁体   English   中英

为每个列/行生成一个遵循数学函数的数据框

[英]Generate a Dataframe that follow a mathematical function for each column / row

有没有一种方法可以从头开始创建/生成Pandas DataFrame,以便每个记录都遵循特定的数学函数?

背景:在金融数学中,非常基本的金融衍生产品(例如看跌期权和看跌期权)具有封闭形式的定价公式(例如Black Scholes)。 这些定价公式可以称为随机函数(因为它们涉及随机项)

我正在尝试创建一个股票价格的蒙特卡罗模拟(以及基于股票价格的期权收益和价格)。 我需要1000个路径(行)和100个时间步(列)。 我想“初始化”一个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)

对我来说,您的问题是以下一个问题的特定版本: 基于其他行的熊猫计算 因为您可以枢转,所以我们在谈论行还是列都没有关系。

还有一个与使用列进行计算有关的问题: 基于其他列的熊猫复杂计算 ,建议使用滚动窗口rolling函数)或使用shift函数: 根据上一列的值计算增加或减少百分比熊猫数据框中的同一行

类似计算(或numpypandas讨论)的速度注意事项: Numpy,Pandas:基于先前的N值计算数据集行值的最快方法是什么?

总而言之-您的问题似乎有些重复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM