Data Retrieval#

OneTick is a time series database meaning that each record has a timestamp and timestamps of consecutive records are non-decreasing. Multiple time series are stored in OneTick. An individual time series is identified by the symbol (aka ticker, financial instrument, security), tick type (i.e., the type of data such as trades or quotes), and the name of the database where the time series is stored.

import onetick.py as otp

s = otp.dt(2023, 5, 15, 9, 30)
e = otp.dt(2023, 5, 15, 9, 30, 1)

# we can retrieve the list of databases available
dbs = otp.databases()
list(dbs)[:5]
['ABU_DHABI', 'ABU_DHABI_BARS', 'ACTIV_ALPHA', 'ACTIV_ALPHA_X', 'ACTIV_ATHENS']
# the list of dates with data for the db
dbs['ACTIV_CANADA'].dates()[-5:]
[datetime.date(2024, 12, 16),
 datetime.date(2024, 12, 17),
 datetime.date(2024, 12, 18),
 datetime.date(2024, 12, 19),
 datetime.date(2024, 12, 20)]
# or just the last day with data
dbs['ACTIV_CANADA'].last_date
datetime.date(2024, 12, 20)
# and the list of tick types
dbs['ACTIV_CANADA'].tick_types()
['DAY', 'QTE', 'STAT', 'TRD']

We can now retrieve symbols traded in a given time range. (In many financial markets, there are properties that remain constant throughout the trading day. Examples include the name of a financial instrument and the set of instruments traded).

symbols = otp.Symbols('ACTIV_CANADA')
otp.run(symbols, start=otp.dt(2023, 4, 11), end=otp.dt(2023, 4, 12))
Time SYMBOL_NAME
0 2023-04-11 A.H
1 2023-04-11 AAA.P
2 2023-04-11 AAAJ.P
3 2023-04-11 AAB
4 2023-04-11 AAC.P
... ... ...
5737 2023-04-11 ZYZ.SB.A
5738 2023-04-11 ZYZ.UN.U
5739 2023-04-11 ZZE.H
5740 2023-04-11 ZZZ
5741 2023-04-11 ZZZD

5742 rows × 2 columns

We used the otp.run method above, which executed a query that retrieved the list of symbols.

The start and end timestamps were specified with onetick-py’s datetime class otp.dt.

Now that we have database names, tick types, and symbols, we are ready to query a time series.

q = otp.DataSource('NYSE_TAQ', tick_type='TRD')
otp.run(q, start=s, end=e, symbols=['SPY'])
Time EXCHANGE COND STOP_STOCK SOURCE TRF TTE TICKER PRICE DELETED_TIME TICK_STATUS SIZE CORR SEQ_NUM TRADE_ID PARTICIPANT_TIME TRF_TIME OMDSEQ
0 2023-05-15 09:30:00.000178688 P T N C 0 SPY 412.22 1969-12-31 19:00:00 0 100 0 39195 52983525167153 2023-05-15 09:30:00.000150016 1969-12-31 19:00:00.000000000 0
1 2023-05-15 09:30:00.000776704 Z N C 0 SPY 412.22 1969-12-31 19:00:00 0 247 0 39196 52983525035355 2023-05-15 09:30:00.000450000 1969-12-31 19:00:00.000000000 1
2 2023-05-15 09:30:00.003603456 T T N C 0 SPY 412.22 1969-12-31 19:00:00 0 100 0 39212 62879133157950 2023-05-15 09:30:00.003165122 1969-12-31 19:00:00.000000000 0
3 2023-05-15 09:30:00.006352128 K I N C 0 SPY 412.24 1969-12-31 19:00:00 0 1 0 39227 52983525098301 2023-05-15 09:30:00.006091000 1969-12-31 19:00:00.000000000 0
4 2023-05-15 09:30:00.007128064 K I N C 0 SPY 412.24 1969-12-31 19:00:00 0 3 0 39231 52983525098302 2023-05-15 09:30:00.006873000 1969-12-31 19:00:00.000000000 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
310 2023-05-15 09:30:00.934032640 T T N C 0 SPY 412.27 1969-12-31 19:00:00 0 160 0 40517 62879133545538 2023-05-15 09:30:00.933678033 1969-12-31 19:00:00.000000000 1
311 2023-05-15 09:30:00.975609344 D I N C T 0 SPY 412.24 1969-12-31 19:00:00 0 2 0 40543 71675240595789 2023-05-15 09:30:00.661000000 2023-05-15 09:30:00.975241514 0
312 2023-05-15 09:30:00.980264448 D I N C T 0 SPY 412.27 1969-12-31 19:00:00 0 1 0 40545 71675240596294 2023-05-15 09:30:00.553501000 2023-05-15 09:30:00.979895700 0
313 2023-05-15 09:30:00.985391616 T N C 0 SPY 412.28 1969-12-31 19:00:00 0 100 0 40547 62879133552717 2023-05-15 09:30:00.984946104 1969-12-31 19:00:00.000000000 0
314 2023-05-15 09:30:00.985394944 T Q N C 0 SPY 412.28 1969-12-31 19:00:00 0 100 0 40549 62879133552719 2023-05-15 09:30:00.984958312 1969-12-31 19:00:00.000000000 1

