@@ -200,8 +200,8 @@ def prepare_tick_data_from_bars(
200
200
201
201
# Merge tick data
202
202
df_ticks_final = pd.concat([df_ticks_o, df_ticks_h, df_ticks_l, df_ticks_c])
203
- df_ticks_final.dropna(inplace = True )
204
- df_ticks_final.sort_index(axis = 0 , kind = " mergesort" , inplace = True )
203
+ df_ticks_final = df_ticks_final .dropna()
204
+ df_ticks_final = df_ticks_final .sort_index(axis = 0 , kind = " mergesort" )
205
205
206
206
cdef int i
207
207
# Randomly shift high low prices
@@ -572,32 +572,24 @@ cdef class TradeTickDataWrangler:
572
572
# Ensure index is tz-aware UTC
573
573
data = as_utc_index(data)
574
574
575
- # Determine the Aggressor Side based on Close vs Open
576
- if " side" not in data and " buyer_maker" not in data:
577
- data[' side' ] = [' BUY' if close > open_ else ' SELL' for open_, close in zip (data[' open' ], data[' close' ])]
578
-
579
575
cdef dict data_open = {
580
576
" price" : data[" open" ],
581
577
" size" : data[" volume" ] / 4 ,
582
- " side" : data[" side" ],
583
578
}
584
579
585
580
cdef dict data_high = {
586
581
" price" : data[" high" ],
587
582
" size" : data[" volume" ] / 4 ,
588
- " side" : data[" side" ],
589
583
}
590
584
591
585
cdef dict data_low = {
592
586
" price" : data[" low" ],
593
587
" size" : data[" volume" ] / 4 ,
594
- " side" : data[" side" ],
595
588
}
596
589
597
590
cdef dict data_close = {
598
591
" price" : data[" close" ],
599
592
" size" : data[" volume" ] / 4 ,
600
- " side" : data[" side" ],
601
593
}
602
594
603
595
df_ticks_final, ts_events, ts_inits = prepare_tick_data_from_bars(
@@ -612,12 +604,19 @@ cdef class TradeTickDataWrangler:
612
604
)
613
605
df_ticks_final[" trade_id" ] = df_ticks_final.index.view(np.uint64).astype(str )
614
606
607
+ # Adjust size precision
608
+ size_precision = self .instrument.size_precision
609
+ if is_raw:
610
+ df_ticks_final[" size" ] = df_ticks_final[" size" ].apply(lambda x : round (x, size_precision - 9 ))
611
+ else :
612
+ df_ticks_final[" size" ] = df_ticks_final[" size" ].round(size_precision)
613
+
615
614
if is_raw:
616
615
return list (map (
617
616
self ._build_tick_from_raw,
618
617
df_ticks_final[" price" ],
619
618
df_ticks_final[" size" ],
620
- self ._create_side_if_not_exist(data ),
619
+ self ._create_side_if_not_exist(df_ticks_final ),
621
620
df_ticks_final[" trade_id" ],
622
621
ts_events,
623
622
ts_inits,
@@ -627,7 +626,7 @@ cdef class TradeTickDataWrangler:
627
626
self ._build_tick,
628
627
df_ticks_final[" price" ],
629
628
df_ticks_final[" size" ],
630
- self ._create_side_if_not_exist(data ),
629
+ self ._create_side_if_not_exist(df_ticks_final ),
631
630
df_ticks_final[" trade_id" ],
632
631
ts_events,
633
632
ts_inits,
@@ -636,8 +635,10 @@ cdef class TradeTickDataWrangler:
636
635
def _create_side_if_not_exist (self , data ):
637
636
if " side" in data.columns:
638
637
return data[" side" ].apply(lambda x : AggressorSide.BUYER if str (x).upper() == " BUY" else AggressorSide.SELLER)
639
- else :
638
+ elif " buyer_maker " in data.columns :
640
639
return data[" buyer_maker" ].apply(lambda x : AggressorSide.SELLER if x is True else AggressorSide.BUYER)
640
+ else :
641
+ return [AggressorSide.NO_AGGRESSOR] * len (data)
641
642
642
643
# cpdef method for Python wrap() (called with map)
643
644
cpdef TradeTick _build_tick_from_raw(
0 commit comments