Создать Dataframe, который следует математической функции для каждого столбца / строки - PullRequest
1 голос
/ 30 мая 2019

Есть ли способ создать / сгенерировать Pandas DataFrame с нуля, чтобы каждая запись выполняла определенную математическую функцию?

Справочная информация. В финансовой математике очень простые производные финансовые инструменты (например, колл и пут)имеют закрытые формулы ценообразования (например, Black Scholes).Эти формулы ценообразования можно назвать стохастическими функциями (потому что они включают в себя случайный термин)

Я пытаюсь создать симуляцию Монте-Карло цены акций (и впоследствии выплату опционов и цену, основанную на цене акций),Мне нужно, скажем, 1000 путей (строк) и 100 временных шагов (столбцов).Я хочу «инициировать» фрейм данных, который равен 1000 на 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

Каждый переданный в переменной является константой.В моем случае я хочу, чтобы каждый следующий столбец в той же строке был похож на S_T в коде VBA.Это действительно единственное, что имеет значение.Я хочу применить такую ​​функцию, как 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)

Ответы [ 2 ]

2 голосов
/ 30 мая 2019

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)
0 голосов
/ 30 мая 2019

Для меня ваша проблема - это конкретная версия следующего: Расчеты Панд на основе других строк . Поскольку вы можете поворачиваться, не имеет значения, говорим ли мы о строках или столбцах.

Существует также вопрос, касающийся вычислений с использованием столбцов: Комплексное вычисление Панд на основе других столбцов , в котором есть хорошее предложение использовать скользящее окно (rolling функция) или с использованием shift функция: Рассчитать процентное увеличение или уменьшение на основе значения предыдущего столбца той же строки в кадре данных pandas

Соображения скорости подобных расчетов (или numpy против pandas обсуждение): Numpy, Pandas: какой самый быстрый способ вычисления значения строки набора данных на основе предыдущих значений N?

Подводя итог - кажется, что ваш вопрос несколько дублирует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...