315 rows × 18 columns

Note that we specified the start and end of the time series to retrieve the corresponding interval.

Warning

In otp.DataSource default value of the parameter schema_policy enables automatic deduction of the data schema.

It works fine for simple cases like using onetick-py in Jupyter notebooks, but it is highly not recommended for production code.

For details see Schema deduction mechanism.

Let’s just keep the columns we’re interested in to make it more digestible.

q = otp.DataSource('NYSE_TAQ', tick_type='TRD')
q = q[['PRICE', 'SIZE', 'COND', 'EXCHANGE']]
otp.run(q, start=s, end=e, symbols=['SPY'])
Time PRICE SIZE COND EXCHANGE
0 2023-05-15 09:30:00.000178688 412.22 100 T P
1 2023-05-15 09:30:00.000776704 412.22 247 Z
2 2023-05-15 09:30:00.003603456 412.22 100 T T
3 2023-05-15 09:30:00.006352128 412.24 1 I K
4 2023-05-15 09:30:00.007128064 412.24 3 I K
... ... ... ... ... ...
310 2023-05-15 09:30:00.934032640 412.27 160 T T
311 2023-05-15 09:30:00.975609344 412.24 2 I D
312 2023-05-15 09:30:00.980264448 412.27 1 I D
313 2023-05-15 09:30:00.985391616 412.28 100 T
314 2023-05-15 09:30:00.985394944 412.28 100 Q T

315 rows × 5 columns

We can retrieve multiple time series.

q = otp.DataSource('NYSE_TAQ', tick_type='TRD')
q = q[['PRICE', 'SIZE', 'COND', 'EXCHANGE']]
mult = otp.run(q, start=s, end=e, symbols=['SPY', 'QQQ'])
mult
{'SPY':                              Time   PRICE  SIZE  COND EXCHANGE
 0   2023-05-15 09:30:00.000178688  412.22   100    T         P
 1   2023-05-15 09:30:00.000776704  412.22   247              Z
 2   2023-05-15 09:30:00.003603456  412.22   100    T         T
 3   2023-05-15 09:30:00.006352128  412.24     1     I        K
 4   2023-05-15 09:30:00.007128064  412.24     3     I        K
 ..                            ...     ...   ...   ...      ...
 310 2023-05-15 09:30:00.934032640  412.27   160    T         T
 311 2023-05-15 09:30:00.975609344  412.24     2     I        D
 312 2023-05-15 09:30:00.980264448  412.27     1     I        D
 313 2023-05-15 09:30:00.985391616  412.28   100              T
 314 2023-05-15 09:30:00.985394944  412.28   100     Q        T
 
 [315 rows x 5 columns],
 'QQQ':                              Time   PRICE  SIZE  COND EXCHANGE
 0   2023-05-15 09:30:00.000234302  325.51   300  @           B
 1   2023-05-15 09:30:00.001657060  325.54     2  @  I        Z
 2   2023-05-15 09:30:00.001661871  325.54   166  @           Z
 3   2023-05-15 09:30:00.001667551  325.54   167  @           Z
 4   2023-05-15 09:30:00.001671172  325.54   100  @           Z
 ..                            ...     ...   ...   ...      ...
 378 2023-05-15 09:30:00.973742814  325.52     4  @  I        P
 379 2023-05-15 09:30:00.974814807  325.53    50  @  I        Q
 380 2023-05-15 09:30:00.975917138  325.51     7  @  I        P
 381 2023-05-15 09:30:00.984404972  325.52    65  @F I        Z
 382 2023-05-15 09:30:00.999619637  325.50     6  @  I        Q
 
 [383 rows x 5 columns]}

