Back to Posts
Listen to Thread

Can give me a tip or two on how to use the batch transform with multiple sids. I'm trying to write my own moving average (see the code). It appears to be calculating the moving average of only one of the sids based on the log output.

Clone Algorithm
3
Loading...
Backtest from to with initial capital ( data)
Cumulative performance:
Algorithm Benchmark
Custom data:
Week
Month
All
Total Returns
--
Alpha
--
Beta
--
Sharpe
--
Sortino
--
Information Ratio
--
Benchmark Returns
--
Volatility
--
Max Drawdown
--
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
Information Ratio 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
This backtest was created using an older version of the backtester. Please re-run this backtest to see results using the latest backtester. Learn more about the recent changes.
There was a runtime error.

Hi Grant,

I was trying to write an Exponential Moving Average and had the same scratch-head moment but I think the below code works. I've not tested extensively

# calculate Extended Moving Average for a given SID  
@batch_transform(refresh_period=1, window_length=34)  
def batchEMA34(data,context,activeSID):  
    c = context  
    # closing-price array, where [0] is in the past and [N-1] is most current  
    vclose = data['close'][activeSID].values  
    sma = np.average(vclose)    # simple moving average here  
    if c.lastEMA is None:  
        c.lastEMA = sma  
    if c.lastSMA is None:  
        c.lastSMA = sma  
    multiplier = 2.0 / (vclose.size +1)  
    thisEMA = ((c.lastSMA - c.lastEMA) * multiplier) + c.lastEMA  
    c.lastEMA = thisEMA  
    c.lastSMA = sma  
    return thisEMA  

Sorry I think I misunderstood in my first reply. I think you could return multiple averages by doing something like...

@batch_transform(refresh_period=1, window_length=34)  
def batchEMA34(data,sidArray):  
    smaList = []  
    for s in sidArray:  
        vclose = data['close'][s].values  
        smaList.append(np.average(vclose))  
    return smaList  

hope it helps?

import numpy as np

R_P = 1  
W_L = 3

def initialize(context):  
    context.stocks = [sid(16841),sid(24)]

def handle_data(context, data):  
    avgs = get_avg(data, context.stocks)

    for i, stock in enumerate(context.stocks):  
        print "index i: {0}, stock {1}".format(i, stock)  
        event_time = data[stock].datetime  
        if avgs is not None:  
            avg = avgs[i]  
        else:  
            avg = None  
        log.debug(stock)  
        log.debug(event_time)  
        log.debug(avg)  
@batch_transform(refresh_period=R_P, window_length=W_L)  
def get_avg(datapanel, sids):  
    avgs = []  
    for s in sids:  
        avgs.append( np.average(datapanel['price'][s].values) )  
    return avgs  

Must stop drinking coffee ;)

Thanks James,

I'll give these a try at some point in the next day or two and let you know how things work out.

Grant

Log in to reply to this thread.
Not a member? Sign up!