簡體   English   中英

無法在python中使用calcbsimpvol函數找到隱含波動率

[英]Unable to find implied volatility using calcbsimpvol function in python

我有一個 NIFTY 期權價格數據集,並希望找到數據的隱含波動率

from calcbsimpvol import calcbsimpvol

cp = np.ones(len(final_data))
P = final_data["Close"].values
S = final_data["Underlying"].values
K = final_data["Strike Price"].values
tau = (final_data["Duration"]/365).values
r = final_data["rate"].values
q = np.zeros(len(final_data))

indicators = dict(cp=cp, P=P, S=S, K=K, tau=tau, r=r, q=q)
print("Indicators: \n", indicators)

sigma = calcbsimpvol(dict(cp=cp, P=P, S=S, K=K, tau=tau, r=r, q=q))
print("Sigma: \n", sigma)

運行上述代碼后的輸出為:

ValueError: operands could not be broadcast together with shapes (1138013,) (0,)

final_data 是包含所有 1138013 個點和所有必需參數的數據幀。

我該如何解決這個錯誤? 如果您有更好的方法使用 Black Scholes 模型找到隱含波動率,請隨時提及。

如果需要,請評論是否需要數據集的驅動器鏈接。

我是庫代碼的維護者。

我能夠重現它。 這里的問題是代碼假定基礎證券的價格是標量(1 個單一數字,例如50.5np.asarray(50.5)

所以代替S = final_data["Underlying"].values你會像S = final_data["Underlying"][0]

當然,這只有在final_data包含單一底層證券的期權數據時才有意義。 因此,如果您在 ?dataframe? 中有多個底層代碼,我建議您構建一個適配器並一次只發送一個底層代碼的數據。

否則,也許你有股票代碼/符號/代碼列來過濾:

final_data = pre_final_data.loc[final_data['symbol'] == 'spy'] 
S = final_data["Underlying"].values[0]  # because now every row in "underlying" should be the same 

對於更復雜的過濾/選擇,這可能會有所幫助: https : //pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.query.html

感謝發布。 下次我在圖書館工作時會考慮這個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM