| Overall Statistics |
|
Total Trades 720 Average Win 0.05% Average Loss -0.04% Compounding Annual Return -36.815% Drawdown 6.600% Expectancy 0.551 Net Profit -4.494% Sharpe Ratio -2.285 Loss Rate 36% Win Rate 64% Profit-Loss Ratio 1.42 Alpha 1.119 Beta -92.346 Annual Standard Deviation 0.158 Annual Variance 0.025 Information Ratio -2.385 Tracking Error 0.158 Treynor Ratio 0.004 Total Fees $1118.74 |
from clr import AddReference
AddReference("QuantConnect.Algorithm")
AddReference("QuantConnect.Algorithm.Framework")
AddReference("QuantConnect.Indicators")
AddReference("QuantConnect.Logging")
AddReference("QuantConnect.Common")
from QuantConnect import *
from QuantConnect.Indicators import *
from QuantConnect.Logging import Log
from QuantConnect.Algorithm import *
from QuantConnect.Algorithm.Framework import *
from QuantConnect.Algorithm.Framework.Alphas import *
from datetime import timedelta
from enum import Enum
import pandas as pd
import datetime
import numpy as np
class template_AlphaModel(AlphaModel):
def __init__(self,
period = 14,
resolution = Resolution.Daily):
self.period = period
self.resolution = resolution
self.insight_period = 5
self.insightPeriod = Time.Multiply(Extensions.ToTimeSpan(resolution), self.insight_period)
self.symbolDataBySymbol ={}
self.symbols = []
resolutionString = Extensions.GetEnumString(resolution, Resolution)
self.Name = '{}({},{})'.format(self.__class__.__name__, period, resolutionString)
self.magic_date = '1999-01-01'
def GetData(self,algorithm,timeWindow = 10):
history = algorithm.History(self.symbols, timeWindow, Resolution.Daily)
return history
def Update(self, algorithm, data):
insights = []
for symbol in list(self.symbols):
prediction = np.random.choice(a=[1,-1],size=1)
if prediction > 0:
insights.append( Insight(symbol, self.insightPeriod, InsightType.Price, InsightDirection.Up, magnitude = 0.1, confidence=1.) )
if prediction < 0:
insights.append( Insight(symbol, self.insightPeriod, InsightType.Price, InsightDirection.Down, magnitude = -0.1, confidence=1.) )
return insights
def OnSecuritiesChanged(self, algorithm, changes):
# clean up data for removed securities
removedSymbols = [ x.Symbol for x in changes.RemovedSecurities ]
if len(removedSymbols) > 0:
for subscription in algorithm.SubscriptionManager.Subscriptions:
if subscription.Symbol in removedSymbols:
try:
self.symbolDataBySymbol.pop(subscription.Symbol, None)
subscription.Consolidators.Clear()
except:
continue
addedSymbols = [ x.Symbol for x in changes.AddedSecurities if x.Symbol not in self.symbolDataBySymbol]
for i in range(len(addedSymbols)):
try:
self.symbols = list(set(self.symbols + [addedSymbols[i]]))
except Exception as e:
algorithm.Debug(str(e))
continue
for i in range(len(removedSymbols)):
try:
self.symbols = list(set(self.symbols) - set([removedSymbols[i]]))
except Exception as e:
algorithm.Debug(str(e))
continue
returnfrom Alphas.PearsonCorrelationPairsTradingAlphaModel import PearsonCorrelationPairsTradingAlphaModel
from Execution.ImmediateExecutionModel import ImmediateExecutionModel
from Portfolio.EqualWeightingPortfolioConstructionModel import EqualWeightingPortfolioConstructionModel
from Risk.MaximumDrawdownPercentPerSecurity import MaximumDrawdownPercentPerSecurity
from Selection.UncorrelatedUniverseSelectionModel import UncorrelatedUniverseSelectionModel
#from Portfolio.MeanVarianceOptimizationPortfolioConstructionModel import MeanVarianceOptimizationPortfolioConstructionModel
from alpha_template1 import template_AlphaModel
#from Portfolio.BlackLittermanOptimizationPortfolioConstructionModel import BlackLittermanOptimizationPortfolioConstructionModel
from Execution.StandardDeviationExecutionModel import StandardDeviationExecutionModel
#from Risk.MaximumSectorExposureRiskManagementModel import MaximumSectorExposureRiskManagementModel
from Risk.TrailingStopRiskManagementModel import TrailingStopRiskManagementModel
from Selection.QC500UniverseSelectionModel import QC500UniverseSelectionModel
class CalibratedNadionSplitter(QCAlgorithm):
def Initialize(self):
#self.SetStartDate(2019, 1, 5)
self.SetStartDate(2017, 10, 15)
self.SetCash(100000)
self.AddAlpha(template_AlphaModel())
self.SetExecution(StandardDeviationExecutionModel())
self.SetPortfolioConstruction(EqualWeightingPortfolioConstructionModel())
self.SetRiskManagement(MaximumDrawdownPercentPerSecurity(0.01))
self.SetUniverseSelection(UncorrelatedUniverseSelectionModel())
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
'''