Как перебрать Pandas DataFrame или Numpy Arrays с помощью собственной функции? - PullRequest
0 голосов
/ 17 апреля 2019

Для моей диссертации мне нужна подразумеваемая изменчивость опций, я уже создал для нее следующую функцию:

#Implied volatility solver
def Implied_Vol_Solver(s_t,K,t,r_f,option,step_size):
#s_t=Current stock price, K=Strike price, t=time until maturity, r_f=risk-free rate and option=option price,stepsize=is precision in stepsizes
    #sigma set equal to steps to make a step siz equal to the starting point
    sigma=step_size
    while sigma < 1:
        #Regualar BlackScholes formula (current only call option, will also be used to calculate put options)
        d_1=(np.log(s_t/K)+(r_f+(sigma**2)/2)*t)/(sigma*(np.sqrt(t)))
        d_2=d_1-np.square(t)*sigma
        P_implied=s_t*norm.cdf(d_1)-K*np.exp(-r_f*t)*norm.cdf(d_2)
        if option-(P_implied)<step_size:
            #convert stepts to a string to find the decimal point (couldn't be done with a float)
            step_size=str(step_size)
            #rounds sigma equal to the stepsize
            return round(sigma,step_size[::-1].find('.'))
        sigma+=step_size
    return "Could not find the right volatility"

Переменные, которые мне нужны, находятся в Pandas DataFrame, и я уже создал цикл для него, чтобы проверить, работает ли он (я добавлю другие переменные, когда он будет работать правильно):

for x in df_option_data['Settlement_Price']:
    df_option_data['Implied_Volatility']=Implied_Vol_Solver(100,100,1,0.01,x,0.001)

Однако при запуске этого цикла я получу 0,539 для всего столбца Implied_Voltality, и эти числа должны отличатьсячто я не так делаю?Или есть более простые решения?

Я также попробовал следующее:

df_option_data['Implied_Volatility']=Implied_Vol_Solver(100,100,1,0.01,np.array(df_option_data['Settlement_Price']),0.001)

Но затем я получаю следующую ошибку:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

По сути, мне нужно следующее: Фрейм данных с 5столбцы для входных переменных и 1 столбец с выходными переменными (подразумеваемая волатильность), который рассчитывается функцией.

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Вы заменяете результат с Implied_Vol_Solver на весь столбец вместо конкретной ячейки.

Попробуйте выполнить следующее:

df_option_data['Implied_Volatility'] = df_option_data['Settlement_Price'].apply(lambda x: Implied_Vol_Solver(100,100,1,0.01,x,0.001))

Функция apply может применять функциюко всем элементам в столбце данных, так что вам не нужно делать цикл for самостоятельно.

0 голосов
/ 17 апреля 2019

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

def Implied_Vol_Solver(row):
    s_t = row['s_t']  # or whatever the column is called in the dataframe
    k = row['k']  # and so on and then leave the rest of your logic as is

Как только вы изменили функцию, вы можете использовать ее следующим образом:

df_option_data['Implied_Volatility'] = df_option_data.apply(Implied_Vol_Solver, axis=1)
...