Options
C# - 使用 Black Scholes Newton 偶爾會返回 NaN
第一個警告:我是一名為客戶做這件事的程序員,我對選項的了解可能存在漏洞。所以在這裡有點寬容。=)
問題:當我針對鏈中的所有選項執行 Black Scholes Newton 時,我偶爾會得到 NaN 返回值。我對準確性的比較是針對 ThinkorSwim 的數據。
以下是該問題的螢幕截圖:http: //imgur.com/a/cItIj
現場、罷工、時間等,一應俱全。而且大多數時候數字是準確的。但是一旦我用看漲期權和看跌期權達到某些範圍,我就會得到那些 NaN,我似乎無法弄清楚為什麼
我使用garagebandhedgefund 的程式碼作為基礎,調整看跌/看漲。
這是牛頓程式碼:
public static double OptionPriceImpliedVolatilityCallBlackScholesNewton(double S, double K, double r, double time, double optionPrice,bool iscall, bool isput,out double price,out double diff) { price = 0; diff = 0; int MAX_ITERATIONS = 100; double ACCURACY = 1.0e-5; double t_sqrt = Math.Sqrt(time); double sigma = (optionPrice / S) / (0.398 * t_sqrt); // find initial value price = 0; for (int i = 0; i < MAX_ITERATIONS; i++) { if (iscall) { price = OptionPriceCallBlackScholes(S, K, r, sigma, time); } if (isput) { price = OptionPricePutBlackScholes(S, K, r, sigma, time); } diff = optionPrice - price; if (Math.Abs(diff) < ACCURACY) return sigma; double d1 = (Math.Log(S / K) + r * time) / (sigma * t_sqrt) + 0.5 * sigma * t_sqrt; double vega = (S * t_sqrt * NormDist(d1)); sigma = sigma + diff / vega; } return sigma; // something screwy happened, should throw exception // <--- original code //throw new Exception("An error occurred"); // Comment this line if you uncomment the line above }
我的問題:這是我的程式碼嗎?它是特定範圍的值嗎?是否存在牛頓無法返回有效值的情況?我在這裡有點難過。
作為記錄,當我將這些數據用於garageband 的二分程式碼時,我得到了全面的錯誤。我不知道這是否相關。我相當確定我的輸入數據的準確性,因為我確實從牛頓獲得了一些有效的回報。
一些期權價格不能轉換為波動率。例如,對低於其內在價值的價內看漲期權的出價。所以有時 NaN 是一個有效的答案。處理它的最佳方法是在進入搜尋循環之前進行前期檢查。
double.NaN
當您執行諸如將零除以零之類的操作時,.NET 雙倍返回。對於雙打,任何小於double.Epsilon
這個結果的東西都是“零”。我建議你
vega
的小於double.Epsilon
如果您使用
decimal
相反的方法執行相同的方法會發生什麼?