Motivation
- ML Model์ ํ์ต์ํค๊ณ Real World์์ ์ข์ ํผํฌ๋จผ์ค๋ฅผ ๋ณด์ด๊ธฐ ์ํด์ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ฅ ์ค์ํ๋ค. ์ด๊ฒ์ ์ธ๊ฐ์ด ํ์ตํ๋ ๋ฐฉ์๊ณผ ๋ค๋ฅด์ง ์๋ค. ์ผ๋จ, ์ข์ ๊ต์ฌ๊ฐ ์์ด์ผ ํ๋ค.
- ๊ฐ์ฅ Rawํ '๋น๊ตฌ์กฐํ๋ ๊ธ์ต ๋ฐ์ดํฐ'์์ Bar(๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ ํํ, Table์ row)๋ก ๋ณํํ๋ ๊ณผ์ ์ ์๊ฐํ๋ค.
- ํต์ฌ์ Bar์ ML model๊ฐ์ ์ฐ๊ฒฐ์ด๋ค. ๊ธ์ต์ ML์ ์ ์ฉํ๋ ค๋ ๋๋ถ๋ถ์ ์ฌ๋๋ค์ด ๋์น๋ ๋ถ๋ถ์ ML Model์ ๋์ ์ ์ด๋ค.
- ML Model์ ๋์ ์ ๋ ๋ฐ์ดํฐ๊ฐ IID(Independent and identically distributed)ํ ์ํ์ฌ์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
- Bar๋ฅผ IIDํ ์ํค๋ฉด์๋ ๋ฐ์ดํฐ์ ์๋ ์๊ทธ๋์ ์ ์ง์ํฌ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํ๋ค.
Essential Types of Financial Data
Financial raw data
- ๊ธฐ์ด๋ฐ์ดํฐ : ๊ฐ๋
๊ธฐ๊ด ์ ์ถ ๋ฐ์ดํฐ, ๋๋ถ๋ถ ์ฌ๋ฌด์ ํ. ๋ฐฑํ๋ง(backfilled) & ์์ ๊ฐ(reinstated value)์ ์ฌ๊ฐํ ์ค๋ฅ๊ฐ ๋ง์์ point in time ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํจ.
- ์์ฅ๋ฐ์ดํฐ : ๊ฑฐ๋์์์ ๋ฐ์ํ๋ ๋ชจ๋ ๋ฐ์ดํฐ. FIX ๋ฉ์ธ์ง๋ฅผ ํตํด ๋ชจ๋ ๊ฑฐ๋ ์ฌํญ ์ฌ๊ตฌ์ฑ ๊ฐ๋ฅ, ํ๋ฃจ์ 10TB์ฉ ์์
- ๋ถ์๋ฐ์ดํฐ : ๊ธฐ์ด, ์์ฅ, ๋์ฒด ๋๋ ๋ค๋ฅธ ์ข
ํฉ ๋ฐ์ดํฐ๋ก ๋ถํฐ ํ์๋ ๋ฐ์ดํฐ ex) ์์ต ์์ธก, ๋ด์ค ๋ถ์, ์ ์ฉ ํ๊ฐ ๋ฐ์ดํฐ
- ๋์ฒด๋ฐ์ดํฐ : ๋น์ฆ๋์ค ํ๋ก์ธ์ค, ์ผ์, ์์ฑ ๋ฐ์ดํฐ ๋ฑ. ์ฐจ๋ณ์ : ์ต์ด ์ ๋ณด. ๋ถ๋ช
์๊ทธ๋์ ์ฐพ์๋ด๋ฉด ๋ฉ๋ฆฌํธ๋ ์์ผ๋ ๋น์ฉ์ด ํด ๊ฒ์ด๋ผ๋ ์ ์์ Trade-off
Bars
- ๊ตฌ์กฐํ ๋์ง ์์ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐํ ์ํจ ์ํ๋ฅผ ๋งํ๋ค. ๊ตฌ์กฐํ๋ 'Table'๊ณผ ๊ฐ์ ์ํ๋ผ๊ณ ๋ณด๊ณ Bar๋ Table์ row๋ฅผ ์๋ฏธ.
- ํํ, API๋ฅผ ํตํด์ ์ฃผ๋ ๋ชจ๋ ๊ฐ๊ฒฉ ๋ฐ์ดํฐ๋ค์ด Bar ํํ๋ฅผ ๋๊ณ ์์.
Standard Bars
Time Bars
- Time Bar์ ๊ฒฝ์ฐ ๊ณ ์ ๋ ์๊ฐ ๊ฐ๊ฒฉ์ผ๋ก ์ ๋ณด๋ฅผ ์ถ์ถํ๊ณ , ๋ณดํธ์ ์ผ๋ก ์ฌ์ฉ๋์ด์ ๊ฐํธํจ
- ๋ฐ์ดํฐ : timestamp, ohlcv, vwap
- ๋ฌธ์ ์ : ์ค์ํ ์ ๋ณด๊ฐ ์๋ ๊ตฌ๊ฐ์์ ๋ง์ ๊ฑฐ๋๊ฐ ์ด๋ค์ง๋ค. ํ์ง๋ง Time Bar๋ ์ด๋ฅผ ๊ณ ๋ คํ์ง ์๊ณ ๋ชจ๋ ์๊ฐ ๋จ์์ ๋ฐ๋ผ ์ผ์ ํ ์ค์๋๋ฅผ ๋ถ์ฌํด signal์ด ์๊ณก๋๋ค.
Tick Bars
- ๊ฑฐ๋ ์ฒด๊ฒฐ์ผ ๋ฐ์ํ๋ ์์ ๋ง๋ค ์ ๋ณด๋ฅผ ์ถ์ถํจ. ์ฒด๊ฒฐ ๋จ์๋ก๋ ์์ ๋ฐ์ดํฐ.
- ๋ฌธ์ ์ : ๋งค์ฐ ํฐ ์ด์์น๊ฐ ์กด์ฌํจ. ์๋ฅผ๋ค์ด, ๋์ํธ๊ฐ์ ๊ฒฝ์ฐ ์์ฒญ๋ง ์์ด๊ณ ๊ฑฐ๋๋ ์ผ์ด๋์ง ์์ผ๋ฉฐ ์ต์ข
์ ์ผ๋ก๋ ํ๋์ bar๋ก ์ฒ๋ฆฌ๋จ.
Volume Bars
- Tick Bars๋ฅผ ๊ธฐ์ค์ผ๋ก Mandelbrot & Taylor (1967)์ ํ๋ณธ ์ถ์ถ์ ๊ฑฐ๋ ๊ฑด์์ ํจ์๋ก ์ํํ๋ฉด IIDํ ๋ฐ์ดํฐ ํํ๋ก ๋ฐ๊ฟ ์ ์์์ ์ฃผ์ฅํ.
- ์์ ์ด๋ก ์ ๋ฐํ์ผ๋ก ์๋ฅผ ๋ค์ด๋ณด๋ฉด, ๊ฑฐ๋ ๊ฑด์ 1๋ง๊ฐ๊ฐ ๋ฐ์ํ๋ ์๊ฐ๋ง๋ค ์ถ์ถ์ ํ์ฌ Bars๋ฅผ ๊ตฌ์ฑํจ. ๊ทธ๋ ๊ฒ ๋๋ฉด ์์ Timestamp๋ ๋น์ฃผ๊ธฐ์ ์ธ ํํ๊ฐ ๋จ. Volume Bars๋ Time/Tick Bars์ ๋นํด ๋ฐ์ดํฐ๊ฐ IIDํ ๋๋ฉฐ ML Model์ ์ ์ฉํ ์ ์๋ ์ํ๊ฐ ๋จ.
Dollar Bars
- ์ด๋ค ํจ์๋ฅผ ํตํด์ ์ถ์ถ์ ํ๋ฉด IIDํ ํํ๋ก ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ ์. ๋ฌผ๋ก , ํํธ ๋ชจ๋ธ๊ณผ ๊ฐ์ด ์ด๋ก ์ ๊ทผ๊ฑฐ๊ฐ ์๋ ์ถ์ถ ๋ฐฉ๋ฒ์ ์จ์ผํจ.
- ๊ทผ๊ฑฐ
- ์ค์ง์ ์ผ๋ก ์ฃผ์์ ๊ฑฐ๋ํ๋ ์ฌ๋ ์
์ฅ์์ '๊ฑฐ๋ ๊ฐ์'๊ฐ ์ค์ํ ๊ฒ์ด ์๋๋ผ '๊ฑฐ๋ ๊ธ์ก'์ด๊ธฐ ๋๋ฌธ์ '๊ฑฐ๋ ๊ธ์ก' ๊ธฐ๋ฐ ์ถ์ถ์ด ๋ ์ง ์ข์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋ค์ด ๋
- ์ฃผ์์ ๊ฒฝ์ฐ ํ์ฌ ์ฌ์ ์ ๋ฐ๋ผ ์ก๋ฉด๋ถํ , ๋ฐํ์ฃผ์์ ๋ณ๊ฒฝ์ด ๋๋ค. ์ฝ์ธ์ ๊ฒฝ์ฐ๋ ๋ ์ฐ์ด๋ผ ์ ์๋ค. ํด๋น volume์ constantํ๊ฒ ํ๋ ๊ฒฝ์ฐ ์๊ณก ๊ฐ๋ฅ.
- ์ด๋ฐ ๊ทผ๊ฑฐ์ ๋ฐ๋ผ ์ค์ ๋ก IID๋ฅผ ์ฒดํฌํด๋ณด๋ฉด Volume Bars ๋ณด๋ค ์ข๊ฒ ๋์ด
- ์ดํด๋ฅผ ๋๊ธฐ ์ํด ์์ ๋ด์ฉ์ ์ฝ๋๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
def get_bar_index(df, mode, unit=None):
assert mode in ['time', 'tick', 'volume', 'dollar']
df0 = df.reset_index().rename(columns={'dates': 'time'})
num_days = (df0.time.values[-1] - df0.time.values[0]).astype('timedelta64[D]').astype(int)
t, ts = df0['price' if mode == 'tick' else mode], 0
idx, diff = [], []
if mode == 'time':
assert unit in [None, '1d']
t, m = t.dt.date, '1d'
idx.append(0)
for i, (before, after) in enumerate(zip(t.values[:-1], t.values[1:]), 1):
if after-before >= timedelta(days=1):
idx.append(i)
diff.append(0)
elif mode == 'tick':
m = len(df0) // num_days if unit is None else unit
for i, _ in enumerate(t):
ts += 1
if ts == m:
ts = 0
idx.append(i)
diff.append(0)
else:
m = t.values.sum() // num_days if unit is None else unit
for i, x in enumerate(t):
ts += x
if ts >= m:
idx.append(i)
diff.append(ts)
ts = 0
return idx, (m, np.std(diff))
Information-Driven Bars
- ์ด์ ์ ๊ฑฐ๋๋, ๊ฑฐ๋๊ธ์ก์ผ๋ก ์ถ์ถํ๋ ํจ์๋ฅผ ๊ตฌ์ฑํ์๋ค๋ฉด ์ด๋ฒ์ ์ ๋ณด๋ฅผ ์ข ๋ ์
์ฒด์ ์ผ๋ก ํ์
ํ๋ ํจ์๋ฅผ ํตํด ํ๋ณธ์ ์ถ์ถํ๋ ๊ฒ์ผ๋ก ์ธ๊ณ๊ด์ ํ์ฅ์ํฌ ์ ์๋ค.
- ์ ๋ณด์ ์์ ์ด๋ป๊ฒ ์ ๋ํ ์ํฌ ๊ฒ์ธ์ง๊ฐ ํต์ฌ์ด๊ณ , ์ด์ ์ ๊ฑฐ๋๋,๊ฑฐ๋๊ธ์ก์ด Constant์๋ค๋ฉด ์กฐ๊ธ ๋ Dynamicํ๊ฒ ๋ฐ๋์๋ค๊ณ ์ดํดํ๋ฉด ๋จ.
- ๋ํ์ ์ผ๋ก Tick/Volume/Dollar Imbalance Bars(TIB,VIB,DIB)์ Tick/Volume/Dollar Runs Bars (TRB,VRB,DRB)๊ฐ ์กด์ฌํจ.
- Imbalance Bar์ Runs Bar์ ์ฐจ์ด๋ ๋๊ท๋ชจ ๊ฑฐ๋์์ ํ์ ์ ๋จ๊ธด ๋งค์ ์ฃผ๋ฌธ(Iceberg orders)์ ๋ํ ์์ด๋์ด๋ฅผ ์ถ๊ฐ๋ก ํฌํจํ๋๋ ์ฌ๋ถ์ด๋ค.
Tick Imbalance Bars (TIB)






