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)