Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
polakowo
GitHub Repository: polakowo/vectorbt
Path: blob/master/examples/TradingSessions.ipynb
1071 views
Kernel: Python 3 (ipykernel)
import pandas as pd import numpy as np import vectorbt as vbt from datetime import timedelta
# Generate sample price price_idx = pd.date_range('2018-01-01 12:00:00', periods=48, freq='H') np.random.seed(42) price = pd.Series(np.random.uniform(size=price_idx.shape), index=price_idx) print(price)
2018-01-01 12:00:00 0.374540 2018-01-01 13:00:00 0.950714 2018-01-01 14:00:00 0.731994 2018-01-01 15:00:00 0.598658 2018-01-01 16:00:00 0.156019 2018-01-01 17:00:00 0.155995 2018-01-01 18:00:00 0.058084 2018-01-01 19:00:00 0.866176 2018-01-01 20:00:00 0.601115 2018-01-01 21:00:00 0.708073 2018-01-01 22:00:00 0.020584 2018-01-01 23:00:00 0.969910 2018-01-02 00:00:00 0.832443 2018-01-02 01:00:00 0.212339 2018-01-02 02:00:00 0.181825 2018-01-02 03:00:00 0.183405 2018-01-02 04:00:00 0.304242 2018-01-02 05:00:00 0.524756 2018-01-02 06:00:00 0.431945 2018-01-02 07:00:00 0.291229 2018-01-02 08:00:00 0.611853 2018-01-02 09:00:00 0.139494 2018-01-02 10:00:00 0.292145 2018-01-02 11:00:00 0.366362 2018-01-02 12:00:00 0.456070 2018-01-02 13:00:00 0.785176 2018-01-02 14:00:00 0.199674 2018-01-02 15:00:00 0.514234 2018-01-02 16:00:00 0.592415 2018-01-02 17:00:00 0.046450 2018-01-02 18:00:00 0.607545 2018-01-02 19:00:00 0.170524 2018-01-02 20:00:00 0.065052 2018-01-02 21:00:00 0.948886 2018-01-02 22:00:00 0.965632 2018-01-02 23:00:00 0.808397 2018-01-03 00:00:00 0.304614 2018-01-03 01:00:00 0.097672 2018-01-03 02:00:00 0.684233 2018-01-03 03:00:00 0.440152 2018-01-03 04:00:00 0.122038 2018-01-03 05:00:00 0.495177 2018-01-03 06:00:00 0.034389 2018-01-03 07:00:00 0.909320 2018-01-03 08:00:00 0.258780 2018-01-03 09:00:00 0.662522 2018-01-03 10:00:00 0.311711 2018-01-03 11:00:00 0.520068 Freq: H, dtype: float64
# Sessions must be equal - fill missing dates # Fill on first date before 12:00 and on last date after 11:00 first_date = price.index[0].date() last_date = price.index[-1].date()+timedelta(days=1) filled_idx = pd.date_range(first_date, last_date, freq='H') filled_price = price.reindex(filled_idx) print(filled_price)
2018-01-01 00:00:00 NaN 2018-01-01 01:00:00 NaN 2018-01-01 02:00:00 NaN 2018-01-01 03:00:00 NaN 2018-01-01 04:00:00 NaN .. 2018-01-03 20:00:00 NaN 2018-01-03 21:00:00 NaN 2018-01-03 22:00:00 NaN 2018-01-03 23:00:00 NaN 2018-01-04 00:00:00 NaN Freq: H, Length: 73, dtype: float64
# Remove dates that are outside of trading sessions session_price_idx = filled_price.between_time('9:00', '17:00', include_end=False).index session_price = filled_price.loc[session_price_idx] print(session_price)
2018-01-01 09:00:00 NaN 2018-01-01 10:00:00 NaN 2018-01-01 11:00:00 NaN 2018-01-01 12:00:00 0.374540 2018-01-01 13:00:00 0.950714 2018-01-01 14:00:00 0.731994 2018-01-01 15:00:00 0.598658 2018-01-01 16:00:00 0.156019 2018-01-02 09:00:00 0.139494 2018-01-02 10:00:00 0.292145 2018-01-02 11:00:00 0.366362 2018-01-02 12:00:00 0.456070 2018-01-02 13:00:00 0.785176 2018-01-02 14:00:00 0.199674 2018-01-02 15:00:00 0.514234 2018-01-02 16:00:00 0.592415 2018-01-03 09:00:00 0.662522 2018-01-03 10:00:00 0.311711 2018-01-03 11:00:00 0.520068 2018-01-03 12:00:00 NaN 2018-01-03 13:00:00 NaN 2018-01-03 14:00:00 NaN 2018-01-03 15:00:00 NaN 2018-01-03 16:00:00 NaN dtype: float64
# Select first and last ticks of each trading session and split price into ranges between those ticks start_idxs = session_price.index[session_price.index.hour == 9] end_idxs = session_price.index[session_price.index.hour == 16] price_per_session, _ = session_price.vbt(freq='1H').range_split(start_idxs=start_idxs, end_idxs=end_idxs) print(price_per_session)
split_idx 0 1 2 0 NaN 0.139494 0.662522 1 NaN 0.292145 0.311711 2 NaN 0.366362 0.520068 3 0.374540 0.456070 NaN 4 0.950714 0.785176 NaN 5 0.731994 0.199674 NaN 6 0.598658 0.514234 NaN 7 0.156019 0.592415 NaN
# Run your strategy (here using random signals) entries, exits = pd.DataFrame.vbt.signals.generate_random_both(price_per_session.shape, n=2, seed=42) pf = vbt.Portfolio.from_signals(price_per_session, entries, exits, freq='1H') print(pf.total_return())
0 -0.786858 1 1.466807 2 -0.529509 Name: total_return, dtype: float64