程式
BlackProcess 的優質結果不符合線上引擎
我正在嘗試使用 Quantlib(在 C# 中)實現 BlackProcess,而我為 NPV() 獲得的結果與我可以在網上找到的一些資源不一致。這是我的程式碼:
var underlyingH = new Handle<Quote>(new SimpleQuote(27.77)); var underlierVolatility = 0.22; var dayCounter = new Actual365Fixed(); var settlementDate= DateTime.UtcNow; var flatTermStructure = new Handle<YieldTermStructure>(new FlatForward(settlementDate, 0.001, dayCounter)); var flatVolTs = new Handle<BlackVolTermStructure>(new BlackConstantVol(settlementDate, calendar, underlierVolatility, dayCounter )); var computationEngine = new BlackProcess(underlyingH, flatTermStructure, flatVolTs); // Option var payoff = new PlainVanillaPayoff(type, (double)option.Instrument.Strike); var europeanOption = new VanillaOption(payoff, new EuropeanExercise(option.Instrument.Expiry.DateTime)); // Black-76 on european option europeanOption.setPricingEngine(new AnalyticEuropeanEngine(computationEngine));
我用來比較結果的資源是:http: //lombok.demon.co.uk/financialTap/options/bond/shortterm https://commoditymodels.files.wordpress.com/2012/07/black-76-calculator .xls
我的問題是:根據我們可以在網上找到的香草引擎,在我從 QuantLib 獲得的結果中,什麼可以產生 NPV(1-2% 差異)的差異?
我懷疑我使用不同“參數”的方式存在錯誤,例如:
- 平進
- 黑色恆卷
- Actual365 日曆
我承認有非常(非常)接近的結果。
將此重新定義為將來參考的答案。
首先,我在這裡寫的內容適用於 QuantLib 的 C++ 版本及其由 SWIG 生成的 C# 包裝器;如果您使用的是 QLNet 本機 C# 埠,我不知道它是如何工作的。
預設情況下,QuantLib 以一天為解析度工作,並且在計算 TTM 時會忽略小時,這會導致您的計算與 QuantLib 結果之間存在差異。(順便說一句,我現在很清楚你是如何通過呼叫
yearFraction
日計數器上的方法來獲得包括小時在內的 TTM 的;這也應該在日解析度下工作。)從 1.7 版開始,可以編譯 QuantLib,以便將時間考慮在內(該功能預設不啟用,因為它會導致一些性能損失)。在 Windows 上,取消註釋該行
//# define QL_HIGH_RESOLUTION_DATE
並重新編譯 QuantLib 和 C# 模組。在其他系統上,執行
./configure --enable-intraday
並重新編譯整個事情。同樣,這適用於 C++ 版本和 SWIG 生成的 C# 包裝器。