Back to Community
Algorithm Flow

Hello,

This algorithm is set up to trade every minute.

In handle_data, the function is executing every minute but the output datetime is different from the current datetime.

The desired result is a datetime of the function's output that matches the current datetime.

for example, log.info is giving this:
2011-01-01 10:40 - handle_data INFO - 2011-01-01 16:40:00 (output1) / 2011-01-01 16:39:00 (output2)

instead of this(the desired result):
2011-01-01 10:40 - handle_data INFO - 2011-01-01 10:40:00 (output1) / 2011-01-01 10:39:00 (output2)

I can't seem to get the handle_data function to work in its current minute. Instead it appears to be looking forward into the future by 8 hours.
Any help here is appreciated.

Thanks,
-Ht

Clone Algorithm
5
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
import quantopian.algorithm as algo
from quantopian.algorithm import attach_pipeline, pipeline_output
from quantopian.pipeline import Pipeline
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.filters import QTradableStocksUS
import numpy as np
import pandas as pd
import datetime 
from quantopian.pipeline.data.morningstar import Fundamentals  
from quantopian.pipeline.factors import SimpleBeta
from quantopian.pipeline.data import EquityPricing

def initialize(context):
    context.aapl = sid(24)
    context.bench = sid(8554)

    total_minutes = 6*60 + 30
    
    for i in range(1, total_minutes):
        if i % 1 == 0:
            algo.schedule_function(
                rebalance,
                algo.date_rules.every_day(),
                algo.time_rules.market_open(minutes=i),
                )
            algo.schedule_function(
                handle_data,
                algo.date_rules.every_day(),
                algo.time_rules.market_open(minutes=i),
                )

    algo.attach_pipeline(make_pipeline(), 'pipeline')


def make_pipeline():
    base_universe = QTradableStocksUS()

    beta = SimpleBeta(target=sid(8554), regression_length=3)

    pipe = Pipeline(
        columns={
            'beta': beta,
        },
        screen=base_universe
    )
    return pipe


def before_trading_start(context, data):
    context.output = algo.pipeline_output('pipeline')

    context.security_list = context.output.index

def signal(price, volume, beta):
    return ((price*1.01) / volume) * beta
    
def handle_data(context, data):
    h = data.history(context.aapl, fields=["price", "volume"], bar_count=5, frequency="1m")
    
    b = context.output.beta[symbol('AAPL')]
    
    s1 = signal(h['price'][-1:], h['volume'][-1:], b)
    s2 = signal(h['price'][-2:-1], h['volume'][-2:-1], b)
    
    s3 = s1.append(s2)
    
    context.s3 = s3
    log.info(context.s3)
    
def rebalance(context, data):
    if not context.s3.empty:
        if context.s3.ix[-1,-1] > context.s3.ix[0,-1]:
            order(symbol('AAPL'), -100)
            log.info("Selling %s" % (symbol('AAPL')))
        if context.s3.ix[-1,-1] < context.s3.ix[0,-1]:
            order(symbol('AAPL'), 100)
            log.info("Buying %s" % (symbol('AAPL')))
    
    if len(context.portfolio.positions) > 0:  
        all_positions = "Current positions for %s : " % (str(get_datetime()))  
        for pos in context.portfolio.positions:  
            if context.portfolio.positions[pos].amount != 0:  
                all_positions += "%s at %s shares, " % (pos.symbol, context.portfolio.positions[pos].amount)  
        log.info(all_positions) 


There was a runtime error.
2 responses

When using the log method, the time to the left is always the simulated algo time displayed in the users current timezone. There's no way to change that other than setting your computer to a different timezone. The time to the right is whatever data one is logging. In this case it is data returned by the data.history method which is always the simulated algo time in UTC. (Since you are seeing an -8 hour difference then you probably are in the US/Pacific time zone?)

If you just want them to match then convert the result of the data.history method to US/Pacific time.

    h = data.history(context.aapl, fields=["price", "volume"], bar_count=5, frequency="1m")  
    h = h.tz_convert('US/Pacific')

However, It's often more clear to have results in the actual market time which is US/Eastern.

    h = data.history(context.aapl, fields=["price", "volume"], bar_count=5, frequency="1m")  
    h = h.tz_convert('US/Eastern')

The times will be off by 3 hours but that is probably what one on the west coast is accustomed to seeing.

Hope that helps.

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.

Yes, that fixed it.

Thanks for the help.