相關性對最佳彩虹選項的影響
編輯 2:我發現了問題,現在價格似乎與預期的一樣。對於任何感興趣的人來說,在對模擬中使用的相關隨機正態變數進行正規化時存在一個錯誤,因此雖然它們具有正確的相關性,但其中一個的標準差為 1,另一個標準差遠大於 1。導致價格即使相關性增加,也不會下降(甚至增加)。@ir7 建議的奇偶關係現在似乎成立,這讓我相信一切都很好。
我重視彩虹選項用蒙特卡羅模擬在數值上,我得到了一些意想不到的結果。與我的直覺相反,最佳看漲期權的價格隨著相關性下降到某個點開始增加,這與我的直覺相反。最壞的期權情況表現得更好,因為它是預期的相關性的遞增函式。由於我以幾乎相同的方式評估它們(只是在我的程式碼中使用 min(…) 而不是 max(…) )我對可能出現的問題感到非常困惑,或者是否有可能價格以這種方式行事?如果這完全不合理,是否有人想冒險猜測為什麼我的計算可能會隨著相關性的增加而崩潰?該程序是用 C++ 編寫的,所以如果任何精通 C++ 的人想看看我的程式碼是否有錯誤,我
編輯 1:在@ir7 的幫助下進行了一些故障排除後,我的蒙特卡羅模擬似乎有一些問題(單個資產案例工作正常)。在下面發布(部分)我的 C++ 程式碼,以解決更簡單的問題,即評估性能表現不佳的選項,這是他(當然還有其他任何想要的人)檢查並提供幫助的封閉形式的解決方案。一旦相關性高於~0.5,計算似乎再次崩潰,見下圖。如果使用了一些函式呼叫,您希望我解釋或發布程式碼,我很樂意這樣做,現在我會盡量保持它有點裸露:
進行實際估值的類和函式:
MonteCarloOutPerformanceOptionFunction::MonteCarloOutPerformanceOptionFunction(std::string uniqueIdentifier_, int nominal_, std::vector<double> S0_vect, std::vector<Wrapper<PayOff>> ThePayOffVect_, double r_, std::vector<double> d_vect_, std::vector<double> impvol_vect_, std::vector<std::vector<double>> covMatrix_, double TTM_, unsigned long numberOfPaths_) : r(r_), S_vect(S0_vect), ThePayOffVect(ThePayOffVect_), d_vect(d_vect_), covMatrix(covMatrix_), valuationFunction(uniqueIdentifier_, TTM_, nominal_), numberOfPaths(numberOfPaths_), impvol_vect(impvol_vect_) { if (covMatrix.size() != S_vect.size()) throw("Missmatched Covariance matrix and initial spot values array sizes in OutPerformance Option"); if (2 != S_vect.size()) throw("More than two equities specified in OutPerformance Option"); } void MonteCarloOutPerformanceOptionFunction::ValueInstrument() { std::vector<MJArray> correlatedNormVariates = GetArraysOfCorrelatedGauassiansByBoxMuller(numberOfPaths, covMatrix); std::vector<StatisticAllPaths> thesePathGatherers; for (unsigned long i = 0; i < S_vect.size(); i++) { StandardExcerciseOption thisOption(ThePayOffVect[i], TTM); StatisticAllPaths onePathGatherer; thesePathGatherers.push_back(onePathGatherer); OneStepMonteCarloValuation(thisOption, S_vect[i], impvol_vect[i], r, d_vect[i], numberOfPaths, correlatedNormVariates[i], thesePathGatherers[i]); } f = 0; for (unsigned long i = 0; i < numberOfPaths; i++) { std::vector<double> outcomes; outcomes.reserve(S_vect.size()); for (unsigned long j = 0; j < S_vect.size(); j++) { outcomes.push_back(thesePathGatherers[j].GetOneValueFromResultsSoFar(i)); } f += std::max(outcomes[0] - outcomes[1], 0.0); } f *= ((double)nominal / numberOfPaths); return; }
在OneStepMonteCarloValuation呼叫的蒙地卡羅模擬函式(這似乎適用於單一資產選項,如普通看漲/看跌)
void OneStepMonteCarloValuation(const StandardExcerciseOption& TheOption, double Spot, double Vol, double r, double d, unsigned long NumberOfPaths, MJArray normVariates, StatisticsMC& gatherer) { if (normVariates.size() != NumberOfPaths) throw("mismatched number of paths and normal variates"); //Pre-calculate as much as possible double Expiry = TheOption.GetExpiry(); double variance = Vol * Vol * Expiry; double rootVariance = sqrt(variance); double itoCorrection = -0.5 * variance; double movedSpot = Spot * exp((r-d) * Expiry + itoCorrection); double thisSpot; double discounting = exp(-r * Expiry); for (unsigned long i = 0; i < NumberOfPaths; i++) { thisSpot = movedSpot * exp(rootVariance * normVariates[i]); double thisPayoff = TheOption.OptionPayOff(thisSpot); gatherer.DumpOneResult(discounting * thisPayoff); } return; }
StatisticAllPaths類,用作模擬中的輸入,收集模擬的所有最終值
StatisticAllPaths::StatisticAllPaths(const unsigned long minimumNumberOfPaths) : PathsDone(0) { ResultList.reserve(minimumNumberOfPaths); } void StatisticAllPaths::DumpOneResult(double result) { ResultList.push_back(result); PathsDone++; } const double& StatisticAllPaths::GetOneValueFromResultsSoFar(unsigned long index) const { return ResultList[index]; }
這裡使用的 PayOffVect 用於獲取 MC 估值函式中每條路徑的收益,但由於我們只是在這裡收集所有路徑並稍後處理它們(在主估值類的最後部分),它並不是真的在這裡做任何事。在這種情況下,它使用它只是為了使這個繼承類的性能優於相對值:
PayOffRelPerformance::PayOffRelPerformance(double startValue_) : startValue(startValue_) { } double PayOffRelPerformance::operator()(double spot) const { return spot / startValue; }
GetArraysOfCorrelatedGauassiansByBoxMuller 負責生成將在模擬中使用的法線變數向量。我已經檢查了 Cholezky 矩陣對於實際情況是否正確,並且我還檢查了輸出的正態變數實際上是否依賴於共變異數矩陣隱含的相關性。
std::vector<MJArray> GetArraysOfCorrelatedGauassiansByBoxMuller(unsigned long numberOfVariates, std::vector<std::vector<double>> covMatrix) { //Calculate the cholezky Matrix std::vector<std::vector<double>> cholezkyMatrix = Cholesky_Decomposition(covMatrix); //Fix the size of the arrays to contain correlated normal variates std::vector<MJArray> corrNormVariatesVector(cholezkyMatrix.size()); for (unsigned long j = 0; j < corrNormVariatesVector.size(); j++) { corrNormVariatesVector[j].resize(numberOfVariates); corrNormVariatesVector[j] = 0; } //calculate correlated normal variates and fill the arrays with values MJArray NormVariates(cholezkyMatrix.size()); for (unsigned long k = 0; k < numberOfVariates; k++) { for (unsigned long i = 0; i < cholezkyMatrix.size(); i++) { NormVariates[i] = GetOneGaussianByBoxMuller(); for (unsigned long j = 0; j < cholezkyMatrix[i].size(); j++) { corrNormVariatesVector[i][k] += cholezkyMatrix[i][j] * NormVariates[j]; } corrNormVariatesVector[i][k] /= cholezkyMatrix[i][i]; //normalize the random variates } } return corrNormVariatesVector; }
直覺地說,它們都應該是短期相關性,即資產相關性越低,最差/最佳選項的價值就越高。
最好的期權收益夾在交易所期權收益之間(加上其他單一股票的普通遠期/期權收益,對相關性不敏感):
$$ X_T -K + (Y_T-X_T)^+ \leq \max(X_T - K ,Y_T - K,0) \leq (X_T-K)^+ + (Y_T-X_T)^+ $$
直覺上很明顯,交換期權是短期相關性(在Margrabe 的世界中也明確地看到)。
**編輯:**對於最壞的選擇,我們有類似的關係:
$$ K-X_T + (X_T-Y_T)^+ \leq \max(K-X_T,K-Y_T,0) \leq (K-X_T)^+ + (X_T-Y_T)^+ $$
**Edit2:**您可以查看我聲稱將彩虹夾在中間的產品包的行為,以了解各種相關性。這可能會很快暴露一些東西。請記住,這些產品包既需要 MC 價格(來自您用於彩虹的相同循環)也需要封閉形式的解決方案(當然,在此調試階段,卷是平坦的等),因此在比較中插入兩個版本。
最好的 + 最差的 = Call1 + Call2
右側與相關性無關(您可以在模型中檢查它)。
因此,如果Best-of 是短相關,那麼Wast-of 一定是長相關。
增加的相關性使兩種資產更加相似,因此使最好的資產更像香草。這就是為什麼最好的就是短相關性。
(希望我正確理解了這個問題!)