Overall Statistics
Total Trades
2
Average Win
0%
Average Loss
0%
Compounding Annual Return
128.863%
Drawdown
0.500%
Expectancy
0
Net Profit
0%
Sharpe Ratio
9.943
Loss Rate
0%
Win Rate
0%
Profit-Loss Ratio
0
Alpha
0.693
Beta
-0.186
Annual Standard Deviation
0.054
Annual Variance
0.003
Information Ratio
-1.351
Tracking Error
0.232
Treynor Ratio
-2.874
Total Fees
$9.89
import numpy as np

### <summary>
### Basic template algorithm simply initializes the date range and cash. This is a skeleton
### framework you can use for designing an algorithm.
### </summary>
class BasicTemplateAlgorithm(QCAlgorithm):
    '''Basic template algorithm simply initializes the date range and cash'''
    _tkr1 = 'SPY'
    _tkr2 = 'QQQ'
    _spread = -1


    def calc_sma(self,tkr1_hist, tkr2_hist, mult1, mult2, num_periods):
        if len(tkr1_hist)<num_periods:
            return(None)
        if len(tkr2_hist)<num_periods:
            return(None)
        series = tkr1_hist*mult1+tkr2_hist*mult2
        return(series.mean())

    def Initialize(self):
        '''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.'''

        self.SetStartDate(2013,10,07)  #Set Start Date
        self.SetEndDate(2013,10,11)    #Set End Date
        self.SetCash(100000)           #Set Strategy Cash
        # Find more symbols here: http://quantconnect.com/data
        # Add securities and get the data
        self.AddEquity(self._tkr1, Resolution.Minute)
        self.AddEquity(self._tkr2, Resolution.Minute)
        self.Debug("numpy test >>> print numpy.pi: " + str(np.pi))

    def OnData(self, data):
        '''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.

        Arguments:
            data: Slice object keyed by symbol containing the stock data
        '''
        num_periods = 15
        mult1 = 1
        mult2 = -1
        history_leg1 = self.History([self._tkr1], num_periods, Resolution.Minute)
        history_leg2 = self.History([self._tkr2], num_periods, Resolution.Minute)
        ma = self.calc_sma(history_leg1, history_leg2, mult1, mult2, num_periods)
        if ma is None:
            return
        leg1 = data[self._tkr1].Close
        leg2 = data[self._tkr2].Close
        self._spread = leg1*mult1 + leg2*mult2
        self.Plot("Spread", self._spread)
        if not self.Portfolio.Invested:
            self.SetHoldings(self._tkr1,1)
            self.SetHoldings(self._tkr2,-1)
        else:
            # need to close position
            pass
    
    def OnEndOfDay(self):
        self.Debug("End of day event.")
        self.Debug(str(self._spread))