| Overall Statistics |
|
Total Trades 19092 Average Win 0.17% Average Loss -0.14% Compounding Annual Return 7.025% Drawdown 19.200% Expectancy 0.056 Net Profit 131.501% Sharpe Ratio 0.53 Loss Rate 53% Win Rate 47% Profit-Loss Ratio 1.23 Alpha 0.056 Beta 0.115 Annual Standard Deviation 0.118 Annual Variance 0.014 Information Ratio 0.014 Tracking Error 0.191 Treynor Ratio 0.544 Total Fees $274167.78 |
from clr import AddReference
AddReference("System.Core")
AddReference("System.Collections")
AddReference("QuantConnect.Common")
AddReference("QuantConnect.Algorithm")
import statistics
from datetime import datetime
from System.Collections.Generic import List
class ShortTimeReversal(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2005, 1, 1)
self.SetEndDate(2017, 5, 10)
self.SetCash(1000000)
self.UniverseSettings.Resolution = Resolution.Daily
self.AddUniverse(self.CoarseSelectionFunction)
self._numberOfSymbols = 100
self._numberOfTradings = int(0.1 * self._numberOfSymbols)
self._numOfWeeks = 0
self._LastDay = -1
self._ifWarmUp = False
self._stocks = []
self._values = {}
def CoarseSelectionFunction(self, coarse):
sortedByDollarVolume = sorted(coarse, key=lambda x: x.DollarVolume, reverse=True)
top100 = sortedByDollarVolume[:self._numberOfSymbols]
list = List[Symbol]()
for x in top100:
list.Add(x.Symbol)
return list
def OnData(self, data):
if not self._ifWarmUp:
if self._LastDay == -1:
self._LastDay = self.Time.date()
self._stocks = []
self.uni_symbol = None
symbols = self.UniverseManager.Keys
for i in symbols:
if str(i.Value) == "QC-UNIVERSE-COARSE-USA":
self.uni_symbol = i
for i in self.UniverseManager[self.uni_symbol].Members:
self._stocks.append(i.Value.Symbol)
self._values[i.Value.Symbol] = [self.Securities[i.Value.Symbol].Price]
else:
delta = self.Time.date() - self._LastDay
if delta.days >= 7:
self._LastDay = self.Time.date()
for stock in self._stocks:
self._values[stock].append(self.Securities[stock].Price)
self._numOfWeeks += 1
if self._numOfWeeks == 3:
self._ifWarmUp = True
else:
delta = self.Time.date() - self._LastDay
if delta.days >= 7:
self._LastDay = self.Time.date()
returns = {}
for stock in self._stocks:
newPrice = self.Securities[stock].Price
oldPrice = self._values[stock].pop(0)
self._values[stock].append(newPrice)
try:
returns[stock] = newPrice/oldPrice
except:
returns[stock] = 0
newArr = [(v,k) for k,v in returns.items()]
newArr.sort()
for ret, stock in newArr[self._numberOfTradings:-self._numberOfTradings]:
if self.Portfolio[stock].Invested:
self.Liquidate(stock)
for ret, stock in newArr[0:self._numberOfTradings]:
self.SetHoldings(stock, 0.5/self._numberOfTradings)
for ret, stock in newArr[-self._numberOfTradings:]:
self.SetHoldings(stock, -0.5/self._numberOfTradings)
self._LastDay = self.Time.date()