Hi guys,

I'm trying to migrate the Percentile Channels from Quantopian to QuantConnect. I'm getting some runtime error. Any pointers / guides?

https://www.quantopian.com/posts/cssanalytics-a-simple-tactical-asset-allocation-portfolio-with-percentile-channelsimport numpy as np
import pandas as pd

class BasicTemplateAlgorithm(QCAlgorithm):

# Assets from CSSA blog (VTI, ICF, LQD, DBC, cash = SHY)
active = [
"VTI", # VTI - Vanguard Total Stock Market ETF (Inception: 24 May 01)
"VNQ", # VNQ - Vanguard REIT ETF (U.S. Real Estate) (Inception: 23 Sep 04)
"LQD", # LQD - iShares iBoxx $ Investment Grade Corporate Bond ETF (Inception: 22 Jul 02)
"TLT", # TLT - iShares 20+ Year Treasury Bond ETF
"DBC", # DBC - PowerShares DB Commodity Index Tracking Fund (Inception: 3 Feb 06)
]
cash = "SHY"

channels = [60, 120, 180, 252]
entry = 0.75
exit = 0.25
signals = pd.DataFrame(0., index=channels, columns=active)

LEVERAGE = 1.0

def Initialize(self):
# Set the cash we'd like to use for our backtest
# This is ignored in live trading
self.SetCash(100000)

# Start and end dates for the backtest.
# These are ignored in live trading.
self.SetStartDate(2010,1,1)
self.SetEndDate(2017,1,1)

# Add assets to be used
for symbol in self.active:
self.AddEquity(symbol, Resolution.Minute)
self.AddEquity(self.cash, Resolution.Minute)

# Schedule functions
self.Schedule.On(self.DateRules.EveryDay(), self.TimeRules.BeforeMarketClose("SHY", 5), Action(self.CheckChannels))
self.Schedule.On(self.DateRules.MonthStart("SHY"), self.TimeRules.BeforeMarketClose("SHY", 30), Action(self.Rebalance))

def OnData(self, slice):
# Simple buy and hold template
#if not self.Portfolio.Invested:
# self.SetHoldings(self.spy, 1)
# self.Debug("numpy test >>> print numpy.pi: " + str(np.pi))
pass

def CheckChannels(self):
#h = self.History(self.active, 252, Resolution.Day)[self.active]
h = self.History(self.symbols, 252, Resolution.Daily)

for c in self.channels:
channel_prices = h[-c:]
entry = channel_prices.quantile(self.entry)
exit = channel_prices.quantile(self.exit)

for s in self.active:
if h[s][-1] >= entry[s]:
self.signals[s][c] = 1
if h[s][-1] <= exit[s]:
self.signals[s][c] = -1


def Rebalance(self):
#h = self.History(self.active, 21, Resolution.Daily)[self.active]
h = self.History(self.active, 21, Resolution.Daily)

# Allocation
#inv_vol = 1. / np.log(h)/diff().std()
inv_vol = np.log(h)
inv_vol = np.diff(inv_vol)
inv_vol = np.std(inv_vol)
inv_vol = 1. / inv_vol

channel_weight = self.signals.sum() / len(self.channels)

active_weight = channel_weight * inv_vol
active_weight = active_weight.abs() / active_weight.abs().sum()
active_weight[channel_weight < 0.] = 0.
active_weight = active_weight.fillna(0)

# Ordering
for s in self.active:
self.SetHoldings(s, active_weight[s] * self.LEVERAGE)

cash_weight = 1. - active_weight.sum()
self.SetHoldings(self.cash, cash_weight)

I have commented out the two lines self.Schedule.On() so that the failed backtest can be attached.