- tick์ sequence๊ฐ ์๋ค๊ณ ๊ฐ์ , p_t ๋ tick t(์๊ฐ)์ ์ฐ๊ณ๋ ๊ฐ๊ฒฉ, v_t ๋ tick t(์๊ฐ)์ ์ฐ๊ณ๋ ๊ฑฐ๋๋
- b_t๋ p_t & v_t๋ฅผ ์ด์ฉํด ์ ์ํ ๊ท์น. ์ผ์ข
์ ํฑ ๋จ์์ ๋ณํ๋(์ถ์ธ)๋ฅผ ํํํ ๊ฒ์ด๊ณ , b_t๊ฐ ์ผ์ ํ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ ์ผ์ด์ค๊ฐ ๋์ค๋ฉด ์ด๋ tick์ imbalanceํ ํ์์ด ๋์จ ๊ฒ์ด๊ณ ๊ทธ๋๋ฅผ ์ถ์ถํ๋ค๋ ๊ฒ์ด ํต์ฌ์ด๋ค. ์ด๋ฅผ ์ํด theta_t๋ฅผ ์ ์.
- theta_t๋ฅผ ์ฐ์์ (ํ๋ฅ ์ )์ผ๋ก ๋ฐ๊พผ ์์ ํตํด ํํํ ์ ์๊ณ , P(b_t=1) + P(b_t=-1) = 1 ์ด๋ผ๋ ์ ํ ์กฐ๊ฑด์ผ๋ก ์์ ๋ณ๊ฒฝํ ์ ์์
- E0[T] ๋ previous bars์ ์ง์๊ฐ์ค์ด๋ํ๊ท (ewma)๋ก ๊ณ์ฐ ๊ฐ๋ฅํ๊ณ , 2P[b_t=1]-1 ์ previous bars์ ์ง์๊ฐ์ค์ด๋ํ๊ท (ewma)๋ก ๊ณ์ฐ ๊ฐ๋ฅํ๋ค.
- TIB๋ ๋ค์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ถ๋ถ ์งํฉ์ T*๋ก ๋ค์๊ณผ ๊ฐ์ด ์ ์ ๊ฐ๋ฅํ๋ค.
Volume/Dollar Imbalance Bars






