on June 1st 2023, 1 EUR was buying 1.0762 USD spot. In the forward market, one could sell EUR 3m forward for 1.0816 USD.

Forward rate was greater than the spot rate, therefore EUR was trading at a forward premium, and one would expect a positive roll yield (in CFA type questions, such situation means hedging is encouraged). Of course, this is all based on the assumption that the spot will stay lower than the agreed forward rate.

3 months later, on August 31st 2023, 1 EUR was now buying 1.0843 USD. So if 3 months earlier one had sold EUR forward for 1.0762 USD they would have had to close their contract by buying EUR at 1.0843 USD, and they would have made a loss..

Is this happening regularly? How would one measure the risk of suffering this negative roll yield, I assume by running Monte Carlo simulation for the spot in 3m based on recent volatility to see where it could be versus the agreed forward rate?



1 Answer 1


I am not sure what you mean with unexpected negative yield? Who claims covered interest rate parity (CIP) is an unbiased forecast for exchange rates?

Empirically, random-walk (RW) forecasts (which in a nutshell means the best forecast for today is yesterday’s value) outperform economic models of exchange rates FX, see here for a detailed summary of various theories.

The forward is a no arbitrage price and not a forecast. The whole idea behind, and reason for the existence of the carry trade is that empirically, the higher yielding currency frequently does not depreciate as much as CIP "predicts".

On way to test if forward exchange rates are an optimal predictor was proposed by Bekaert and Hodrick (1993). Fumio Hayashi's excellent book Econometrics contains a detailed explanation of the concept on P. 418 onwards.

In essence, the authors use the current spot, the 30 days forward rate (from Friday) and the observed spot on the date of expiry of the forward. Using weekly data, you cover several sampling intervals with each maturity of the contracts. Writing CIP in log returns allows one to express the forward premium in terms of interest rate differentials. Under the null of market efficiency (the forward premium is the expected rate of change of the spot rate), since serial correlation vanishes after a finite lag, the error term satisfies the essential part of Gordin's condition restricting serial correlation. Hence, by the law of iterated expectations, the error term, conditional on lagged error terms beyond the maturity of the forward, is 0 (cov_kwds={'maxlags':4} in the code below).

Using log returns should make the dataset ergodic stationary and the GMM assumptions are satisfied because for $\beta_0 = 0$ and $\beta_1 = 1$, the expected value of the error term $\epsilon_t$ is 0. In this case $\mathbb{E[(f_t - S_t)*\epsilon_t]} = 0$ and GMM reduces to standard OLS. The identification condition is that the second moment of $((1,f_t - s_t )=0$, which is true iff $Var(f_t - s_t) > 0$, which is obvious (it just means that the population variance is not zero). There are a few more technical considerations to show that the estimation works, but I'll skip these here.

In essence, it all boils down to the following Python code (assuming you have the original dataset in excel format):

import pandas as pd
import numpy as np
import statsmodels.formula.api as smf

df = pd.read_excel('pound.xls', sheet_name='POUND', index=False)
# Display the data frame to confirm the import

df['FWDLOG'] = np.log(df['F'])

df['FXLOG'] = np.log(df['S'])
df['S30LOG'] = np.log(df['S30'])
df['DFXLOG'] = (df['S30LOG'] - df['FXLOG'])*1200 ## used to express the rates in annualized percentages
df['DFWDFXLOG'] = (df['FWDLOG'] - df['FXLOG'])*1200

reg1 = smf.ols('DFXLOG ~ 1 + DFWDFXLOG',data=df).fit(cov_type='HAC',cov_kwds={'maxlags':4})
print (reg1.summary())
# value in Bekaert and Hodrick has wrong sign for intercept (compare with Hayashi P. 426) 
eg1 = smf.ols('DFXLOG ~ 1 + DFWDFXLOG',data=df).fit(cov_type='HAC',cov_kwds={'maxlags':4})
print (reg1.summary())

hypotheses = '(Intercept = 0), (DFWDFXLOG = 1)'
w_test = reg1.wald_test(hypotheses)
if w_test.pvalue<0.05: 
    print('H0: Intercept = 0 & Slope = 1 can be rejected')
        print('Accept H0')

Which gives the result below, that is consistent with Bekaert and Hodrick (technically, they used the Bartlett kernel-based estimator with q(n) = 4):

enter image description here enter image description here

The slope coefficient is not only significantly different from 1, but also negative (for all three that Bekaert and Hodrick looked at). In other words, most frequently, an expected dollar depreciation is associated with an actual dollar appreciation.

This finding is the justification for the carry trade. However, there is a saying:

With the carry trade you go up the stairs and down the elevator.

That's because tere is a general tendency for the spot rate of the high yielding currency to depreciate. It may not happen for a while and your carry trade is profitable. However, it can often only take a short amount of time for all your gains to vanish.

  • 1
    $\begingroup$ "Who claims covered interest rate parity (CIP) is an unbiased forecast for exchange rates?" Some books or papers published in the mid 1970's may have assumed this, but by the 1980's it was first doubted and then shown to be empirically false. $\endgroup$
    – nbbo2
    Dec 11, 2023 at 10:29

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.