| Overall Statistics |
|
Total Trades 122 Average Win 2.71% Average Loss -1.12% Compounding Annual Return 29.901% Drawdown 6.700% Expectancy 0.400 Net Profit 29.901% Sharpe Ratio 1.353 Loss Rate 59% Win Rate 41% Profit-Loss Ratio 2.42 Alpha 0.249 Beta -0.213 Annual Standard Deviation 0.169 Annual Variance 0.028 Information Ratio 0.585 Tracking Error 0.219 Treynor Ratio -1.072 Total Fees $129.17 |
from clr import AddReference
AddReference("System.Core")
AddReference("QuantConnect.Common")
AddReference("QuantConnect.Algorithm")
from System import *
from System.Collections.Generic import List
from QuantConnect import *
from QuantConnect.Algorithm import *
from QuantConnect.Orders import *
from QuantConnect.Data.UniverseSelection import *
from datetime import datetime
class BasicTemplateAlgorithm(QCAlgorithm):
def Initialize(self):
# Set the cash we'd like to use for our backtest
# This is ignored in live trading
self.SetCash(2000)
# Start and end dates for the backtest.
# These are ignored in live trading.
self.SetStartDate(2016, 1, 1)
self.SetEndDate(2017, 1, 1)
self.UniverseSettings.Resolution = Resolution.Minute
self.AddUniverse(self.CoarseSelectionFunction)
self._values = {}
self._investedPrice = {}
self.ifWarmUp = False
def OnData(self, slice):
if not self.ifWarmUp:
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._values[i.Value.Symbol] = self.Securities[i.Value.Symbol].Price
self.ifWarmUp = True
self.Log(str(self._values))
if (not self.Portfolio.Invested) and self.ifWarmUp:
longCandidates = []
shortCandidates = []
for symbol in self._values.keys():
oldPrice = self._values[symbol]
if not oldPrice:
continue
newPrice = self.Securities[symbol].Price
increase = newPrice / oldPrice
if increase > 1.07:
shortCandidates.append(symbol)
if increase < 0.93:
longCandidates.append(symbol)
self._values[symbol] = newPrice
for symbol in longCandidates:
self.SetHoldings(symbol, 1 / len(longCandidates))
self._investedPrice[symbol] = self.Securities[symbol].Price
for symbol in shortCandidates:
self.SetHoldings(symbol, -1 / len(shortCandidates))
self._investedPrice[symbol] = self.Securities[symbol].Price
elif self.ifWarmUp:
for symbol in self._values.keys():
if self.Portfolio[symbol].IsLong:
newPrice = self.Securities[symbol].Price
oldPrice = self._investedPrice[symbol]
if not oldPrice:
continue
increase = newPrice / oldPrice
if increase > 1.02 or increase < 0.99:
self.Liquidate(symbol)
del self._investedPrice[symbol]
del self._values[symbol]
elif self.Portfolio[symbol].IsShort:
newPrice = self.Securities[symbol].Price
oldPrice = self._investedPrice[symbol]
if not oldPrice:
continue
increase = newPrice / oldPrice
if increase > 1.01 or increase < 0.98:
self.Liquidate(symbol)
del self._investedPrice[symbol]
del self._values[symbol]
def CoarseSelectionFunction(self, coarse):
if not self.ifWarmUp:
self.Log("Here")
sortedByDollarVolume = sorted(coarse, key=lambda x: x.DollarVolume, reverse=True)
top100 = sortedByDollarVolume[:200]
list = List[Symbol]()
for x in top100:
list.Add(x.Symbol)
self.Log("ENd")
return list