Price Improvement#
Each example is a self-contained script that can be run against the OneTick Cloud sample databases.
# onetick-py WebAPI configuration for OneTick Cloud
import os
os.environ['OTP_WEBAPI'] = '1'
os.environ['OTP_HTTP_ADDRESS'] = 'https://rest.cloud.onetick.com'
os.environ['OTP_ACCESS_TOKEN_URL'] = 'https://cloud-auth.parent.onetick.com/realms/OMD/protocol/openid-connect/token'
os.environ['OTP_CLIENT_ID'] = '__FILL_IN__'
os.environ['OTP_CLIENT_SECRET'] = '__FILL_IN__'
Price Improvement (bps) measures the distance from the far touch (FT) to the order execution VWAP in basis points.
Positive values indicate a good execution, negative a poor one.
PRICE_IMPROVEMENT_BPS = DIRECTION * 10000 * (FT - VWAP) / FT
FT is the arrival far touch by side (BUY -> arrival ask, SELL -> arrival bid).
The prevailing quote at arrival is joined “as of” to the order.
import onetick.py as otp
order = otp.DataSource(db='S_ORDERS_LSE_SAMPLE', tick_type='ORDER')
order = order[['ID', 'SIDE', 'PRICE_FILLED', 'QTY_FILLED']]
order['DIRECTION'] = order.if_else(order['SIDE'] == 'BUY', 1, -1)
qte = otp.DataSource(db='LSE_SAMPLE', tick_type='QTE')
qte = qte[['ASK_PRICE', 'BID_PRICE']]
joined = otp.join_by_time([order, qte])
data = joined.agg({
'VWAP_PRICE': otp.agg.vwap('PRICE_FILLED', 'QTY_FILLED'),
'ARRIVAL_ASK_PRICE': otp.agg.first('ASK_PRICE'),
'ARRIVAL_BID_PRICE': otp.agg.first('BID_PRICE'),
'SIDE': otp.agg.first('SIDE'),
'DIRECTION': otp.agg.first('DIRECTION'),
}, group_by=['ID'])
data['FT'] = data.if_else(data['SIDE'] == 'BUY', data['ARRIVAL_ASK_PRICE'], data['ARRIVAL_BID_PRICE'])
data = data.where(data['FT'] != 0)
data['PRICE_IMPROVEMENT_BPS'] = data['DIRECTION'] * 10000 * (data['FT'] - data['VWAP_PRICE']) / data['FT']
data = data[['ID', 'PRICE_IMPROVEMENT_BPS']]
result = otp.run(data,
start=otp.dt(2024, 1, 3),
end=otp.dt(2024, 1, 4),
timezone='Europe/London',
symbols='VOD')
result
Time |
ID |
PRICE_IMPROVEMENT_BPS |
|
|---|---|---|---|
0 |
2024-01-04 |
233402424600089290 |
5.681011 |
1 |
2024-01-04 |
233402424600163510 |
4.266818 |
2 |
2024-01-04 |
233402424600242327 |
4.241482 |
3 |
2024-01-04 |
233402424600242348 |
5.658509 |
4 |
2024-01-04 |
233402424600242354 |
5.658509 |
.. |
… |
… |
… |
25 |
2024-01-04 |
233402424601044819 |
1.428980 |
26 |
2024-01-04 |
233402424601076779 |
1.431025 |
27 |
2024-01-04 |
233402424601108653 |
1.429388 |
28 |
2024-01-04 |
233402424601108753 |
-0.000000 |
29 |
2024-01-04 |
233402424601134016 |
1.431229 |