Error Thrown By Older RSI Algo...

Hi all,

I've been meaning to play around with an RSI algo attempt posted a while back: https://www.quantopian.com/posts/rsi-attempt-general-questions-and-feedback

I had to make a few changes (see source) as context/data usage became different as the platform was upgraded...but I'm still getting an error and I'm a little confused why...

Any ideas?

Thanks
Alex

Total Returns
--
Alpha
--
Beta
--
Sharpe
--
Sortino
--
Max Drawdown
--
Benchmark Returns
--
Volatility
--
 Returns 1 Month 3 Month 6 Month 12 Month
 Alpha 1 Month 3 Month 6 Month 12 Month
 Beta 1 Month 3 Month 6 Month 12 Month
 Sharpe 1 Month 3 Month 6 Month 12 Month
 Sortino 1 Month 3 Month 6 Month 12 Month
 Volatility 1 Month 3 Month 6 Month 12 Month
 Max Drawdown 1 Month 3 Month 6 Month 12 Month
# Put any initialization logic here.  The context object will be passed to
# the other methods in your algorithm.
def initialize(context):
#we're going to use the SPY ETF here, but feel free to initiate with
#other securities - just change the sid number
context.spy = sid(8554)
#set min and max portfolio notionals
context.max_notional = 1000000.1
context.min_notional = -1000000.0
#the RSI is calculated based on the security's returns over a set number
#of preceding observations.  Here we're setting up an array to collect the
#preceding 6 ticks to allow us to calc the preceding 5 period returns
context.tick_history = [0, 0, 0, 0, 0, 0]
pass

# Will be called on every trade event for the securities you specify.
def handle_data(context, data):
#set price variable
price = data[context.spy].price

#on each new tick we will insert the latest price into the array, extending its
#lenght by 1.  We'll then remove the oldest tick to return the array to its
#original length
context.tick_history.insert(0,price)
context.tick_history.pop()
preceding_prices = context.tick_history

#if there are enough prices in the array, let's go!
if preceding_prices[len(preceding_prices)-1] <> 0:
#create and populate an array of returns from our prices
returns = [(preceding_prices[i-1]-preceding_prices[i]) for i in range(1,len(preceding_prices))]
#create two empty arrays, one for up moves, one for down moves
up = []
down = []

#pass through the array of returns and place them in the corresponding up
#and down move arrays
for i in range(len(returns)):
if returns[i] > 0:
up.append(round(returns[i],2))
elif returns[i] <= 0:
down.append(round(returns[i]*-1,2))

#handle empty arrays - empty arrays mean no average of returns possible
if len(up) == 0:
rsi = 0
elif len(down) == 0:
rsi = 100

#the meat of the RSI calculation
else:
av_up = sum(up) / len(up)
av_down = sum(down) / len(down)

#some extra, probably uneccessary error handling avoidance
if av_down == 0:
rsi = 100
elif av_up == 0:
rsi = 0

#final RSI calculation, setting the statistic to be between 0 and 100
else:
rs = av_up / av_down
rsi = 100 - (100 / (1 + rs))

#set default RSI for when we dont yet have enough price history
else:
rsi = 50

#determine current notional of positions
notional = context.portfolio.positions[context.spy].amount * price

#some local debugging to monitor RSI levels
log.debug('RSI is')
log.debug(rsi)

#very un-imaginative trading strategy based around the observed RSI level
# PLEASE IMPLEMENT SOMETHING MORE FUN WITH THIS!!
if (rsi > 50) and notional > context.min_notional:
order(context.spy,+10)
elif (rsi < 50) and notional > context.min_notional:
order(context.spy,-10)


There was a runtime error.
3 responses

Hello Alex,

I'n sure there are better solutions but you could try

log.info(str(rsi))
record(RSI=rsi)


Regards,

Peter

Alex,

The problem is that it's having problems changing your integer to a string for logging. It works if you do it explicitly. Change line 76 from

    log.debug(rsi)


to

    log.debug(str(rsi))


For more readable logs, I'd combine lines 75 and 76 like this:
 log.debug('RSI is: ' + str(rsi)) 

Disclaimer

The material on this website is provided for informational purposes only and does not constitute an offer to sell, a solicitation to buy, or a recommendation or endorsement for any security or strategy, nor does it constitute an offer to provide investment advisory services by Quantopian. In addition, the material offers no opinion with respect to the suitability of any security or specific investment. No information contained herein should be regarded as a suggestion to engage in or refrain from any investment-related course of action as none of Quantopian nor any of its affiliates is undertaking to provide investment advice, act as an adviser to any plan or entity subject to the Employee Retirement Income Security Act of 1974, as amended, individual retirement account or individual retirement annuity, or give advice in a fiduciary capacity with respect to the materials presented herein. If you are an individual retirement or other investor, contact your financial advisor or other fiduciary unrelated to Quantopian about whether any given investment idea, strategy, product or service described herein may be appropriate for your circumstances. All investments involve risk, including loss of principal. Quantopian makes no guarantees as to the accuracy or completeness of the views expressed in the website. The views are subject to change, and may have become unreliable for various reasons, including changes in market conditions or economic circumstances.

Ah simple enough, thanks.

I didn't realize it was something that simple causing the problem... when run step by step in isolation, this line was giving me problem (basically never ending)

        returns = [(preceding_prices[i-1]-preceding_prices[i]) for i in range(1,len(preceding_prices))]



but it seems to be fine now...