Quantopian's community platform is shutting down. Please read this post for more information and download your code.
Back to Community
How to calculate moving average price with dynamic days ?

I have some code looks like this:

context.feature_periods = [1,2,3,4,5]  
for i in context.feature_periods:  
    p = data[context.aapl].mavg(i)  

But it can't be built:

Error   Transform window sizes must be specified with a directly supplied integer.  

Any idea ?

10 responses

Hi Roy,

A different way to do it would be to append prices to an array and take the average of that instead of using 'mavg(x)'. I've attached the code to what that might look like.

This wouldn't be very practical for minute mode unless you used something like this (https://www.quantopian.com/posts/market-on-close-orders) to record the prices only at market-close each day.

Hope this helps!

import numpy as np

def initialize(context):  
    context.aapl = sid(24)  
    # The array of past prices  
    context.past_prices = []  
    # The number of periods  
    context.feature_periods = [1,2,3,4,5]  

def handle_data(context, data):  
    # Append the current prices to the array of past prices  
    context.past_prices.append(data[context.aapl].price)  
    for i in context.feature_periods:  
        # Will return None if the array doesn't have enough numbers  
        p = get_average(context.past_prices, i)  
        log.debug(p)

def get_average(list_prices, period):  
    if len(list_prices) < period:  
        return None  
    return np.mean(list_prices[-period:])  
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.

Roy, the root issue here is that our backtester needs to know what data to load at the start of the simulation. Since mavg(i) could be any number, the backtester doesn't know how many or how big the arrays should be.

Seong's example will work for daily mode, as he says, but will get really bogged down in minutely mode. The good news is that the forthcoming history API will make the whole thing a lot easier.

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.

Hello Roy,

Another option is to import TA-Lib.

P.

Peter,

I don't think your algorithm will correctly work in minutely data, but as Dan mentioned with the history API, this whole thing will begin working.

In the meanwhile, here's a solution that does work for minutely data as it takes the opening price of each day and uses that to compute the moving average

Hi Roy,

I don't have time right now to work up an example, but I've done the sort of thing you are requesting with numpy.cumsum. It can be reasonably zippy, even with minute bars. Later today, I'll try to post some code.

Grant

Roy,

Here you go..I think it's working. See the log output. Should work in minute mode too.

Grant

Hello Roy,

Another approach is to use the rolling moments described on http://pandas.pydata.org/pandas-docs/dev/computation.html in conjunction with the batch transform. Just let me know if you need an example...[edit] well, maybe...I'll have to take a look.

Another edit...the pandas "Expanding window moment functions" might work.

Grant

Thanks all of you ! I'll try all of your suggestions and response this later.

Hello Roy,

Here's the pandas expanding window moment function example. Note that other moments are available (from http://pandas.pydata.org/pandas-docs/dev/computation.html):

Function Description
expanding_count Number of non-null observations
expanding_sum Sum of values
expanding_mean Mean of values
expanding_median Arithmetic median of values
expanding_min Minimum
expanding_max Maximum
expanding_std Unbiased standard deviation
expanding_var Unbiased variance
expanding_skew Unbiased skewness (3rd moment)
expanding_kurt Unbiased kurtosis (4th moment)
expanding_quantile Sample quantile (value at %)
expanding_apply Generic apply
expanding_cov Unbiased covariance (binary)
expanding_corr Correlation (binary)
expanding_corr_pairwise Pairwise correlation of DataFrame columns

For efficiency, you should only call the batch transform once per call to handle_data.

Grant

Here's a minute-level example, in case you want to play around with it, too. --Grant