Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

24/7 Trading #614

Open
vertangelx opened this issue Jun 18, 2015 · 13 comments
Open

24/7 Trading #614

vertangelx opened this issue Jun 18, 2015 · 13 comments
Labels

Comments

@vertangelx
Copy link

How can we define our own trading days and hours for special markets? For example, what settings will you change and how will you change it for a market that trades 24/7?

@ssanderson
Copy link
Contributor

ping @jfkirk

@ssanderson
Copy link
Contributor

@vertangelx I have a mostly-finished branch that overhauls the process for creating a custom trading calendar. That code lives in #556, though I'm not actively working on it at the moment. I haven't thought deeply about how to accomodate 24-hour markets, though I think @jfkirk has looked at that problem to some extent while working on support for futures.

@dannychua
Copy link

@ssanderson @jfkirk +1 interested in 24/7 markets

@warren-oneill
Copy link
Contributor

Hi all, I currently have a prototype implement for the German Epex energy market which is also 24/7.
What I did was a bit of a work-around but I basically I made a new tradingcalendar file and set the trading_days to be all days in the range and set the market hours to be between 00:00 and 23:59 although setting close to be at 00:00 on the following day could be better.

I then also had to make sure that the benchmark and treasury curves also had the same days as trading_days. To do this I wrote my own version of the load_market_data which generates a constant returns benchmark with the correct calendar and for the treasury curves I used reindex and forward-fill.

Finally you must intialize the TradingEnvironmnet with the correct calendar and loader before you run your algo:

trading.env = TradingEnvironment(env_trading_calendar=calendar_epex, load=load_epex)

Here are the links to the calendar and loader code.

One thing you have to watch out for is the timezone changes since this can push open or close into another day when converting to UTC but I'm hoping that this issue has been resolved with #579

@vertangelx
Copy link
Author

@warren-oneill How do you use loader_power.py to get load_epex that you pass into TradingEnvironment?

import loader_power as load_epex produced a TypeError: 'module' object is not callable.

trading.environment = TradingEnvironment(env_trading_calendar=calendar_epex, load=load_epex)

/Users/vertangelx/anaconda/envs/zipline/lib/python2.7/site-packages/zipline/finance/trading.pyc in __init__(self, load, bm_symbol, exchange_tz, max_date, env_trading_calendar)
     99 
    100         self.benchmark_returns, treasury_curves_map = \
--> 101             load(self.bm_symbol)
    102 
    103         self.treasury_curves = pd.DataFrame(treasury_curves_map).T

@warren-oneill
Copy link
Contributor

Try

from zipline.data.loader_power import load_market_data as load_epex

trading.environment = TradingEnvironment(env_trading_calendar=calendar_epex, load=load_epex)

@vertangelx
Copy link
Author

@warren-oneill I'm now getting an error AssertionError: Period end falls before the first known trading day.

data.AAA.price.head()

timestamp
2015-04-30 20:00:00+00:00    237.413
2015-04-30 21:00:00+00:00    237.914
2015-04-30 22:00:00+00:00    239.400
2015-04-30 23:00:00+00:00    238.550
2015-05-01 00:00:00+00:00    235.926
Freq: H, Name: price, dtype: float64

print calendar_epex.trading_days

DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
           '2013-01-05', '2013-01-06', '2013-01-07', '2013-01-08',
           '2013-01-09', '2013-01-10', 
           ...
           '2016-06-13', '2016-06-14', '2016-06-15', '2016-06-16',
           '2016-06-17', '2016-06-18', '2016-06-19', '2016-06-20',
           '2016-06-21', '2016-06-22'],
          dtype='datetime64[ns]', length=1269, freq='D', tz='UTC')

@warren-oneill
Copy link
Contributor

Try defining the start and end of the simulation

from zipline.utils.factory import create_simulation_parameters

start = data.index[0]
end = data.index[-1]
sim_params = create_simulation_parameters(start=start, end=end)
trading.environment = TradingEnvironment(env_trading_calendar=calendar_epex, load=load_epex,
                                                                     sim_params=sim_params)

where start and end are the first and last timestamp of your data.

@vertangelx
Copy link
Author

@warren-oneill A different error this time, thank you for your patience! Not sure why it's looking for 2015-04-29. which is 1 day before the first timestamp of data.

KeyError: Timestamp('2015-04-29 00:00:00+0000', tz='UTC')

Did some prints:

print data.AAA.index[0]
print data.AAA.index[-1]

2015-04-30 20:00:00+00:00
2015-06-14 02:00:00+00:00

@warren-oneill
Copy link
Contributor

are you using the newest version of zipline installed from github?

@vertangelx
Copy link
Author

@warren-oneill zp.__version__ gave '0.8.0rc1'. I did another update of zipline with pip install git+https://github.com/quantopian/zipline --upgrade but the same error persist

Tried start = data.index[10] but that did not help.

@warren-oneill
Copy link
Contributor

It could be something to do with timezone changes but its hard to say.

@ProZachJ
Copy link

ProZachJ commented Apr 7, 2017

Has anyone had any luck with this? I've implemented my own calendar as suggested above, but have run into the benchmark issue (at least I think that is what is causing the error). The example code @warren-oneill put up isn't visible anymore so having some difficulty understanding what other changes I need to make to get my custom calendar running.

Here is what I've done so far.

master...ProZachJ:poloniex_bundle

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

6 participants