Overall Statistics
Total Trades
31
Average Win
10.53%
Average Loss
-0.44%
Compounding Annual Return
14.615%
Drawdown
10.000%
Expectancy
20.767
Net Profit
249.277%
Sharpe Ratio
1.362
Loss Rate
13%
Win Rate
87%
Profit-Loss Ratio
24.12
Alpha
0.149
Beta
-0.366
Annual Standard Deviation
0.104
Annual Variance
0.011
Information Ratio
1.17
Tracking Error
0.104
Treynor Ratio
-0.389
Total Fees
$298.76
import pandas as pd
import numpy as np
from datetime import timedelta


### <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'''

    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.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage)
        self.SetBenchmark("SPY")
        self.SetStartDate(2010,1,1)  #Set Start Date
        self.SetEndDate(2019,3,1)    #Set End Date
        self.SetCash(100000)           #Set Strategy Cash
        self.equity = ['SPY', 'IEF']
        self.months = {}
        # Find more symbols here: http://quantconnect.com/data
        self.AddEquity(self.equity[0], Resolution.Hour)
        self.AddEquity(self.equity[1], Resolution.Hour)
        self.google_trends = pd.DataFrame(columns=['Week', 'interest'])
        self.file = self.Download("https://www.dropbox.com/s/6cse2ugdby7shxi/debt.csv?dl=1")
        #self.file = self.Download("https://www.dropbox.com/s/y6pl82qc1vjv1g7/recession.csv?dl=1")
        self.file = self.file.split("\n")
        
        i = 0
        for row in self.file[1:]:
            one_row = row.split(",")
            self.Log(one_row)
            self.google_trends.loc[i] = one_row
            i += 1
        self.google_trends["MA3"] = self.google_trends.interest.rolling(3).mean()
        self.google_trends["MA18"] = self.google_trends.interest.rolling(18).mean()
        
        self.google_trends["Signal"] =  self.google_trends["MA3"].astype('float') -  self.google_trends["MA18"].astype('float')
        self.google_trends["Signal"] = self.google_trends["Signal"].shift(1)
    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
        '''
        date_today = self.Time.date()
        date_today = date_today.strftime(format='%Y-%m-%d')
        date_today = date_today[0:7]
        signal = self.google_trends.loc[self.google_trends.Week == date_today,"Signal"].iloc[0]
        
        try:
            invested = self.months[date_today]
        except:
            invested = "No"
        if self.Time.hour == 15 and invested == "No":
            
            if self.Portfolio[self.equity[0]].Quantity > 0 and signal > 0:
                self.Liquidate(self.equity[0])
            if self.Portfolio[self.equity[1]].Quantity > 0 and signal < 0:
                self.Liquidate(self.equity[1])

            if signal < 0 and self.Portfolio[self.equity[0]].Quantity == 0:
                self.SetHoldings(self.equity[0], 1)
                self.months[date_today] = "Yes"
                return
            if signal > 0 and self.Portfolio[self.equity[1]].Quantity == 0:
                self.SetHoldings(self.equity[1], 1)
                self.months[date_today] = "Yes"
                return