Terry Leitch
Copyright © 2018 T Leitch & J Liew
In my opinion, (discretionary) Global Macro is the hardest strategy to properly evaluate. Discretionary managers typically have thematic approaches to their investment process and express their views through a variety of instrument such as futures, options, and fx, across global markets.
The defining discretionary global macro trade was by George Soros in Sept. 16th, 1992, when he bet on the devaluation of the British Pound
Wiki
Paul Tudor Jones II’s “Trader”, what was his famous trade? Why?
Background: Pound was in the Europe’s ERM, Soros bet that the Pound could not remain within the system, his position made $1B on Sept. 16th, 1992 (short the GBP)
Ex-PayPal’s Peter Thiel’s hedge fund Clarium captured: (1) USD dollar weakening in 2003, and (2) energy rally in 2005
Yardeni’s model compares the S&P500 forward earnings yield to the 10-year US Gov’t Bond yield. Equity market valuations are in line when both are equal. Currently, we are in a period of low-equity valuations, do you believe it? As of Feb 4th, 2016, 10 yr US bond yields = 1.87% , and S&P500’s forward earnings yield of ~6.3% (1/15.87, WSJ).
Reference: http://www.federalreserve.gov/releases/h15/update/ http://online.wsj.com/mdc/public/page/2_3021-peyield.html
Good Resource: http://www.oanda.com/
“EURUSD trades ½ pip wide, with $2M on ask and $4M on bid side.”
Buy EUR or “lift the offer” : Buy $1M EUR and sell $1,348,250 USD
Sell EUR or “hit the bid” : Sell $1M EUR and buy $1,348,200 USD
Base currency EUR, and quoted currency is USD
Always remember the easy decomposition:
\[(R_{(USD)} – R_{(FC)} ) = (I_{(USD)} + r_{(USD)} ) – (I_{(FC)} + r_{(FC)} ) =\]
\[(I_{(USD)} – I_{(FC)} ) + (r_{(USD)} - r_{(FC)} )\]
FX Carry : “Sort currencies into highest to lowest yielding currencies, buy the top and sell the bottom (Yen).”
DBV – Deutsche Bank’s G10 Harvest Fund Carry ETF
ICI – Barclays Intelligent Carry Index (G10 currencies)
Let’s examine and index of actively managed currency hedge funds:
Barclay Currency Trader Index (BCTI)
Assume an APT multifactor model: \[R_{t} = \alpha + \Sigma_{i}\beta_{i}F_{i,t}+\epsilon_{t}\]
“Carry factor. We used the Deutsche Bank Currency Harvest G10 Index as the proxy for the returns of a carry strategy. This index reflects the return of being long the three high-yielding currencies against being short the three low-yielding currencies among the G–10 currencies. The index is rebalanced quarterly. Every quarter, the currencies are re-ranked according to their current three month LIBOR. The Bloomberg code for this factor is DBHVG10U.”
“Trend factor. We used the AFX Currency Management Index as a proxy for the trendfollowing factor.17 The AFX Index is based on trading in seven currency pairs weighted by their volume of turnover in the spot market, with returns for each pair based on an equally weighted portfolio of three moving average rules (32, 61, and 117 days).”
“Value factor. We used the Deutsche Bank G10 Valuation Index as the proxy for the returns of a value strategy. To gauge relative value, Deutsche Bank prepares a ranking based on the average daily spot rate over the last three months divided by the purchasing power parity (PPP) exchange rate as published annually by the Organisation for Economic Co-Operation and Development. The Deutsche Bank G10 Valuation Index reflects the return of being long the three currencies with the highest rank (undervalued currencies) against being short the three currencies with the lowest rank (overvalued currencies) among the G–10 currencies. The Bloomberg code for this factor is DBPPPUSF.”
“Currency volatility factor. We used the Deutsche Bank Currency Volatility Index as the proxy for foreign exchange volatility. This index is calculated as the weighted average of three-month implied volatility for nine major currency pairs (as provided by the British Bankers’ Association), with weights based on trading volume in surveys by the Bank for International Settlements. The Bloomberg code for this factor is CVIX. We used the first difference for this factor in Equation 1 because it is not a trading strategy. For the previous three factors, we used returns.”
Next,
Let’s examine if individual currency managers’ crowd trades
“Do Hedge Funds Hedge?” by Asness et al
Simple regression shows modest market exposure and positive value added
But, this is very misleading…
Once lagged betas are employed, find that hedge funds do not add value over this period
Data bias – Survivorship, Backfill, and Self-selection
Data bias – Survivorship, Backfill, and Self-selection
Notice that monthly versus quarterly estimates of annualized standard deviation differ.
Notice that monthly versus quarterly estimates of annualized standard deviation differ.
Sharpe-Lintner’s CAPM:
\[R_{i,t} = \alpha_{i} + \beta_{i}R_{m,t} + \varepsilon_{i,t}\]
Fama-French’s 3 Factor Model:
\[R_{i,t} = \alpha_{i} + \beta_{i}R_{m,t} + s_{i}SMB_{t}+ h_{i}HML_{t} + \varepsilon_{i,t}\]
Carhart’s Model:
\[R_{i,t} = \alpha_{i} + \beta_{i}R_{m,t} + s_{i}SMB_{t}+ h_{i}HML_{t} + m_{i}WML_{t} + \varepsilon_{i,t}\]
Lagged Betas
Apply Scholes and Williams (1977) and Dimson (1979) simple techniques
\[R_{i,t} = \alpha_{i} + \beta_{0i}R_{m,t} + \beta_{1i}R_{m,t-1} + \beta_{2i}R_{m,t-2} + \beta_{3i}R_{m,t-3}+...+\varepsilon_{i,t}\]
\[R_{i,t} = \alpha_{i} + \beta_{i}R_{m,t} + \varepsilon_{i,t}\]
library("PeerPerformance", lib.loc="/opt/microsoft/ropen/3.4.3/lib64/R/library")
hfrets=readRDS("data/hfrets.rds")[,1:10]
## Sharpe screening
knitr::kable(cbind(HFname=colnames(hfrets),outperform=sharpeScreening(hfrets, control = list(nCore = 1))$pipos))| HFname | outperform |
|---|---|
| HFI | 0.353123446117909 |
| Converts | 0.0639887827529013 |
| ShortBias | 0 |
| EMF | 0.0535714285714285 |
| EquityNeutral | 0.0387817643696677 |
| EventDriven | 0.75 |
| Distressed | 0.816176470588235 |
| MultiSstrat | 0.382917515973302 |
| RiskArb | 0.728223365686532 |
| FIArb | 0.181691935263858 |
## Modified Sharpe screening
knitr::kable(cbind(HFname=colnames(hfrets),outperform=msharpeScreening(hfrets, control = list(nCore = 1))$pipos))| HFname | outperform |
|---|---|
| HFI | 0.16666071859529 |
| Converts | 1 |
| ShortBias | 0 |
| EMF | 0.142857142857143 |
| EquityNeutral | NA |
| EventDriven | 0.519300441735576 |
| Distressed | 0.73109243697479 |
| MultiSstrat | 0.193559266034737 |
| RiskArb | 0.509887933719684 |
| FIArb | 0.641894264152376 |
## Alpha screening
ctr = list(nCore = 1)
knitr::kable(cbind(HFname=colnames(hfrets),outperform=alphaScreening(hfrets, control = ctr)$pipos))| HFname | outperform |
|---|---|
| HFI | 0.359882025674133 |
| Converts | 0.320969238150623 |
| ShortBias | 0 |
| EMF | 0 |
| EquityNeutral | 0 |
| EventDriven | 0.682539682539683 |
| Distressed | 1 |
| MultiSstrat | 0.539453331698549 |
| RiskArb | 0.193615434164776 |
| FIArb | 0 |
|  |
\[R_{i,t} = \alpha_{i} + \beta_{i}R_{m,t} + s_{i}SMB_{t}+ h_{i}HML_{t} + \varepsilon_{i,t}\]
library(quantmod)
source("http://www.stat.cmu.edu/~cschafer/MSCF/getFamaFrench.txt")
#Get Fama French factors
ffhold = getFamaFrench(from="2012-1-1", to="2012-6-30")
#Get Apple stock's data
AAPL=getSymbols("AAPL", from="2012-1-1", to="2012-6-30", auto.assign=F)
#Find excess return
ffhold$AAPLexret = 100*dailyReturn(AAPL) - ffhold$RF
#Multiple Linear Regression
ff3modAAPL = lm(AAPLexret ~ Mkt.RF + SMB + HML, data=ffhold)
#Summary of regression
summary(ff3modAAPL)##
## Call:
## lm(formula = AAPLexret ~ Mkt.RF + SMB + HML, data = ffhold)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.0164 -0.8426 -0.0340 0.7748 5.0299
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.1908 0.1225 1.558 0.12190
## Mkt.RF 1.3617 0.1584 8.597 3.45e-14 ***
## SMB -0.8402 0.3082 -2.726 0.00735 **
## HML -1.9321 0.3091 -6.251 6.35e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.363 on 121 degrees of freedom
## Multiple R-squared: 0.4744, Adjusted R-squared: 0.4613
## F-statistic: 36.4 on 3 and 121 DF, p-value: < 2.2e-16
\[\alpha_{i} = R_{i,t} - \beta_{i}R_{m,t} - \varepsilon_{i,t}\]
\[\alpha_{i} = R_{i,t} - \beta_{i}R_{m,t} - s_{i}SMB_{t}- h_{i}HML_{t} -\varepsilon_{i,t}\]
Optimise for Sharpe by minimizing \(sigma(P)\)
\[R_{i,t} = \alpha_{i} + \beta_{i}R_{m,t} + \varepsilon_{i,t}\]
library("PeerPerformance", lib.loc="~/R/x86_64-pc-linux-gnu-library/3.4")
hfrets=readRDS("data/hfrets.rds")[,1:10]
## Sharpe screening
knitr::kable(cbind(HFname=colnames(hfrets),outperform=sharpeScreening(hfrets, control = list(nCore = 1))$pipos))| HFname | outperform |
|---|---|
| HFI | 0.342530214857394 |
| Converts | 0.0639887827529013 |
| ShortBias | 0 |
| EMF | 0.0535714285714285 |
| EquityNeutral | 0.0387817643696677 |
| EventDriven | 0.75 |
| Distressed | 0.816176470588235 |
| MultiSstrat | 0.390557815378023 |
| RiskArb | 0.728223365686532 |
| FIArb | 0.181691935263858 |
## Modified Sharpe screening
knitr::kable(cbind(HFname=colnames(hfrets),outperform=msharpeScreening(hfrets, control = list(nCore = 1))$pipos))| HFname | outperform |
|---|---|
| HFI | 0.163781764369668 |
| Converts | 1 |
| ShortBias | 0 |
| EMF | 0.142857142857143 |
| EquityNeutral | NA |
| EventDriven | 0.527874016416601 |
| Distressed | 0.73109243697479 |
| MultiSstrat | 0.193559266034737 |
| RiskArb | 0.49942227277714 |
| FIArb | 0.65933703238995 |
## Alpha screening
ctr = list(nCore = 1)
knitr::kable(cbind(HFname=colnames(hfrets),outperform=alphaScreening(hfrets, control = ctr)$pipos))| HFname | outperform |
|---|---|
| HFI | 0.359882025674133 |
| Converts | 0.320969238150623 |
| ShortBias | 0 |
| EMF | 0.00963050267368932 |
| EquityNeutral | 0 |
| EventDriven | 0.682539682539683 |
| Distressed | 1 |
| MultiSstrat | 0.539453331698549 |
| RiskArb | 0.1836357299599 |
| FIArb | 0 |
| [Ardia & Boudt 2 | 012](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2000901) |
\[R_{i,t} = \alpha_{i} + \beta_{i}R_{m,t} + s_{i}SMB_{t}+ h_{i}HML_{t} + \varepsilon_{i,t}\]
library(quantmod)
source("http://www.stat.cmu.edu/~cschafer/MSCF/getFamaFrench.txt")
#Get Fama French factors
ffhold = getFamaFrench(from="2012-1-1", to="2012-6-30")
#Get Apple stock's data
AAPL=getSymbols("AAPL", from="2012-1-1", to="2012-6-30", auto.assign=F)
#Find excess return
ffhold$AAPLexret = 100*dailyReturn(AAPL) - ffhold$RF
#Multiple Linear Regression
ff3modAAPL = lm(AAPLexret ~ Mkt.RF + SMB + HML, data=ffhold)
#Summary of regression
summary(ff3modAAPL)##
## Call:
## lm(formula = AAPLexret ~ Mkt.RF + SMB + HML, data = ffhold)
##
## Residuals:
## Min 1Q Median 3Q Max
## -3.0164 -0.8426 -0.0340 0.7748 5.0299
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.1908 0.1225 1.558 0.12190
## Mkt.RF 1.3617 0.1584 8.597 3.45e-14 ***
## SMB -0.8402 0.3082 -2.726 0.00735 **
## HML -1.9321 0.3091 -6.251 6.35e-09 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.363 on 121 degrees of freedom
## Multiple R-squared: 0.4744, Adjusted R-squared: 0.4613
## F-statistic: 36.4 on 3 and 121 DF, p-value: < 2.2e-16
## Compare with Sharpe Lintner
#Multiple Linear Regression
ff3modAAPL = lm(AAPLexret ~ Mkt.RF, data=ffhold)
#Summary of regression
summary(ff3modAAPL)##
## Call:
## lm(formula = AAPLexret ~ Mkt.RF, data = ffhold)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.2657 -0.9862 -0.1751 0.7242 7.0587
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.2184 0.1418 1.540 0.126
## Mkt.RF 1.1091 0.1597 6.947 1.92e-10 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.58 on 123 degrees of freedom
## Multiple R-squared: 0.2818, Adjusted R-squared: 0.2759
## F-statistic: 48.26 on 1 and 123 DF, p-value: 1.916e-10
\[R_{i,t} = \alpha_{i} + \beta_{i}R_{m,t} + s_{i}SMB_{t}+ h_{i}HML_{t} + m_{i}WML_{t} + \varepsilon_{i,t}\]
\[R_{i,t} = \alpha_{i} + \beta_{0i}R_{m,t} + \beta_{1i}R_{m,t-1} + \beta_{2i}R_{m,t-2} + \beta_{3i}R_{m,t-3}+...+\varepsilon_{i,t}\]
Differences do exist, and appear to be both statistically and economically significant.