Each time series is returned as the value of a dict keyed by the corresponding symbol.

mult['QQQ']
Time PRICE SIZE COND EXCHANGE
0 2023-05-15 09:30:00.000234302 325.51 300 @ B
1 2023-05-15 09:30:00.001657060 325.54 2 @ I Z
2 2023-05-15 09:30:00.001661871 325.54 166 @ Z
3 2023-05-15 09:30:00.001667551 325.54 167 @ Z
4 2023-05-15 09:30:00.001671172 325.54 100 @ Z
... ... ... ... ... ...
378 2023-05-15 09:30:00.973742814 325.52 4 @ I P
379 2023-05-15 09:30:00.974814807 325.53 50 @ I Q
380 2023-05-15 09:30:00.975917138 325.51 7 @ I P
381 2023-05-15 09:30:00.984404972 325.52 65 @F I Z
382 2023-05-15 09:30:00.999619637 325.50 6 @ I Q

383 rows × 5 columns

We can also retrieve all of the symbols from the database or all of the symbols matching a pattern.

q = otp.DataSource('NYSE_TAQ', tick_type='TRD')
q = q[['PRICE', 'SIZE', 'COND', 'EXCHANGE']]
mult = otp.run(q, start=s, end=e, symbols=otp.Symbols('NYSE_TAQ', pattern='AAA%'))
mult
{'AAA':                            Time  PRICE  SIZE  COND EXCHANGE
 0 2023-05-15 09:30:00.227737600  24.55    20     I        P
 1 2023-05-15 09:30:00.227740672  24.55    20     Q        P,
 'AAAU':                            Time   PRICE  SIZE  COND EXCHANGE
 0 2023-05-15 09:30:00.018481664  19.990  7985   O X        Z
 1 2023-05-15 09:30:00.033499392  19.990    50   4 I        D
 2 2023-05-15 09:30:00.034347520  19.990    61   4 I        D
 3 2023-05-15 09:30:00.034804480  19.990   250   4          D
 4 2023-05-15 09:30:00.041420288  19.990    77     I        K
 5 2023-05-15 09:30:00.042842624  19.990  6000    T         T
 6 2023-05-15 09:30:00.184702208  19.990     1     I        D
 7 2023-05-15 09:30:00.219001600  19.995     2     I        Z
 8 2023-05-15 09:30:00.817365248  19.995     1     I        D}

We can merge all of the time series by time by using otp.merge function.

Parameter identify_input_ts here automatically adds SYMBOL_NAME and TICK_TYPE columns to the output, so each tick can be identified.

