Options

C# - 使用 Black Scholes Newton 偶爾會返回 NaN

  • March 19, 2019

第一個警告:我是一名為客戶做這件事的程序員,我對選項的了解可能存在漏洞。所以在這裡有點寬容。=)

問題:當我針對鏈中的所有選項執行 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相反的方法執行相同的方法會發生什麼?

引用自:https://quant.stackexchange.com/questions/15325