| 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