q = otp.DataSource('NYSE_TAQ', tick_type='TRD')
q = q[['PRICE', 'SIZE', 'COND', 'EXCHANGE']]
q = otp.merge([q], symbols=['SPY', 'QQQ'], identify_input_ts=True)
single = otp.run(q, start=s, end=e)
single
Time PRICE SIZE COND EXCHANGE SYMBOL_NAME TICK_TYPE
0 2023-05-15 09:30:00.000178688 412.22 100 T P SPY TRD
1 2023-05-15 09:30:00.000234302 325.51 300 @ B QQQ TRD
2 2023-05-15 09:30:00.000776704 412.22 247 Z SPY TRD
3 2023-05-15 09:30:00.001657060 325.54 2 @ I Z QQQ TRD
4 2023-05-15 09:30:00.001661871 325.54 166 @ Z QQQ TRD
... ... ... ... ... ... ... ...
693 2023-05-15 09:30:00.980264448 412.27 1 I D SPY TRD
694 2023-05-15 09:30:00.984404972 325.52 65 @F I Z QQQ TRD
695 2023-05-15 09:30:00.985391616 412.28 100 T SPY TRD
696 2023-05-15 09:30:00.985394944 412.28 100 Q T SPY TRD
697 2023-05-15 09:30:00.999619637 325.50 6 @ I Q QQQ TRD

698 rows × 7 columns

The time range and symbols can be specified directly on the data source. This way we can have different times ranges for difference sources that we can later merge.

q = otp.DataSource('NYSE_TAQ', tick_type='TRD', start=s, end=e, symbols=['SPY'])
otp.run(q)
Time EXCHANGE COND STOP_STOCK SOURCE TRF TTE TICKER PRICE DELETED_TIME TICK_STATUS SIZE CORR SEQ_NUM TRADE_ID PARTICIPANT_TIME TRF_TIME OMDSEQ
0 2023-05-15 09:30:00.000178688 P T N C 0 SPY 412.22 1969-12-31 19:00:00 0 100 0 39195 52983525167153 2023-05-15 09:30:00.000150016 1969-12-31 19:00:00.000000000 0
1 2023-05-15 09:30:00.000776704 Z N C 0 SPY 412.22 1969-12-31 19:00:00 0 247 0 39196 52983525035355 2023-05-15 09:30:00.000450000 1969-12-31 19:00:00.000000000 1
2 2023-05-15 09:30:00.003603456 T T N C 0 SPY 412.22 1969-12-31 19:00:00 0 100 0 39212 62879133157950 2023-05-15 09:30:00.003165122 1969-12-31 19:00:00.000000000 0
3 2023-05-15 09:30:00.006352128 K I N C 0 SPY 412.24 1969-12-31 19:00:00 0 1 0 39227 52983525098301 2023-05-15 09:30:00.006091000 1969-12-31 19:00:00.000000000 0
4 2023-05-15 09:30:00.007128064 K I N C 0 SPY 412.24 1969-12-31 19:00:00 0 3 0 39231 52983525098302 2023-05-15 09:30:00.006873000 1969-12-31 19:00:00.000000000 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
310 2023-05-15 09:30:00.934032640 T T N C 0 SPY 412.27 1969-12-31 19:00:00 0 160 0 40517 62879133545538 2023-05-15 09:30:00.933678033 1969-12-31 19:00:00.000000000 1
311 2023-05-15 09:30:00.975609344 D I N C T 0 SPY 412.24 1969-12-31 19:00:00 0 2 0 40543 71675240595789 2023-05-15 09:30:00.661000000 2023-05-15 09:30:00.975241514 0
312 2023-05-15 09:30:00.980264448 D I N C T 0 SPY 412.27 1969-12-31 19:00:00 0 1 0 40545 71675240596294 2023-05-15 09:30:00.553501000 2023-05-15 09:30:00.979895700 0
313 2023-05-15 09:30:00.985391616 T N C 0 SPY 412.28 1969-12-31 19:00:00 0 100 0 40547 62879133552717 2023-05-15 09:30:00.984946104 1969-12-31 19:00:00.000000000 0
314 2023-05-15 09:30:00.985394944 T Q N C 0 SPY 412.28 1969-12-31 19:00:00 0 100 0 40549 62879133552719 2023-05-15 09:30:00.984958312 1969-12-31 19:00:00.000000000 1

315 rows × 18 columns

For example, we can get the data from March 29 for SPY and from April 20 for QQQ.

