ValueError:系列的真值不明确。使用函数和 pandas df

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

希望使用数据框元素运行函数来创建新列 (IV),但该函数卡在下面的行上。

错误: ValueError:系列的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

线:if (abs(diff) < PRECISION):

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

N = norm.cdf

def bs_call(S, K, T, r, vol):
    d1 = (np.log(S/K) + (r + 0.5*vol**2)*T) / (vol*np.sqrt(T))
    d2 = d1 - vol * np.sqrt(T)
    return S * norm.cdf(d1) - np.exp(-r * T) * K * norm.cdf(d2)

def bs_vega(S, K, T, r, sigma):
    d1 = (np.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T))
    return S * norm.pdf(d1) * np.sqrt(T)

def find_vol(target_value, S, K, T, r, *args):
    MAX_ITERATIONS = 200
    PRECISION = 1.0e-5
    sigma = 0.5
    for i in range(0, MAX_ITERATIONS):
        price = bs_call(S, K, T, r, sigma)
        vega = bs_vega(S, K, T, r, sigma)
        diff = target_value - price  # our root


        if (abs(diff) < PRECISION):
            return sigma
        sigma = sigma + diff/vega # f(x) / f'(x)

    print(sigma)
    return sigma # value wasn't found, return best guess so far


S = df['ClosingPrice']
K= df['Strike']
T= df['RemainingDays']/365
r= df['RfRate']
vol = 0.2

V_market = bs_call(S, K, T, r, vol)

implied_vol = find_vol(V_market, S, K, T, r)

df.loc[df['OptionType'] == 'c', 'IV'] = implied_vol
python pandas dataframe quantitative-finance
1个回答
0
投票

发生该错误是因为您将 pandas.core.series.Series 与浮点值进行比较。 正如错误所示,您需要将 if 子句更改为

if any(abs(diff) < PRECISION)
if all(abs(diff) < PRECISION)
之类的子句。

虽然这有点偏离主题,但我建议您:

  1. 分享您的完整错误日志,以便其他提交者快速理解您的问题并更快获得答案:)
  2. 在错误点之前插入调试断点子句(例如
    from IPython.core.debugger import Pdb; Pdb().set_trace()
    )并进行调查(即在本例中检查其数据类型)
© www.soinside.com 2019 - 2024. All rights reserved.