如何調整蝶式 2s5s10s 掉期交易的方向性?
我正在研究使用 50-50 加權方案的 2s5s10s 掉期想法,它是 5 年減去 2 年和 10 年的 2 倍。但是,蝶式價差與曲線的斜率(2s10s)以及 5 年之間存在相關性。我想調整蝴蝶的權重以消除方向性,這樣我仍然希望身體的權重為 2。
本質上,我認為應該是 X : 2 : Y 但我很難過。
我想他是說如果
$$ Fly=b_1(2s-10s) + b_2(5s) + error $$ 但
$$ Fly= 2s-2(5s)+10s $$ 然後做一些代數,
$$ (1-b_1)2s -(2-b_2)5s + (1+b_1)10s = error $$ 因此,產生純雜訊的蒼蠅的權重,與曲線和速率無關,如上所示。如果你想要 2 在中間,你必須重新調整。
方法一:PCA 方向性對沖
這是使用 PCA 和對沖第一個主成分隱含的方向性的一種方法。
由於您引用了 3 種有效的工具;2s5s10s、2s10s 和 5Y 您將觀察到您可以從底層 2Y、5Y 和 10Y 派生這些工具。那是;
$$ \begin{bmatrix} 5Y \\ 2s10s \\ 2s5s10s \ \end{bmatrix} = \begin{bmatrix} 0 & 1 & 0 \\ -1 & 0 & 1 \\ -1 & 2 & -1 \end{bmatrix} \begin{bmatrix} 2Y \\ 5Y \\ 10Y \end{bmatrix} , \quad or \quad P_2 = A P_1 $$ 在哪裡 $ P_1 $ 和 $ P_2 $ 是您在不同基礎系統中的一組價格。
您還可以觀察到,如果您有儀器的共變異數矩陣 $ P_1 $ , 說 $ Q(P_1) $ ,然後是基礎工具的共變異數 $ P_2 $ 可以通過以下方式獲得: $$ Q(P_2) = A Q(P_1) A^T \quad \implies \quad Q(P_1) = A^{-1}Q(P_2)A^{-T} $$ 所以你可以在兩個基礎系統中工作,但我將專注於預設系統 $ P_1 $ 系統。
如果你現在導出你的特徵值和特徵向量 $ Q(P_1) $ 取對應於最高特徵值的特徵向量 - 這是第一個主成分 (PC1)。為了對沖該組件以使您沒有風險敞口,請將您的潛在交易主張除以 PC1 的元素:
$$ \begin{bmatrix} 2Y: -1 \\ 5Y: +2 \\ 10Y: -1 \end{bmatrix} \div \begin{bmatrix} PC1_{2Y} : 0.660 \\ PC1_{5Y} : 0.604 \\ PC1_{10Y} : 0.447 \end{bmatrix} = \begin{bmatrix} -1.51 \\ 3.31 \\ -2.24 \end{bmatrix} \propto \begin{bmatrix} -0.91 \\ 2.00 \\ -1.35 \end{bmatrix} $$
PCA 替代方法(2021 年 10 月 3 日編輯):
PCA 的第二種方法是考慮一個從原始交易策略開始的公式,並嘗試通過最小風險變化對其進行修改,以滿足主成分零風險的條件。
認為 $ \mathbf{p} $ 是上面的主成分值,並且 $ \mathbf{x} $ 是原來的交易風險,即上面的-1、2、-1。然後我們有最小化問題來尋求最小的風險變化, $ \mathbf{\delta} $ 至 $ \mathbf{x} $ :
$$ \min_{\mathbf{\delta}} \mathbf{\delta^T I \delta} \quad \text{subject to} \quad (\mathbf{x + \delta})^T \mathbf{I p} = 0 $$
這個二次函式有一個解析解(參見維基百科上的 Karush-Kuhn-Tucker 條件):
$$ \begin{bmatrix} 2 & 0 & 0 & p_1 \ 0 & 2 & 0 & p_2 \ 0 & 0 & 2 & p_3 \ p_1 & p_2 & p_3 & 0 \end{bmatrix} \begin{bmatrix} \delta_1 \ \delta_2 \ \delta_3 \ \lambda \end{bmatrix} = \begin{bmatrix} 0 \ 0 \ 0 \ \mathbf{-x^Tp} \end{bmatrix} $$
求解我們得到的線性程序 $ \mathbf{x+\delta} = \begin{bmatrix} -1.1002 \ 2 \ -1.0780 \end{bmatrix} $
正如您所看到的,可以對原始交易進行多種修改,而不是導致 PC1 風險為零,使用哪個是公式問題。我開始更喜歡這種修改,因為它更透明,如果更難以推導/計算。
方法 2:最小化 VaR 方法
第二種考慮的方法是假設您交易 5Y 並尋求 2Y 和 10Y 頭寸的組合以最小化您的 VaR。這允許您最大化相對於您的交易目標 VaR 的絕對 5Y 規模。
假設您有以下風險:
$$ S = \begin{bmatrix} 2Y: 0 \\ 5Y: 2 \\ 10Y: 0 \end{bmatrix} $$現在您評估 2Y 和 10Y 中的哪些位置給出最小的 VaR。對於我上面用來推導 PCA 的相同共變異數矩陣,答案是:
$$ S^* = \begin{bmatrix} 2Y: -1.48 \\ 5Y: 2.00 \\ 10Y: -0.38 \end{bmatrix} $$
這是一個可以用數值求解器或更簡單地用解析微積分解決的優化問題,但我不打算在這裡討論,下面的連結有它。
這些方法顯然從根本上不同,但每種方法都有針對特定觀點的優點,您更有可能傾向於第一種。此處的區別在於,2Y 與 5Y 的直接相關性要高得多,因此通過增持它來降低 VaR 是一種更好的對沖,而使用 PCA 時,10Y 的波動較小,因此您需要更大的風險來進行方向性對沖。
請注意,如果您想自己嘗試,可以使用 $ Q(C) $ 此連結中 2Y、5Y 和 10Y 交易的共變異數矩陣值:http ://www.tradinginterestrates.com/revised/PCA.xlsb請注意,我從 Darbyshire Pricing and Trading Interest Rate Derivatives 獲得了所有這些材料。
編輯
方法 3:多元最小二乘回歸
如果我們包含來自@dm63 的第三種形式的多變數回歸方法:
$$ \mathbf{y} - \mathbf{\beta X} = \mathbf{\epsilon} $$
在哪裡 $ \mathbf{y} $ 是 2s5s10s 時間序列,並且 $ \mathbf{X} $ 是 2s10s 和 5y 時間序列,那麼你的最優估計 $ \beta_1, \beta_2 $ 由給出,
$$ \mathbf{\hat{\beta}} = \mathbf{(X^TX)^{-1}X^T y} $$
正如他所說,貿易權重為 $ (-(1-\beta_1), 2-\beta_2, -(1+\beta_1)) $
例如,我在 2016 年的一些歐元掉期樣本數據上嘗試了所有這三種方法。從 1 月 1 日到 6 月 30 日是我的樣本數據,從 7 月 1 日到 12 月 22 日是我的樣本外回測。下面我繪製了結果。有趣的是,多變數回歸實際上在這個樣本外數據中具有最小的波動性,但最小的 var 具有幾乎相同的波動性。當然,min Var 將在根據定義導出它的樣本數據中具有最低的波動性。
如果您對程式碼感興趣…
import pandas as pd import numpy as np import matplotlib.pyplot as plt df_hist = pd.read_csv('historical_daily_changes.csv', index_col='DATE', parse_dates=True) df_fore = pd.read_csv('forecast_daily_absolues.csv', index_col='DATE', parse_dates=True) z = df_fore[['2Y', '5Y', '10Y']].values # Method 1: PCA directionality weighted trade x = df_hist[['2Y', '5Y', '10Y']].values Q = np.cov(x.T) eval, evec = np.linalg.eig(Q) w = np.array([-1 / evec[0, 0], 2 / evec[1, 0], -1 / evec[2, 0]]) print('Weights for trade using PCA are:', 2*w[0]/w[1], 2, 2*w[2]/w[1]) df_fore['PCA'] = 100 * (w[0]*z[:, 0] + w[1]*z[:, 1] + w[2]*z[:, 2]) * 2/w[1] # Method 2: Minimum Variance approach Q = np.cov(x.T) Q_hat = Q[[0, 2], :] Q_dhat = Q_hat[:, [0, 2]] w[[0, 2]] = -np.einsum('ij,jk,k->i', np.linalg.inv(Q_dhat), Q_hat, np.array([0,2,0])) w[1] = 2 print('Weights for trade using min VaR are:', 2*w[0]/w[1], w[1], 2*w[2]/w[1]) df_fore['Min VaR'] = 100 * (w[0]*z[:, 0] + w[1]*z[:, 1] + w[2]*z[:, 2]) * 2/w[1] # Method 3: Multivariable least square regression x = df_hist[['2Y10Y', '5Y']].values y = df_hist[['2Y5Y10Y']].values beta = np.matmul(np.linalg.pinv(x), y) w = np.array([-(1-beta[0]), 2-beta[1], -(1+beta[0])]) print('Weights for trade using MVLSR are:', 2*w[0]/w[1], 2, 2*w[2]/w[1]) df_fore['MVLSR'] = 100 * (w[0]*z[:, 0] + w[1]*z[:, 1] + w[2]*z[:, 2]) * 2/w[1] # Plot an out of sample forecast fig, ax = plt.subplots(1,1) ax.plot_date(df_fore.index, df_fore['2Y5Y10Y'] + 36, 'k-', label='2Y5Y10Y') ax.plot_date(df_fore.index, df_fore['MVLSR'] + 6.7, 'r-', label='MVLSR weights') ax.plot_date(df_fore.index, df_fore['PCA'] - 2.3, 'g-', label='PCA Weights') ax.plot_date(df_fore.index, df_fore['Min VaR'] + 14.9, 'b-', label='Min VaR weights') ax.legend() plt.show() print(df_fore[['2Y5Y10Y', 'MVLSR', 'PCA', 'Min VaR']].diff().describe())