spy = otp.DataSource('NYSE_TAQ', tick_type='TRD', start=otp.dt(2023, 3, 29, 9, 30), end=otp.dt(2023, 3, 29, 9, 30, 1), symbols=['SPY'])
qqq = otp.DataSource('NYSE_TAQ', tick_type='TRD', start=otp.dt(2023, 4, 20, 9, 30), end=otp.dt(2023, 4, 20, 9, 30, 1), symbols=['QQQ'])
merged = otp.merge([spy, qqq], identify_input_ts=True)
merged = merged[['PRICE', 'SIZE', 'SYMBOL_NAME']]
otp.run(merged)
Time PRICE SIZE SYMBOL_NAME
0 2023-03-29 09:30:00.000877568 399.920 400 SPY
1 2023-03-29 09:30:00.001151232 399.920 1000 SPY
2 2023-03-29 09:30:00.001154304 399.920 1000 SPY
3 2023-03-29 09:30:00.001921280 399.930 657 SPY
4 2023-03-29 09:30:00.010831360 399.925 100 SPY
... ... ... ... ...
749 2023-04-20 09:30:00.989278707 315.640 41 QQQ
750 2023-04-20 09:30:00.989278785 315.640 10 QQQ
751 2023-04-20 09:30:00.990793766 315.620 100 QQQ
752 2023-04-20 09:30:00.990868824 315.610 186 QQQ
753 2023-04-20 09:30:00.990872151 315.610 1314 QQQ

754 rows × 4 columns

We can also specify multiple symbols in the data source in which case they will be merged by time.

q = otp.DataSource('NYSE_TAQ', tick_type='TRD', start=s, end=e, symbols=['SPY', 'QQQ'])
otp.run(q)
Time EXCHANGE COND STOP_STOCK SOURCE TRF TTE TICKER PRICE DELETED_TIME TICK_STATUS SIZE CORR SEQ_NUM TRADE_ID PARTICIPANT_TIME TRF_TIME OMDSEQ
0 2023-05-15 09:30:00.000178688 P T N C 0 SPY 412.22 1969-12-31 19:00:00 0 100 0 39195 52983525167153 2023-05-15 09:30:00.000150016 1969-12-31 19:00:00.000000000 0
1 2023-05-15 09:30:00.000234302 B @ N 0 QQQ 325.51 1969-12-31 19:00:00 0 300 0 67371 44 2023-05-15 09:30:00.000211220 1969-12-31 19:00:00.000000000 0
2 2023-05-15 09:30:00.000776704 Z N C 0 SPY 412.22 1969-12-31 19:00:00 0 247 0 39196 52983525035355 2023-05-15 09:30:00.000450000 1969-12-31 19:00:00.000000000 1
3 2023-05-15 09:30:00.001657060 Z @ I N 0 QQQ 325.54 1969-12-31 19:00:00 0 2 0 67373 460 2023-05-15 09:30:00.001437000 1969-12-31 19:00:00.000000000 0
4 2023-05-15 09:30:00.001661871 Z @ N 0 QQQ 325.54 1969-12-31 19:00:00 0 166 0 67374 461 2023-05-15 09:30:00.001437000 1969-12-31 19:00:00.000000000 1
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
693 2023-05-15 09:30:00.980264448 D I N C T 0 SPY 412.27 1969-12-31 19:00:00 0 1 0 40545 71675240596294 2023-05-15 09:30:00.553501000 2023-05-15 09:30:00.979895700 0
694 2023-05-15 09:30:00.984404972 Z @F I N 1 QQQ 325.52 1969-12-31 19:00:00 0 65 0 73144 507 2023-05-15 09:30:00.984206000 1969-12-31 19:00:00.000000000 0
695 2023-05-15 09:30:00.985391616 T N C 0 SPY 412.28 1969-12-31 19:00:00 0 100 0 40547 62879133552717 2023-05-15 09:30:00.984946104 1969-12-31 19:00:00.000000000 0
696 2023-05-15 09:30:00.985394944 T Q N C 0 SPY 412.28 1969-12-31 19:00:00 0 100 0 40549 62879133552719 2023-05-15 09:30:00.984958312 1969-12-31 19:00:00.000000000 1
697 2023-05-15 09:30:00.999619637 Q @ I N 0 QQQ 325.50 1969-12-31 19:00:00 0 6 0 73175 1987 2023-05-15 09:30:00.999602699 1969-12-31 19:00:00.000000000 0