- VIB, DIB๋ TIB์ ์ธ๊ณ๊ด์ ์กฐ๊ธ ๋ ํ์ฅ์ํจ ๊ฒ์ด๋ค. p_t๋ฅผ ํตํด์๋ง information์ imbalance๋ฅผ ์ฐพ์๋ผ ๊ฒ์ด๋ v_t๋ ์ ๋ณด๋ฅผ ์ถ๊ฐ๋ก ํ์ฉํด์ ์ฐพ์๋ผ ๊ฒ์ด๋์ ๋ฌธ์ ์.
- v_t๋ฅผ ์ถ๊ฐํ๋๊ฒ ์ ์ข์์ง๋ Researcher์ ๋
ผ๋ฆฌ๋ฅผ ํตํด์ ์ด๋ก ์ ๊ทผ๊ฑฐ๋ฅผ ํ๋ณดํด์ผ ํ๋ค. ์ด ๊ทผ๊ฑฐ๋ volume/dollar bars๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ์ ๋์ผํจ.
- theat_t๋ฅผ p_t * v_t๋ก ํ์ฅํ์๊ณ , ์ด์ ๋ฐ๋ผ ์์ด ์ผ๋ถ ๋ณ๊ฒฝ๋์๋ค. ๊ทผ๋ณธ์ ์ธ ๋
ผ๋ฆฌ๋ TIB์ ๋์ผํ๋ค.
- ์ ์์์ ๋
ผ๋ฆฌ๋ฅผ ์ข ๋ ๋ช
์งํ๊ฒ ํํํ๊ธฐ ์ํด ์๋ pseudo code๋ฅผ ์ฒจ๋ถํ์๋ค.
num_prev_bars = 3
expected_num_ticks_init = 100000
expected_num_ticks = expected_num_ticks_init
cum_theta = 0
num_ticks = 0
imbalance_array = []
imbalance_bars = []
bar_length_array = []
for row in data.rows:
# Track high,low,close, volume info
num_ticks += 1
tick_rule = get_tick_rule(price, prev_price)
volume_imbalance = tick_rule * row['volume']
imbalance_array.append(volume_imbalance)
cum_theta += volume_imbalance
if len(imbalance_bars) == 0 and len(imbalance_array) >= expected_num_ticks_init:
expected_imbalance = ewma(imbalance_array, window=expected_num_ticks_init)
if abs(cum_theta) >= expected_num_ticks * abs(expected_imbalance):
bar = form_bar(open, high, low, close, volume)
imbalance_bars.append(bar)
bar_length_array.append(num_ticks)
cum_theta, num_ticks = 0, 0
expected_num_ticks = ewma(bar_lenght_array, window=num_prev_bars)
expected_imbalance = ewma(imbalance_array, window = num_prev_bars * expected_num_ticks)
Tick Runs Bars



