Backtest Period
1969-1995
Markets Traded
Equities
Maximum Drawdown
Period of Rebalancing
3 Years
Return (Annual)
6.3%
Sharpe Ratio
Standard Deviation (Annual)
Original paper
SSRN-id883937.pdf5253.4KB
Trading rules
- Investment universe: 16 international equity ETFs
- Go long: Bottom 4 countries with worst 36-month return
- Go short: Top 4 countries with best 36-month return
- Rebalancing: Every 3 years
Python code
Backtrader
import backtrader as bt
import backtrader.feeds as btfeeds
class ReversalStrategy(bt.Strategy):
def __init__(self):
self.ranked_data = []
def prenext(self):
self.next()
def next(self):
if len(self) % 36 != 0:
return
self.ranked_data = sorted(self.datas, key=lambda data: data.close[0] / data.close[-36])
for data in self.ranked_data[:4]:
self.order_target_percent(data, target=0.25)
for data in self.ranked_data[-4:]:
self.order_target_percent(data, target=-0.25)
if __name__ == '__main__':
cerebro = bt.Cerebro()
# Add ETF data
for etf in etf_list: # Assuming `etf_list` contains a list of ETF symbols or filenames
data = btfeeds.YahooFinanceData(dataname=etf, fromdate=start_date, todate=end_date) # Modify data source accordingly cerebro.adddata(data)
cerebro.addstrategy(ReversalStrategy)
cerebro.broker.setcash(100000)
cerebro.broker.setcommission(commission=0.001)
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
cerebro.run()
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
Please modify the data source (e.g., YahooFinanceData) and parameters (e.g., start_date, end_date) according to your requirements.