Overall Statistics |
Total Orders 255 Average Win 5.28% Average Loss -3.21% Compounding Annual Return 0.676% Drawdown 60.500% Expectancy 0.092 Start Equity 100000 End Equity 113135.85 Net Profit 13.136% Sharpe Ratio 0.02 Sortino Ratio 0.025 Probabilistic Sharpe Ratio 0.000% Loss Rate 59% Win Rate 41% Profit-Loss Ratio 1.65 Alpha 0.032 Beta -0.46 Annual Standard Deviation 0.195 Annual Variance 0.038 Information Ratio -0.197 Tracking Error 0.295 Treynor Ratio -0.008 Total Fees $0.00 Estimated Strategy Capacity $970000.00 Lowest Capacity Asset USDJPY 8G Portfolio Turnover 3.25% |
#region imports from AlgorithmImports import * #endregion # https://quantpedia.com/Screener/Details/8 # Create an investment universe consisting of several currencies (15). # Go long 3 currencies with strongest 12 month momentum against USD and # go short 3 currencies with lowest 12 month momentum against USD. class FXMomentumAlgorithm(QCAlgorithm): def initialize(self): self.set_start_date(2006, 1, 1) self.set_cash(100000) # create a dictionary to store momentum indicators for all symbols self._data = {} period = 12*21 # choose 15 forex pairs symbols = ["USDAUD", "USDCAD", "USDCHF", "USDEUR", "USDGBP", "USDHKD", "USDJPY", "USDDKK", "USDCZK", "USDZAR", "USDSEK", "USDSAR", "USDNOK", "USDMXN", "USDHUF"] # warm up the MOM indicator self.set_warm_up(period) for symbol in symbols: self.add_forex(symbol, Resolution.DAILY, Market.OANDA) self._data[symbol] = self.mom(symbol, period, Resolution.DAILY) # shcedule the function to fire at the month start self.schedule.on(self.date_rules.month_start("USDEUR"), self.time_rules.after_market_open("USDEUR"), self._rebalance) def _rebalance(self): if self.is_warming_up: return top3 = pd.Series(self._data).sort_values(ascending=False)[:3] for symbol, security_hold in self.portfolio.items(): # liquidate the security which is no longer in the top3 momentum list if security_hold.invested and (symbol.value not in top3.index): self.liquidate(symbol) added_symbols = [] for symbol in top3.index: if not self.portfolio[symbol].invested: added_symbols.append(symbol) for added in added_symbols: self.set_holdings(added, 1/len(added_symbols))