| Overall Statistics |
|
Total Trades 3613 Average Win 0.08% Average Loss -0.06% Compounding Annual Return -31.654% Drawdown 31.600% Expectancy -0.481 Net Profit -31.559% Sharpe Ratio -3.934 Probabilistic Sharpe Ratio 0.015% Loss Rate 77% Win Rate 23% Profit-Loss Ratio 1.27 Alpha -0.224 Beta -0.037 Annual Standard Deviation 0.059 Annual Variance 0.003 Information Ratio -1.335 Tracking Error 0.295 Treynor Ratio 6.167 Total Fees $3613.00 Estimated Strategy Capacity $12000000.00 Lowest Capacity Asset SPY R735QTJ8XC9X |
import datetime
# from re import I
from AlgorithmImports import *
# import traceback
# from QuantConnect import *
# from QuantConnect.Parameters import *
# from QuantConnect.Benchmarks import *
# from QuantConnect.Brokerages import *
# from QuantConnect.Util import *
# from QuantConnect.Interfaces import *
# from QuantConnect.Algorithm import *
# from QuantConnect.Algorithm.Framework import *
# from QuantConnect.Algorithm.Framework.Selection import *
# from QuantConnect.Algorithm.Framework.Alphas import *
# from QuantConnect.Algorithm.Framework.Portfolio import *
# from QuantConnect.Algorithm.Framework.Execution import *
# from QuantConnect.Algorithm.Framework.Risk import *
# from QuantConnect.Indicators import *
# from QuantConnect.Data import *
# from QuantConnect.Data.Consolidators import *
# from QuantConnect.Data.Custom import *
# from QuantConnect.Data.Fundamental import *
# from QuantConnect.Data.Market import *
# from QuantConnect.Data.UniverseSelection import *
# from QuantConnect.Notifications import *
# from QuantConnect.Orders import *
# from QuantConnect.Orders.Fees import *
# from QuantConnect.Orders.Fills import *
# from QuantConnect.Orders.Slippage import *
# from QuantConnect.Scheduling import *
# from QuantConnect.Securities import *
# from QuantConnect.Securities.Equity import *
# from QuantConnect.Securities.Forex import *
# from QuantConnect.Securities.Interfaces import *
# from datetime import date, datetime, timedelta
# from QuantConnect.Python import *
# from QuantConnect.Storage import *
# from matplotlib.pyplot import bar
QCAlgorithmFramework = QCAlgorithm
QCAlgorithmFrameworkBridge = QCAlgorithm
# # from Selection.EmaCrossUniverseSelectionModel import EmaCrossUniverseSelectionModel
# # endregion
class PairsTrading(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2020, 1, 1) # Set Start Date
self.SetEndDate(2020, 12, 29) # End Date
self.SetCash(10000) # Set Strategy Cash
self.symbol = self.AddEquity("SPY", Resolution.Minute).Symbol
self.rollingWindow = RollingWindow[TradeBar](2)
self.Consolidate(self.symbol, timedelta(
minutes=15), self.ConsolidateBar)
self.AddRiskManagement(TrailingStopRiskManagementModel(0.05))
self.pattern = self.CandlestickPatterns.Engulfing(
self.symbol)
def OnData(self, data):
if not self.rollingWindow.IsReady:
return
if self.pattern is None:
return
if (self.pattern.Current.Value == 1):
self.Log("Time: {} pattern is 1 going long" . format(data.Time))
self.SetHoldings(self.symbol, 0.2)
elif (self.pattern.Current.Value == -1):
self.Log("pattern is -1 going short")
self.SetHoldings(self.symbol, -0.2)
# tradeMinutes = [1, 16, 31, 46]
# if not self.Time.minute in tradeMinutes:
# return
# if self.Portfolio[self.symbol].Invested:
# return
# if self._pattern == 1:
# self.Debug("Engulfing Pattern")
# else:
# self.Debug("-------")
# isEngufing, bullish = self.ValidateEngulfing(self.rollingWindow)
# if isEngufing:
# if bullish:
# self.SetHoldings(self.symbol, 0.5)
# else:
# self.SetHoldings(self.symbol, -0.5)
def ConsolidateBar(self, bar):
self.rollingWindow.Add(bar)
def ValidateEngulfing(self, bars):
isEngulfing = True
bullish = True
# counter validate for false cases
if bars[0].Low < bars[1].Low:
isEngulfing = False
if bars[1].High > bars[0].High:
isEngulfing = False
if bars[0].Open > bars[0].Close:
bullish = False
return isEngulfing, bullish