Overall Statistics Total Trades 1728 Average Win 1.15% Average Loss -1.11% Compounding Annual Return 2.796% Drawdown 11.200% Expectancy 0.027 Net Profit 17.868% Sharpe Ratio 0.323 Loss Rate 50% Win Rate 50% Profit-Loss Ratio 1.04 Alpha 0.025 Beta 0.032 Annual Standard Deviation 0.08 Annual Variance 0.006 Information Ratio -0.027 Tracking Error 0.225 Treynor Ratio 0.802 Total Fees \$9679.23
```import numpy as np

class BasicTemplateAlgorithm(QCAlgorithm):

def Initialize(self):
self.SetCash(25000)
self.SetStartDate(2006,4,26)
self.SetEndDate(2012,4,9)

#specify variables

self.delta = 0.0001
self.vw = self.delta/(1-self.delta)*np.eye(2)
self.ve = 0.001

self.beta = np.zeros(2)
self.P = np.zeros((2,2))
self.R = None

self.pos = None
self.day = None

def OnData(self, data):
time = str(data.Time).split(' ')[1]
day = str(data.Time).split(' ')[0].split('-')[2]
if time.split(':')[0] != '15' or time.split(':')[1] not in ['55','56','57','58','59','60']:
return

if self.day is not None and self.day == day:
return

x = np.asarray([float(data[self.ewa].Close),1.0]).reshape((1,2))
y = float(data[self.ewc].Close)

if self.R is not None:
self.R = self.P + self.vw
else:
self.R = np.zeros((2,2))

yhat = x.dot(self.beta)

Q = x.dot(self.R).dot(x.T)+self.ve
threshold = np.sqrt(Q)
error = y - yhat
Kalman = self.R.dot(x.T)/Q
self.beta = self.beta + Kalman.flatten()*error
self.P = self.R - Kalman*x.dot(self.R)

if self.pos is None:
if error < -threshold:
quantity = float(self.Portfolio.Cash)/float(data[self.ewa].Close)
self.Sell(self.ewa,1000*self.beta[0])
self.pos = 'long'
self.day = day

elif error > threshold:
quantity = float(self.Portfolio.Cash)/float(data[self.ewa].Close)
self.Sell(self.ewc,1000)