| Overall Statistics |
|
Total Trades 1 Average Win 0% Average Loss 0% Compounding Annual Return 7.614% Drawdown 55.100% Expectancy 0 Net Profit 164.603% Sharpe Ratio 0.486 Loss Rate 0% Win Rate 0% Profit-Loss Ratio 0 Alpha 0.157 Beta -3.308 Annual Standard Deviation 0.188 Annual Variance 0.035 Information Ratio 0.379 Tracking Error 0.188 Treynor Ratio -0.028 Total Fees $5.29 |
from collections import deque
from datetime import datetime, timedelta
from numpy import sum
from decimal import *
# Demonstrates how to create a custom indicator
class CustomIndicatorAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2005,10,1)
self.SetEndDate(2019,1,1)
self.spy=self.AddEquity("SPY", Resolution.Daily)
# Create a custom indicator for average momentum
self.customIndicator = averageMomentumIndicator('Average Momentum', 252)
self.RegisterIndicator("SPY", self.customIndicator, Resolution.Daily)
def OnData(self, data):
if not self.Portfolio.Invested:
self.SetHoldings("SPY", 1)
if self.customIndicator.IsReady:
self.Log('Average momentum indicator value: ' + str(self.customIndicator.Value))
self.Plot("customIndicator", "Value", str(self.customIndicator.Value))
class averageMomentumIndicator:
def __init__(self, name, period):
self.Name = name
self.Time = datetime.min
self.Value = 0
self.IsReady = False
self.queue = deque(maxlen=period)
self.mom = deque(maxlen=period)
def __repr__(self):
return "{0} -> IsReady: {1}. Time: {2}. Value: {3}".format(self.Name, self.IsReady, self.Time, self.Value)
# Update method is mandatory
def Update(self, input):
self.queue.appendleft(input.Close)
count = len(self.queue)
self.Time = input.EndTime
self.mom.appendleft(input.Close/self.queue[-1]-1)
self.Value = sum(self.mom)/count
self.IsReady = count == self.queue.maxlen