- TIB์ ๊ทผ๋ณธ์ ์ธ ์๋ฆฌ๋ ๋์ผํ๋ค. ๋๋ ๊ฑฐ๋์๋ค์ ๋ถํ ์ฃผ๋ฌธ์ ํ์ ์ ์ฐพ๊ธฐ ์ํด์ theta_t์ ๋ชจ๋ธ๋ง์ ๋ค๋ฅด๊ฒ ํ ๊ฒ์ด ์ฃผ์ํ ์ฐจ์ด์ ์ด๋ค. ์ด๋ฅผ ์์์ ์ผ๋ก max๋ฅผ ํ์ฉํ์ฌ b_t=1,-1 ๊ฐ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๋๋ ์ ๋ณธ๋ค๋ ์ ์ด ์ด ๋ถ๋ถ์ ๋ฐ์ํ ๊ฒ์ด๋ค.
- theta_t์ ๋ชจ๋ธ๋ง ์ธ์ ๋ค๋ฅธ ๊ฒ๋ค์ ์๋ฆฌ๋ ๋์ผ.
- ์ฆ, T*๋ฅผ ๋ณด๋ฉด Iceberg orders๊ฐ ๋ง์ผ๋ฉด ๋ฎ์ T๊ฐ์์ ๋น๋ฒํ๊ฒ ์ถ์ถ๋ ๊ฒ์ด๊ณ ์ฃผ์ํ ๋ถ๋ถ์์ ML model์ด ํ์ตํ ๊ธฐํ๋ฅผ ์ ๊ณตํ๋ ์ข์ ๋ฐ์ดํฐ๊ฐ ๋๋ ์ฒ๋ฆฌ๋ผ๊ณ ๋ณผ ์ ์์.
- ์ฌ๊ธฐ์ ๋ํด Iceberg orders๊ฐ ์ ์ผ๋ฉด TIB์ ๋นํด sequence๊ฐ sparseํ๊ฒ ๋ ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํจ.
Volume/Dollar Runs Bars



