Overall Statistics
Total Trades
47
Average Win
8.41%
Average Loss
-2.14%
Compounding Annual Return
10.305%
Drawdown
19.500%
Expectancy
2.851
Net Profit
269.970%
Sharpe Ratio
0.945
Loss Rate
22%
Win Rate
78%
Profit-Loss Ratio
3.92
Alpha
0.017
Beta
4.366
Annual Standard Deviation
0.11
Annual Variance
0.012
Information Ratio
0.764
Tracking Error
0.11
Treynor Ratio
0.024
Total Fees
$433.22
 
 
from datetime import datetime,timedelta
import pandas as pd
import numpy as np

class PairedSwitching(QCAlgorithm):
    
    def Initialize(self):
        self.SetStartDate(2005,3,15)
        self.SetEndDate(2018,7,15)
        self.SetCash(100000)
        #we select two etfs that are negatively correlated; equity and bond etfs
        self.first = self.AddEquity("SPY",Resolution.Minute)
        self.second = self.AddEquity("AGG",Resolution.Minute)
        self.months = -1
        #monthly scheduled event but rebalancing will run on quarterly basis
        self.Schedule.On(self.DateRules.MonthStart("SPY"), self.TimeRules.AfterMarketOpen("SPY", 1), self.Rebalance)

    def Rebalance(self):
        self.months +=1
        if(self.months%3==0):
            #retrieves prices from 90 days ago
            history_call = self.History(self.Securities.Keys,timedelta(days=90))
            if not history_call.empty:
                first_bars = history_call.loc[self.first.Symbol.Value]
                last_p1 = first_bars["close"].iloc[0]
                second_bars = history_call.loc[self.second.Symbol.Value]
                last_p2 = second_bars["close"].iloc[0]
                # calculates performance of funds over the prior quarter
                first_performance = (float(self.Securities[self.first.Symbol].Price) - float(last_p1))/(float(self.Securities[self.first.Symbol].Price))
                second_performance = (float(self.Securities[self.second.Symbol].Price) - float(last_p2))/(float(self.Securities[self.second.Symbol].Price))
                #buys the fund that has the higher return during the period
                if(first_performance > second_performance):
                    if(self.Securities[self.second.Symbol].Invested==True):
                        self.Liquidate(self.second.Symbol)
                    self.SetHoldings(self.first.Symbol,1)
                else:
                    if(self.Securities[self.first.Symbol].Invested==True):
                        self.Liquidate(self.first.Symbol)
                    self.SetHoldings(self.second.Symbol,1)

    def OnData(self, data):
        pass