| Overall Statistics |
|
Total Trades 14 Average Win 0.97% Average Loss -0.29% Compounding Annual Return 16.740% Drawdown 3.000% Expectancy 0.468 Net Profit 1.507% Sharpe Ratio 1.441 Loss Rate 67% Win Rate 33% Profit-Loss Ratio 3.40 Alpha 0.085 Beta 1.176 Annual Standard Deviation 0.109 Annual Variance 0.012 Information Ratio 1.223 Tracking Error 0.078 Treynor Ratio 0.133 Total Fees $64.86 |
import math
import numpy as np
import pandas as pd
import talib
from datetime import datetime, timedelta
class BasicTemplateAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetCash(100000)
self.SetStartDate(2017, 1, 1)
self.SetEndDate(2017, 1, 31)
self.SetBrokerageModel(BrokerageName.InteractiveBrokersBrokerage, AccountType.Margin)
# Add securities and get the data
self.equities = ["SPY","QQQ"]
self.sma5 = []
self.rsi30 = []
for s in self.equities:
self.AddEquity(s, Resolution.Minute)
self.sma5.append(self.SMA(s, 5, Resolution.Daily))
# Schedule trades at 10am
self.Schedule.On(self.DateRules.EveryDay("SPY"),
self.TimeRules.AfterMarketOpen("SPY", 30),
Action(self.Rebalance))
# 5 days to warm up the indicators
self.SetWarmup(timedelta(5))
def OnData(self, slice):
pass
def Rebalance(self):
# global variables
allocation = 1.0
vol = 100+1
long_mult = 1.0
short_mult = -1.0
target_weight = 0.9
security_ratio = 1.0
for i in range(len(self.equities)):
# position sizing variables
#prices = self.History(self.equities[i], vol)['close']
#price_stdev = (prices.pct_change()+1).apply(np.log).std()*(252**0.5)
#target_weight = (allocation/price_stdev/100)*security_ratio
# trading signal variables
price = self.Securities[self.equities[i]].Price
sma5 = self.sma5[i].Current.Value
#self.sma5[i].Update(IndicatorDataPoint(Time, price))
shares = self.Portfolio[self.equities[i]].Quantity
# trading logic
if shares <= 0 and price >= sma5:
self.SetHoldings(self.equities[i], target_weight*long_mult)
if shares > 0 and price < sma5:
self.SetHoldings(self.equities[i], target_weight*short_mult)
#self.Liquidate()
self.Debug("{0}: price: {1} sma5: {2} ".format(self.equities[i], round(price,2), round(sma5,2)))
self.Plot(self.equities[i], price)
self.Plot(self.equities[i], sma5)