Back to Community
set_universe with mavg - what am i doing wrong here?

Hello. I'm trying to simply buy the universe depending on their moving averages but the short and long average are always == to each other.
Am I missing something? should i be doing this a different way?

Clone Algorithm
3
Loading...
Backtest from to with initial capital
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
def initialize(context):
    set_slippage(slippage.FixedSlippage())
    set_universe(universe.DollarVolumeUniverse(98.0, 99.0))
    context.bought = False

def handle_data(context, data):
    # buy the universe on day 1    
    if not context.bought:
        for s in data:
            sa = data[s].mavg(20)
            la = data[s].mavg(50)        
            print str(sa) + " : " + str(la)
            if sa > la:
                order(s, 45)
        context.bought = True
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.
3 responses

ahh I see the bug now. It thinks it has bought the universe on the first day and never tries again. silly me.

Hi Bob,

Yes, you have the flag in the wrong indentation level :).

There is another subtlety you are encountering too. The rolling transforms don't backfill - they accumulate their data as the simulation runs. So, on day 1, they have just the first bar of data. As a result, the long and short moving averages will be identical until day 20, when the short moving average begins to drop older data points and the long average keeps accumulating.

In the attached backtest, I dropped the bought flag and reduced it to just apple's stock. I also subsituted record calls for the orders, so you can see the moving averages start separating around day 20. Finally, instead of using the cross over to signal a buy, I record a signal (arbitrarily scaled to be noticeable).

Thanks for posting, I hope this helps.

thanks,
fawce

Clone Algorithm
3
Loading...
Backtest from to with initial capital
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
def initialize(context):
    set_slippage(slippage.FixedSlippage())
    # set_universe(universe.DollarVolumeUniverse(98.0, 99.0))
    context.stock = sid(24)
    context.bought = False

def handle_data(context, data):
    # buy the universe on day 1    
    if not context.bought:
        for s in data:
            sa = data[s].mavg(20)
            la = data[s].mavg(50)        
            record(sa=sa, la=la)
            if sa > la:
                record(sa_gt_la=50)
            else:
                record(sa_gt_la=0)
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.
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.

Ahh yeah. As a C# guy these indent levels are driving me nuts hehe. Thanks for your detailed explanation though!