| Overall Statistics |
|
Total Trades 588 Average Win 0.33% Average Loss -0.36% Compounding Annual Return 10.343% Drawdown 11.500% Expectancy 0.059 Net Profit 5.717% Sharpe Ratio 0.914 Loss Rate 45% Win Rate 55% Profit-Loss Ratio 0.91 Alpha 0.048 Beta 2.743 Annual Standard Deviation 0.111 Annual Variance 0.012 Information Ratio 0.74 Tracking Error 0.111 Treynor Ratio 0.037 Total Fees $1147.86 |
import numpy as np
from datetime import timedelta
from QuantConnect.Securities.Option import OptionPriceModels
import pandas as pd
# A pairs trading strategy for dual listed stocks
class DualListedArb(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2017,10,1)
self.SetEndDate(2017,12,1)
self.SetCash(10000)
self.TriggerSignal = .025
# Adding the dual class shares of Viacom
self.AddEquity("VIA", Resolution.Minute)
self.AddEquity("VIAB", Resolution.Minute)
self.AddEquity("SPY", Resolution.Minute)
# Set a benchmark at the beginning of every trading day
self.Schedule.On(self.DateRules.EveryDay("SPY"),
self.TimeRules.At(0,0),
Action(self.SetBenchmark))
self.SetWarmUp(int(6.5*60*100))
def OnData(self, slice):
# Called every minute
if self.IsWarmingUp: return
mainPrice = slice["VIAB"].Price
dualPrice = slice["VIA"].Price
self.currentSpread = dualPrice - mainPrice
self.currentSpread = float(self.currentSpread)
self.percentDiff = (self.currentSpread-self.benchmarkSpread)/self.benchmarkSpread
# If the current spread is >2.5% of the benchmark spread in the
# SetBenchmark method, buy the stock without the premium
if self.percentDiff > .025:
if self.Portfolio["VIAB"].Quantity <= 0:
self.SetHoldings("VIAB", 1.0, tag="Long")
if self.percentDiff < .025:
if self.Portfolio["VIAB"].Quantity > 0:
self.SetHoldings("VIAB", 0, tag="Short")
def SetBenchmark(self):
# Returns a spread for the premium of owning VIA stock over the
# past 100 days
# The mean of those 100 spreads becomes the Benchmark Spread that we base our
# predictions off of
self.mainHistory = self.History(["VIAB"], 100)
self.dualHistory = self.History(["VIA"], 100)
mainBars = self.mainHistory.loc["VIAB"]
mainHistoricalClose = mainBars["close"]
dualBars = self.dualHistory.loc["VIA"]
dualHistoricalClose = dualBars["close"]
spread = dualHistoricalClose - mainHistoricalClose
self.benchmarkSpread = spread.mean()
self.benchmarkSpread = float(self.benchmarkSpread)