698 rows × 18 columns

We can look up symbols in multiple databases.

q = otp.DataSource(tick_type='TRD')
q = q.table(PRICE=float, SIZE=int)
q = otp.merge(q, symbols=['NYSE_TAQ::SPY', 'TDI_FUT::ES_r_tdi'], identify_input_ts=True)
otp.run(q, start=s, end=e, symbol_date=s)
Time PRICE SIZE SYMBOL_NAME TICK_TYPE
0 2023-05-15 09:30:00.000000000 4143.00 4 TDI_FUT::ES_r_tdi TRD
1 2023-05-15 09:30:00.000178688 412.22 100 NYSE_TAQ::SPY TRD
2 2023-05-15 09:30:00.000776704 412.22 247 NYSE_TAQ::SPY TRD
3 2023-05-15 09:30:00.001000000 4143.00 4 TDI_FUT::ES_r_tdi TRD
4 2023-05-15 09:30:00.001000000 4143.25 1 TDI_FUT::ES_r_tdi TRD
... ... ... ... ... ...
547 2023-05-15 09:30:00.986000000 4143.75 9 TDI_FUT::ES_r_tdi TRD
548 2023-05-15 09:30:00.986000000 4143.75 1 TDI_FUT::ES_r_tdi TRD
549 2023-05-15 09:30:00.986000000 4143.75 2 TDI_FUT::ES_r_tdi TRD
550 2023-05-15 09:30:00.986000000 4143.75 2 TDI_FUT::ES_r_tdi TRD
551 2023-05-15 09:30:00.986000000 4143.75 2 TDI_FUT::ES_r_tdi TRD

552 rows × 5 columns

We can also look up the same symbols in different databases (even if they have different tick types).

qte = otp.DataSource('NYSE_TAQ', tick_type='QTE')
qte = qte[['BID_PRICE', 'ASK_PRICE']]
nbbo = otp.DataSource('TAQ_NBBO', tick_type='NBBO')
nbbo = nbbo[['BID_PRICE', 'ASK_PRICE']]

