Overall Statistics
Total Trades
117
Average Win
0.94%
Average Loss
0%
Compounding Annual Return
15.159%
Drawdown
17.400%
Expectancy
0
Net Profit
427.593%
Sharpe Ratio
1.189
Loss Rate
0%
Win Rate
100%
Profit-Loss Ratio
0
Alpha
0.066
Beta
4.098
Annual Standard Deviation
0.123
Annual Variance
0.015
Information Ratio
1.029
Tracking Error
0.123
Treynor Ratio
0.036
Total Fees
$143.93
import numpy as np
from datetime import datetime

### <summary>
### Upbias Tactical Switch Strategy - a simple strategy that can beat the stock market.
### detailed explanations at https://www.upbias.com/blog/beat-the-stock-market-strategy
### </summary>
class UpbiasTacticalSwitch(QCAlgorithm):

    def __init__(self):
        self.previous = None
        self._sma = None
        self.position = None
        self.lastMonth = -1

    def Initialize(self):
        self.SetStartDate(2007,6,3)  #Set Start Date
        self.SetEndDate(2019,3,12)    #Set End Date
        self.SetCash(100000)           #Set Strategy Cash
        self.AddSecurity(SecurityType.Equity, "SPY", Resolution.Daily)
        self.AddSecurity(SecurityType.Equity, "IEF", Resolution.Daily)
    
        self._sma = self.SMA("SPY", 220, Resolution.Daily)

    def OnData(self, data):
        
        # wait for the sma to fully initialize
        if not self._sma.IsReady:
            return    
 
        if not data.ContainsKey("SPY"):
            return

        if self.lastMonth == self.Time.month:
            return  
        
        if data["SPY"].Close > self._sma.Current.Value:
            if self.position == None:
                self.SetHoldings("SPY", 1)
            else:
                if self.position == "IEF":
                    self.Liquidate("IEF")  
                    self.SetHoldings("SPY", 1)
                    self.position = "SPY"
        else:
            if self.position == None:
                self.SetHoldings("IEF", 1)
            else:
                if self.position == "SPY":
                    self.Liquidate("SPY")  
                    self.SetHoldings("IEF", 1)
                    self.position = "IEF"
            
        self.lastMonth = self.Time.month