- VIB/DIB์์ ํต์ฌ ์ฐจ์ด๋ ์์์ ์์ ํ TIB vs TRB์ ๋์ผํจ.
- TRB์ VRB/DRB์ ์ฐจ์ด๋ theta_t์ ๋ชจ๋ธ๋ง์ v_t๋ฅผ ์ถ๊ฐํ๋ค๋ ์ ์ด๋ฉฐ ์ด๋ฅผ ์ถ๊ฐํ ๊ทผ๊ฑฐ๋ TIB์์ VIB/DIB๋ก ํ์ฅํ๋ ๊ทผ๊ฑฐ์ ๋์ผํจ
Sampling Features
- ์ฒ์ ์์ํ๋ Financial raw data -> Bars(Time/Volume/Dollar Bars -> TIB/DIB/VIB -> TRB/DRB/VRB) ๊น์ง ํ์ฅํ๋ค.
- ์ข์ Bars๋ฅผ ๋ง๋๋ ๋ชฉ์ ์ ๋ฐ์ดํฐ๋ฅผ ์๊ทธ๋์ ์ต๋ํ ์ ์งํ๋ฉด์ IIDํ๊ฒ ๋ง๋ค๊ธฐ ์ํจ์ด๊ณ , ์ด๋ ML model์ ํ์ต์ ๊ทน๋ํ ์ํค๋ ๊ฒ์ ์๋ค.
- ์ด๋ฐ Bars๋ฅผ ๋ง๋ ์ํ์์ ์ถ๊ฐ๋ก ํ ๋ฒ ๋ Filtering(Sampling Features)์ ๊ฑฐ์ณ์ผ ํ๋ ์ด์ ๊ฐ ์๋ค.
- ๋ช๋ช ML ์๊ณ ๋ฆฌ์ฆ์ ํ๋ณธ ํฌ๊ธฐ์ ํ์ต ์๋๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ์ฆ๊ฐํ๋ ๊ฒฝํฅ์ด ์๋ค. (ex. SVM)
- ML ์๊ณ ๋ฆฌ์ฆ๊ณผ ์ฌ๋์ด ํ์ตํ๋ ๊ณผ์ ์ ์๊ฐํด๋ณด๋ฉด ๋ชจ๋ ๋ฌธ์ ๋ฅผ ๋ค ํ์ตํ๋ ๊ฒ๋ณด๋ค๋ ์ํ์ ์์ฃผ ๋์ค๊ณ ์ค์ํ ๋ฌธ์ ๋ฅผ ํ์ตํ๋๊ฒ ์ค์ํ๋ค. ์ด๋ฅผ ์ํด 'ํ์ต ์ ๊ด ๋ฐ์ดํฐ'๋ฅผ ์ ๋ณํด์ฃผ๋ ๊ฒ์ด ์ ๊ตํ ์์ธก์ ํ๋ ๋ชจ๋ธ์ ๋ง๋ค์ด ๋ผ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
- Down Sampling ๊ธฐ๋ฒ 2๊ฐ์ง, Sampling for Reduction & Event-Based Sampling์ ์๊ฐํ๋ค. ํ์๊ฐ ํต์ฌ.
Sampling for Reduction
- ์์ฃผ ๊ฐ๋จํ ๊ธฐ๋ฒ์ผ๋ก ์ ๋ง ์๋๋ง์ ์ํด ํ๋ ๋ฐฉ์์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. ์ด๋ B2C ์๋น์ค ๋ฑ ์๋๊ฐ ์ค์ํ๊ณ ์ฑ๋ฅ์ด ์กฐ๊ธ์ ๋ฎ์๋ ๋๋ ๊ฒฝ์ฐ์ ๊ฐ์ฑ๋น ์ข๊ฒ ์ฌ์ฉํ ์ ์๋ค.
- Linespace Sampling
- ์์ฐจ์ ์ผ๋ก ํ๋ณธ์ ์ถ์ถํ๋ค. ๋ค๋ง, ์ด๊ธฐ๊ฐ์ผ๋ก ์ด๋ค ๊ฐ๊ฒฉ(seed)์ ์ํด ํ ๊ฒ์ธ์ง์ ๋ฏผ๊ฐํ๋ค๋ ๋จ์ ์ด ์กด์ฌํจ.
- Uniform Sampling
- Linespace Sampling์ ๋ณด์ํ๊ธฐ ์ํด์ ์ ์ฒด Bar์์ ๊ท ์ผํ๊ฒ ํ๋ณธ์ Sampling ํ๋ ๋ฐฉ์์ผ๋ก ์ต์ข
bar์ ๊ฐ์๊ฐ ์ผ์ ํด์ง๋ค.
Event-Based Sampling
- ML Model์ ํต์ฌ์ ๋๋ํ ํฌ์์๋ฅผ ์ฌ๋ฌ ๋ช
๋ง๋ค์ด ๊ทธ๊ฒ์ nettingํ์ฌ Meta Strategy๋ฅผ ๋ง๋๋ ๊ณผ์ ์ ๋ง์ ๋ถ๋ถ์ ์๋ํ ํ๋ ๊ฒ์ ๊ฐ์ ์ด ์๋ค.
- ๋๋ํ ํฌ์์ ํ ๋ช
์ ๊ด์ ์์ ํฌ์ ๋ฐฉ์์ ๊ณ ๋ฏผํด๋ณด๋ฉด ๋ง์ ๊ธฐํ๋ ๋ณ๋์ฑ์ด ํฐ์ง๋ ์๊ฐ์ ๋ฐ์ํ๋ค๋ ์ ์ ๋ชฉ๊ฒฉํ ์ ์๋ค. ๊ทธ ๊ตฌ๊ฐ์์ ๋ง์ Alpha๊ฐ ์กด์ฌํ๋ค.
- ๋ค๋ฅธ ์ฌ๋ฌ ๊ตฌ๊ฐ์์ ์ ๋ง์ถฐ๋ Alpha๊ฐ ๋ง์ด ์กด์ฌํ๋ ๊ตฌ๊ฐ์์ ์ ๋ง์ถ์ง ๋ชปํ๋ค๋ฉด ์ด๋ ์ข์ ๋ชจ๋ธ์ด๋ผ ํ ์ ์์ ๊ฒ์ด๋ค.
- ํด๋น ๊ตฌ๊ฐ์ ์ข ๋ ๊ฐ์ค์น๋ฅผ ์ฃผ์ด์ ํ์ตํ๊ฒ ํด์ฃผ๋ ๊ฑธ ๋์์ฃผ๋ ๋ฐฉ์์ด Event-Based Sampling์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
- ๋ค์ํ ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ง๋ง, ์ฐ์
๊ณตํ์์ ํ์ง ๊ด๋ฆฌ๋ฅผ ์ํด ์ฌ์ฉํ๋ CUSUM filter์ ๋ํด ์๊ฐํ๋ค.
The CUSUM Filter




