| Overall Statistics |
|
Total Trades 25 Average Win 13.41% Average Loss -4.47% Compounding Annual Return 11.030% Drawdown 17.500% Expectancy 2.331 Net Profit 289.590% Sharpe Ratio 0.83 Loss Rate 17% Win Rate 83% Profit-Loss Ratio 3.00 Alpha 0.194 Beta -6.232 Annual Standard Deviation 0.111 Annual Variance 0.012 Information Ratio 0.682 Tracking Error 0.111 Treynor Ratio -0.015 Total Fees $229.00 |
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(2005,01,03) #Set Start Date
self.SetEndDate(2017,12,29) #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