| Overall Statistics |
|
Total Trades 1303 Average Win 0.12% Average Loss -0.12% Compounding Annual Return 1.836% Drawdown 10.400% Expectancy 0.033 Net Profit 7.508% Sharpe Ratio 0.351 Loss Rate 47% Win Rate 53% Profit-Loss Ratio 0.94 Alpha 0.013 Beta 0.028 Annual Standard Deviation 0.045 Annual Variance 0.002 Information Ratio -0.587 Tracking Error 0.118 Treynor Ratio 0.557 Total Fees $1668.83 |
#
# QuantConnect Basic Template:
# Fundamentals to using a QuantConnect algorithm.
#
# You can view the QCAlgorithm base class on Github:
# https://github.com/QuantConnect/Lean/tree/master/Algorithm
#
import numpy as np
import pandas as pd
class BasicTemplateAlgorithm(QCAlgorithm):
def Initialize(self):
# Set the cash we'd like to use for our backtest
# This is ignored in live trading
self.SetCash(100000)
# Start and end dates for the backtest.
# These are ignored in live trading.
self.SetStartDate(2013,9,11)
self.SetEndDate(2017,9,1) #2007-3-26 to 2013-9-9 used for in-sample testing
# Add assets you'd like to see
# some pairs have been excluded (commented out) in favour of longer optimisation and test periods
self.AddSecurity(SecurityType.Equity, "UUP", Resolution.Minute) #from 2007-02-20 USD
self.AddSecurity(SecurityType.Equity, "FXA", Resolution.Minute) #from 2006-06-26 AUD
self.AddSecurity(SecurityType.Equity, "FXB", Resolution.Minute) #from 2006-06-26 GBP
self.AddSecurity(SecurityType.Equity, "FXC", Resolution.Minute) #from 2006-06-26 CAD
########self.AddSecurity(SecurityType.Equity, "FXCH", Resolution.Minute) #from 2011-10-04 CNH
self.AddSecurity(SecurityType.Equity, "FXE", Resolution.Minute) #from 2005-12-12 EUR
self.AddSecurity(SecurityType.Equity, "FXY", Resolution.Minute) #from 2007-02-13 JPY
########self.AddSecurity(SecurityType.Equity, "FXSG", Resolution.Minute) #from 2013-02-13 SGD
self.AddSecurity(SecurityType.Equity, "FXS", Resolution.Minute) #from 2006-06-26 SEK
self.AddSecurity(SecurityType.Equity, "FXF", Resolution.Minute) #from 2006-06-26 CHF
self.symbols_list = ["UUP", "FXA", "FXB", "FXC", "FXE", "FXY", "FXS", "FXF"]
self.Schedule.On(self.DateRules.Every(DayOfWeek.Monday, DayOfWeek.Thursday), self.TimeRules.AfterMarketOpen('UUP', 5), Action(self.rebalance_fn))
def rebalance_fn(self):
d = {}
for i in self.symbols_list:
history = self.History(i, 100, Resolution.Daily)
close_list = []
for h in history:
close_list.append(h.Close)
_return = (self.Securities[i].Price - close_list[0]) / close_list[0]
self.Log(str(_return))
d[i] = _return
df = pd.DataFrame.from_dict(d, orient='index')
df.sort_values(0, inplace=True, ascending=False)
to_buy = df.iloc[0:2, :].index.values
to_sell = df.iloc[6:8, :].index.values
current_longs = []
current_shorts = []
for symbol in self.symbols_list:
holdings = self.Portfolio[symbol].Quantity
if holdings > 0:
current_longs.append(symbol)
elif holdings < 0:
current_shorts.append(symbol)
longs_to_liq = set(current_longs) - set(to_buy)
shorts_to_liq = set(current_shorts) - set(to_sell)
for l in longs_to_liq:
self.Liquidate(l)
for s in shorts_to_liq:
self.Liquidate(s)
self.SetHoldings(to_buy[0], 0.25)
self.SetHoldings(to_buy[1], 0.25)
self.SetHoldings(to_sell[0], -0.25)
self.SetHoldings(to_sell[1], -0.25)