| Overall Statistics |
|
Total Trades 3492 Average Win 0.20% Average Loss -0.38% Compounding Annual Return 31.175% Drawdown 29.600% Expectancy 0.236 Net Profit 322.304% Sharpe Ratio 1.217 Probabilistic Sharpe Ratio 60.493% Loss Rate 19% Win Rate 81% Profit-Loss Ratio 0.52 Alpha 0.112 Beta 1.008 Annual Standard Deviation 0.187 Annual Variance 0.035 Information Ratio 1.153 Tracking Error 0.098 Treynor Ratio 0.225 Total Fees $11965.74 Estimated Strategy Capacity $34000000.00 Lowest Capacity Asset AMZN R735QTJ8XC9X |
# Oversold CCI portfolio with Take Profit and Stop Loss
# -------------------------------------------------------------------------------
TICKERS = ["SPY", "AAPL", "MSFT", "AMZN"]; CCI_PERIOD = 14; TP = 0.10; SL = 0.05;
# -------------------------------------------------------------------------------
class BasicTemplateAlgorithm(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2017, 1, 1)
self.SetEndDate(2022, 4, 22)
self.SetCash(1000000)
self.cci = {}
self.SetWarmUp(CCI_PERIOD + 1, Resolution.Daily)
self.symbols = [self.AddEquity(ticker, Resolution.Minute).Symbol for ticker in TICKERS]
for sec in self.symbols:
self.cci[sec] = self.CCI(sec, CCI_PERIOD, MovingAverageType.Simple, Resolution.Daily)
self.selected = []
self.Schedule.On(self.DateRules.EveryDay(self.symbols[0]), self.TimeRules.AfterMarketOpen(self.symbols[0], 31),
self.Trade)
def Trade(self):
if self.IsWarmingUp: return
for sec in self.symbols:
if not self.cci[sec].IsReady: continue
cci = self.cci[sec].Current.Value
pnl = self.Securities[sec].Holdings.UnrealizedProfitPercent
self.Plot("CCI", sec, self.cci[sec].Current.Value)
self.Plot("CCI", 'threshold', -100)
self.Plot("Selected", 'N', len(self.selected))
if not self.Portfolio[sec].Invested:
if cci < -100:
self.selected.append(sec)
elif self.Portfolio[sec].Invested:
if pnl >= TP:
if sec in self.selected:
self.selected.remove(sec)
elif pnl < -SL:
if sec in self.selected:
self.selected.remove(sec)
for sec in self.Portfolio.Keys:
if sec not in self.selected:
self.Liquidate(sec)
for sec in self.selected:
self.SetHoldings(sec, 1/len(self.selected))