| Overall Statistics |
|
Total Trades 47 Average Win 0.39% Average Loss -0.35% Compounding Annual Return 102.984% Drawdown 7.700% Expectancy 0.108 Net Profit 6.335% Sharpe Ratio 2.935 Loss Rate 47% Win Rate 53% Profit-Loss Ratio 1.10 Alpha -0.966 Beta 87.443 Annual Standard Deviation 0.25 Annual Variance 0.063 Information Ratio 2.86 Tracking Error 0.25 Treynor Ratio 0.008 Total Fees $54.22 |
import numpy as np
import decimal as d
class BasicTemplateAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2018,4,6) #(2013,1,1)
#self.SetEndDate(2013,12,31)
self.backtestSymbolsPerDay = {}
self.current_universe = []
self.UniverseSettings.Resolution = Resolution.Hour;
self.AddUniverse("my-dropbox-universe", self.universeGetter)
def universeGetter(self, date):
# handle live mode file format
if self.LiveMode:
# work on this later
return self.current_universe
# backtest - first cache the entire file
#if len(self.backtestSymbolsPerDay) == 0:
# str = self.Download("https://www.dropbox.com/s/rmiiktz0ntpff3a/daily-stock-picker-backtest.csv?dl=1")
# for line in str.splitlines():
# data = line.split(',')
# self.backtestSymbolsPerDay[data[0]] = data[1:]
# Dummmy this up for now
if len(self.backtestSymbolsPerDay) == 0:
self.backtestSymbolsPerDay['20180406'] = ['ABMD', 'BZUN', 'CRM', 'NOW']
self.backtestSymbolsPerDay['20180413'] = ['PAYC', 'ULTI', 'CRM', 'ADBE']
self.backtestSymbolsPerDay['20180420'] = ['PAYC', 'ADBE', 'CRM', 'RHT']
self.backtestSymbolsPerDay['20180427'] = ['PAYC', 'ADBE', 'RHT', 'BOOT']
index = date.strftime("%Y%m%d")
#self.Debug(index)
self.current_universe = self.backtestSymbolsPerDay.get(index, self.current_universe)
return self.current_universe
def OnData(self, slice):
if slice.Bars.Count == 0: return
if self.changes == None: return
# start fresh
self.Liquidate()
percentage = 1 / d.Decimal(slice.Bars.Count)
for tradeBar in slice.Bars.Values:
self.SetHoldings(tradeBar.Symbol, percentage)
# reset changes
self.changes = None
self.Debug(str(self.Time) +' '+'end OnData')
def OnSecuritiesChanged(self, changes):
self.changes = changes
def OnEndOfAlgorithm(self):
self.Log('End captured')
for sym in self.current_universe:
self.Log(sym)