希望使用数据框元素运行函数来创建新列 (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
发生该错误是因为您将 pandas.core.series.Series 与浮点值进行比较。 正如错误所示,您需要将 if 子句更改为
if any(abs(diff) < PRECISION)
或 if all(abs(diff) < PRECISION)
之类的子句。
虽然这有点偏离主题,但我建议您:
from IPython.core.debugger import Pdb; Pdb().set_trace()
)并进行调查(即在本例中检查其数据类型)