Quantopian's community platform is shutting down. Please read this post for more information and download your code.
Back to Community
data.history and schedule function

In my handle_data function I call the following API to get closing and open price:

min_close = data.history(stock, "price", bar_count=100, frequency="1m")
min_open = data.history(stock, "open", bar_count=100, frequency="1m")

I noticed that at 9:31 am, which is the first time of the day when handle_date is called, the first bar I get for both closing price and open price is at 9:31:00 am. This is a little confusing for me that what exactly is the time stamp for both prices. For closing price, is it coming from the last second of the previous minute, which is 9:30:59 am? I have to assume that because this minute is not done yet so there is no closed price for it, right? If that is true, then what is the time stamp for the open price? Is it 9:30:00 am? Or is it 9:31:00? If it is the latter, then the closing price does not pair up with open price because there is one minute difference, right?

Could someone clarify this for me please?

Thanks

5 responses

One part of the puzzle: handle_data runs at the beginning of the minute and scheduled functions run at the end of their scheduled minute.

Blue, that is not accurate. When a new price bar is processed by the algorithm, handle_data() runs first, then any scheduled functions for that minute are run. I would describe them as consecutive, not "beginning/end of minute". The order of their operation is noted in the documentation.

Note: The handle_data function runs before any functions scheduled to
run in the same minute. Also, scheduled functions have the same
timeout restrictions as handle_data, i.e., the total amount of time
taken up by handle_data and any scheduled functions for the same
minute can't exceed 50 seconds.

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.

Chaoyu - think of the data as arriving in a bar. Each bar represents a minute of price/volume data. The prices and volume is aggregated from all of the trades that happend in the market during that minute. The bar is timestamped with the end of the measured minute. The bar includes open, close, high, low, volume, and price.

price is always forward-filled. The other fields (open, close, high, low, and volume) are never forward-filled.

So in your example, the 9:31 bar, the open price is the price of the first trade that happened during the minute that ended at 9:31:00. If there were no trades in that minute then it is a NaN. The price is going to be the price of the last trade that happened during that minute, and if there were no trades during the minute, it will be forward-filled from the most recent trade.

Note that there is no guarantee that the close of given minute will be identical to the open of the subsequent minute. If the last trade in a minute is $10, then the close is $10. If the first trade in the next minute is at $10.05, then then the open for that minute is $10.05.

I should have worded it differently, not at the end, that was wrong, instead at the end of--or following--any handle_data processing, and thanks: Or

Any handle_data contents are first, only then followed by any scheduled functions that minute.

Chaoyu, you might consider using .ffill() to avoid NaN for any with no trade that minute.

Got it. Thanks Dan and Blue!