Overall Statistics |
Total Trades
48
Average Win
10.87%
Average Loss
-4.37%
Compounding Annual Return
3.306%
Drawdown
56.600%
Expectancy
0.919
Net Profit
94.912%
Sharpe Ratio
0.302
Loss Rate
45%
Win Rate
55%
Profit-Loss Ratio
2.49
Alpha
0.176
Beta
-6.727
Annual Standard Deviation
0.14
Annual Variance
0.019
Information Ratio
0.159
Tracking Error
0.14
Treynor Ratio
-0.006
Total Fees
$232.00
|
# https://quantpedia.com/Screener/Details/16 import pandas as pd from datetime import datetime class CountryEquityIndexesMeanReversionAlgorithm(QCAlgorithm): def Initialize(self): self.SetStartDate(2000, 1, 1) self.SetEndDate(datetime.now()) self.SetCash(100000) # create a dictionary to store return indicators for all symbols self.data = {} period = 21*36 self.symbols = ["EWJ", # iShares MSCI Japan Index ETF "EFNL", # iShares MSCI Finland Capped Investable Market Index ETF "EWW", # iShares MSCI Mexico Inv. Mt. Idx "ERUS", # iShares MSCI Russia ETF "IVV", # iShares S&P 500 Index "AUD", # Australia Bond Index Fund "EWQ", # iShares MSCI France Index ETF "EWH", # iShares MSCI Hong Kong Index ETF "EWI", # iShares MSCI Italy Index ETF "EWY", # iShares MSCI South Korea Index ETF "EWP", # iShares MSCI Spain Index ETF "EWD", # iShares MSCI Sweden Index ETF "EWL", # iShares MSCI Switzerland Index ETF "EWC", # iShares MSCI Canada Index ETF "EWZ", # iShares MSCI Brazil Index ETF "EWO", # iShares MSCI Austria Investable Mkt Index ETF "EWK", # iShares MSCI Belgium Investable Market Index ETF "BRAQ", # Global X Brazil Consumer ETF "ECH"] # iShares MSCI Chile Investable Market Index ETF # warm up the Return indicator self.SetWarmUp(period) for symbol in self.symbols: self.AddEquity(symbol, Resolution.Daily) self.data[symbol] = self.ROC(symbol, period, Resolution.Daily) # shcedule the function to fire at the month start self.Schedule.On(self.DateRules.MonthStart("IVV"), self.TimeRules.AfterMarketOpen("IVV"), self.Rebalance) # create the flag variable to save the number of months passed self.months = -1 def OnData(self, data): pass def Rebalance(self): # rebalance the portfolio every three years self.months += 1 if self.months % 36 != 0: return sorted_symbols = sorted(self.data, key=lambda x: self.data[x].Current.Value) top = sorted_symbols[-4:] bottom = sorted_symbols[:4] for kvp in self.Portfolio: security_hold = kvp.Value # liquidate the security which is no longer in the list if security_hold.Invested and (security_hold.Symbol.Value not in top+bottom): self.Liquidate(security_hold.Symbol) for short in top: if not self.Portfolio[short].Invested: self.SetHoldings(short, -0.4/len(top)) for long in bottom: if not self.Portfolio[long].Invested: self.SetHoldings(long, 0.4/len(bottom))