| Overall Statistics |
|
Total Trades 1664 Average Win 0.25% Average Loss -0.29% Compounding Annual Return -5.416% Drawdown 24.900% Expectancy -0.048 Net Profit -10.661% Sharpe Ratio -0.352 Loss Rate 50% Win Rate 50% Profit-Loss Ratio 0.89 Alpha -0.094 Beta 3.457 Annual Standard Deviation 0.11 Annual Variance 0.012 Information Ratio -0.498 Tracking Error 0.11 Treynor Ratio -0.011 Total Fees $0.00 |
# 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.
import pandas as pd
from datetime import datetime
import sys
class FXMomentumAlgorithm(QCAlgorithm):
def Initialize(self):
sys.setrecursionlimit(1500)
self.SetStartDate(2017, 7, 7)
self.SetEndDate(datetime.now())
self.SetCash(100000)
# create a dictionary to store momentum indicators for all symbols
self.data = {}
period = 33
period1 = 12*21
# choose 15 forex pairs
self.symbols = ["GBPSGD", "GBPJPY", "GBPNZD", "GBPCHF",
"GBPAUD", "GBPUSD", "GBPCAD"
]
# warm up the MOM indicator
self.SetWarmUp(period1)
for symbol in self.symbols:
self.AddForex(symbol, Resolution.Minute, Market.Oanda)
self.data[symbol] = self.MOM(symbol, period, Resolution.Hour)
# shcedule the function to fire at the month start
self.Schedule.On(self.DateRules.Every(DayOfWeek.Monday, DayOfWeek.Wednesday), self.TimeRules.AfterMarketOpen("GBPSGD", 30), self.Rebalance)
self.Schedule.On(self.DateRules.Every(DayOfWeek.Friday), self.TimeRules.At(9, 0), self.Penguin)
def OnData(self, data):
pass
def Rebalance(self):
if self.IsWarmingUp: return
spread = False
if self.Securities["GBPUSD"].AskPrice - self.Securities["GBPUSD"].BidPrice <= 0.0005:
spread = True
top3 = pd.Series(self.data).sort_values(ascending = False)[:2]
for kvp in self.Portfolio:
security_hold = kvp.Value
# liquidate the security which is no longer in the top3 momentum list
if security_hold.Invested and (security_hold.Symbol.Value not in top3.index):
self.Liquidate(security_hold.Symbol)
low3 = pd.Series(self.data).sort_values(ascending = True)[:2]
for abc in self.Portfolio:
security_holdz = abc.Value
# liquidate the security which is no longer in the low3 momentum list
if security_holdz.Invested and (security_holdz.Symbol.Value not in low3.index):
self.Liquidate(security_holdz.Symbol)
added_symbols = []
for symbol in top3.index:
if not self.Portfolio[symbol].Invested:
added_symbols.append(symbol)
for added in added_symbols:
if spread:
self.SetHoldings(added, -1/len(added_symbols))
added_symbolz = []
for symbol in low3.index:
if not self.Portfolio[symbol].Invested:
added_symbolz.append(symbol)
for added in added_symbolz:
if spread:
self.SetHoldings(added, 1/len(added_symbolz))
def Penguin(self):
if self.Portfolio.Invested:
'''
self.Log("the ATR of CADSGD are " + str(self.data["CADSGD"].Current.Value))
self.Log("the ATR of GBPJPY are " + str(self.data["GBPJPY"].Current.Value))
self.Log("the ATR of NZDUSD are " + str(self.data["NZDUSD"].Current.Value))
self.Log("the ATR of EURAUD are " + str(self.data["EURAUD"].Current.Value))
self.Log("the ATR of AUDCHF are " + str(self.data["AUDCHF"].Current.Value))'''
self.Liquidate()