Overall Statistics
Total Trades
47
Average Win
0.90%
Average Loss
-0.12%
Compounding Annual Return
4.383%
Drawdown
16.500%
Expectancy
2.912
Net Profit
89.717%
Sharpe Ratio
0.51
Probabilistic Sharpe Ratio
0.973%
Loss Rate
55%
Win Rate
45%
Profit-Loss Ratio
7.61
Alpha
0.047
Beta
-0.185
Annual Standard Deviation
0.063
Annual Variance
0.004
Information Ratio
-0.221
Tracking Error
0.209
Treynor Ratio
-0.173
Total Fees
$0.00
Estimated Strategy Capacity
$980000.00
Lowest Capacity Asset
USDTRY 8G
# region imports
from AlgorithmImports import *
# endregion

class ForexCarryTradeAlgorithm(QCAlgorithm):

    def Initialize(self):

        self.SetStartDate(2008, 1, 1) 
        self.SetEndDate(2022, 12, 1)  
        self.SetCash(25000)
        
        rate_symbol_by_ticker = {
            "USDEUR": "BCB/17900",  # Euro Area
            "USDZAR": "BCB/17906",  # South Africa
            "USDAUD": "BCB/17880",  # Australia
            "USDJPY": "BCB/17903",  # Japan
            "USDTRY": "BCB/17907",  # Turkey
            "USDINR": "BCB/17901",  # India
            "USDCNY": "BCB/17899",  # China
            "USDMXN": "BCB/17904",  # Mexico
            "USDCAD": "BCB/17881"   # Canada
        }

        self.symbols = {}
        for ticker, rate_symbol in rate_symbol_by_ticker.items():
            forex_symbol = self.AddForex(ticker, Resolution.Daily, Market.Oanda).Symbol
            data_symbol = self.AddData(NasdaqDataLink, rate_symbol, Resolution.Daily, TimeZones.Utc, True).Symbol
            self.symbols[str(forex_symbol)] = data_symbol
            
        self.Schedule.On(self.DateRules.MonthStart("USDEUR"), self.TimeRules.BeforeMarketClose("USDEUR"), self.Rebalance)

    def Rebalance(self):
        top_symbols = sorted(self.symbols, key = lambda x: self.Securities[self.symbols[x]].Price)
        
        self.SetHoldings(top_symbols[0], -0.5)
        self.SetHoldings(top_symbols[-1], 0.5)