q = otp.merge([qte,nbbo], symbols=['SPY', 'QQQ'], identify_input_ts=True)
otp.run(q, start=s, end=s+otp.Milli(1))
Time BID_PRICE ASK_PRICE SYMBOL_NAME TICK_TYPE
0 2023-05-15 09:30:00.000174080 412.21 412.26 SPY QTE
1 2023-05-15 09:30:00.000174080 412.22 412.25 SPY NBBO
2 2023-05-15 09:30:00.000293590 325.51 325.55 QQQ QTE
3 2023-05-15 09:30:00.000293590 325.51 325.54 QQQ NBBO
4 2023-05-15 09:30:00.000524867 325.51 325.57 QQQ QTE
5 2023-05-15 09:30:00.000524962 325.06 325.57 QQQ QTE
6 2023-05-15 09:30:00.000524962 325.51 325.54 QQQ NBBO
7 2023-05-15 09:30:00.000580467 325.51 325.55 QQQ QTE
8 2023-05-15 09:30:00.000580467 325.51 325.54 QQQ NBBO
9 2023-05-15 09:30:00.000595200 412.21 412.24 SPY QTE
10 2023-05-15 09:30:00.000595200 412.22 412.24 SPY NBBO
11 2023-05-15 09:30:00.000610755 325.51 325.54 QQQ QTE
12 2023-05-15 09:30:00.000610755 325.51 325.54 QQQ NBBO
13 2023-05-15 09:30:00.000640528 325.51 325.54 QQQ QTE
14 2023-05-15 09:30:00.000640528 325.51 325.54 QQQ NBBO
15 2023-05-15 09:30:00.000715520 412.21 412.25 SPY QTE
16 2023-05-15 09:30:00.000715520 412.21 412.24 SPY NBBO
17 2023-05-15 09:30:00.000730138 325.51 325.54 QQQ QTE
18 2023-05-15 09:30:00.000730138 325.51 325.54 QQQ NBBO
19 2023-05-15 09:30:00.000752301 325.51 325.55 QQQ QTE
20 2023-05-15 09:30:00.000752301 325.51 325.54 QQQ NBBO
21 2023-05-15 09:30:00.000790784 412.22 412.25 SPY QTE
22 2023-05-15 09:30:00.000790784 412.22 412.24 SPY NBBO
23 2023-05-15 09:30:00.000845125 325.51 325.54 QQQ QTE
24 2023-05-15 09:30:00.000845125 325.51 325.54 QQQ NBBO
25 2023-05-15 09:30:00.000860928 412.22 412.25 SPY QTE
26 2023-05-15 09:30:00.000860928 412.22 412.24 SPY NBBO
27 2023-05-15 09:30:00.000924837 325.06 325.57 QQQ QTE
28 2023-05-15 09:30:00.000924837 325.51 325.54 QQQ NBBO
29 2023-05-15 09:30:00.000931072 412.21 412.24 SPY QTE
30 2023-05-15 09:30:00.000931072 412.21 412.24 SPY QTE
31 2023-05-15 09:30:00.000931072 412.22 412.24 SPY NBBO
32 2023-05-15 09:30:00.000931072 412.22 412.24 SPY NBBO
33 2023-05-15 09:30:00.000935936 412.21 412.26 SPY QTE
34 2023-05-15 09:30:00.000966144 412.21 412.25 SPY QTE
35 2023-05-15 09:30:00.000966144 412.22 412.25 SPY NBBO
36 2023-05-15 09:30:00.000996096 412.22 412.24 SPY QTE
37 2023-05-15 09:30:00.000996096 412.22 412.24 SPY NBBO

Generating ticks#

There are several ways to generate ticks without accessing the database. It’s very useful in case you want to check some algorithm fast or to create a test-case.

Classes otp.Tick and otp.Ticks can be used for this purpose.

otp.Tick can be used to generate a single tick for the whole time range:

data = otp.Tick(A=1)
data['B'] = 2
otp.run(data)
Time A B
0 2003-12-01 1 2

Or to generate ticks with some interval, for example every day:

data = otp.Tick(A=otp.math.rand(1, 100), bucket_interval=1, bucket_units='days')
otp.run(data, start=otp.dt(2022, 1, 1), end=otp.dt(2022, 1, 6))
Time A
0 2022-01-01 76
1 2022-01-02 57
2 2022-01-03 48
3 2022-01-04 53
4 2022-01-05 8

And otp.Ticks can be used to generate many ticks with different fixed values:

data = otp.Ticks({'A': list(range(5)), 'B': ['c', 'd', 'e', 'f', 'g']})
otp.run(data)
Time A B
0 2003-12-01 00:00:00.000 0 c
1 2003-12-01 00:00:00.001 1 d
2 2003-12-01 00:00:00.002 2 e
3 2003-12-01 00:00:00.003 3 f
4 2003-12-01 00:00:00.004 4 g

otp.Ticks can also be used to generate ticks from pandas.DataFrame:

import pandas as pd

df = pd.DataFrame({'Time': [pd.Timestamp(2022, 1, 1, 1, 1, 1), pd.Timestamp(2022, 1, 2, 2, 2, 2)], 'A': [1, 2]})
data = otp.Ticks(df)
otp.run(data, start=otp.dt(2022, 1, 1), end=otp.dt(2022, 1, 6))
Time A
0 2022-01-01 01:01:01 1
1 2022-01-02 02:02:02 2