- CUSUM Filter์ ํต์ฌ์ ์ธก์ ๊ฐ์ด ๋ชฉํ ๊ฐ์ ํ๊ท ์ผ๋ก๋ถํฐ ์ผ๋ง๋ ๋ฒ์ด๋ฌ๋์ง๋ฅผ ์ฐพ๋๋ก ์ค๊ณ๋์ด ์๋ค.
- IIDํ ๊ด์ธก๊ฐ y_t๋ฅผ ์ ์ํ๊ณ , ๋ค์ y_t์ ๋์ ํฉ๊ณ๋ฅผ S_t๋ก ์ ์ํ์. E_(t-1)[y_t]๋ previous t๊น์ง์ ์ง์์ด๋ํ๊ท ๋๋ y_(t-1)๋ก ํํํ ์ ์๋ค.
- S_t์ ๊ฐ์ ํตํด ํ์ฌ ๊ฐ์ด ํ๊ท ์ผ๋ก ์ผ๋ง๋ ๋ฒ์ด๋ฌ๋์ง ์ธก์ ํ ์ ์๋ค. ์ด๋, ์๊ณ๊ฐ h๋ฅผ ์ค์ ํ๋ค. h๋ฅผ ๋์ด๊ฐ๋ ์๊ฐ๋ง๋ค Sampling ํ ์ ์๋ค.
- 4.์ ์์์ ์ํฅ/ํํฅ์ ๊ฐ๋
์ผ๋ก ํ์ฅํด์ ์ํฅ/ํํฅ S_t์ ์ํฅ/ํํฅ h๋ฅผ ์ค์ ํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ค์ ์ ๋๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ํ๋งํ์ฌ ์กฐ๊ธ ๋ ์ ๊ตํ๊ฒ ์ถ์ถ์ด ๊ฐ๋ฅํจ.
- ์๊ณ๊ฐ์ ํ์ฌ๋ constant๋ก ๊ฐ์ ํ์ง๋ง ์ฌ๋ฌ ๊ธฐ๋ฒ์ ํ์ฉํ์ฌ ํ์ฅํ ์ ์๋ค. ์ด๋ก ์ ์ผ๋ก Structural Breaks, Entropy Features, Microstructural Features๋ฑ ๋ค์ํ๊ฒ ํ์ฅ ๊ฐ๋ฅํ๋ค.
- ์ํฅ/ํํฅ ๊ฐ๋
์ผ๋ก ํ์ฅ๋ CUSUM Filter๋ฅผ ์ฝ๋๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
def getTEvents(gRaw, upper, lower=None):
if lower is None:
lower = - upper
assert (upper >=0 and lower <= 0)
tEvents, sPos, sNeg = [], 0, 0
diff = gRaw.diff()
for i, change in enumerate(diff.values[1:]):
sPos, sNeg = max(0, sPos + change), min(0, sNeg + change)
if sNeg < lower:
sNeg = 0
tEvents.append(i)
if sPos > upper:
sPos = 0
tEvents.append(i)
return gRaw.index[tEvents]