Giải thích Alpha Gốc – Giá qua đêm, đảo chiều trong phiên & chuẩn hóa tín hiệu

Giới thiệu

Trong bài đầu tiên thuộc chuỗi IMPROVING ALPHA SERIES của WorldQuant BRAIN, chúng ta sẽ tìm hiểu một alpha đơn giản nhưng thú vị: sử dụng mối quan hệ giữa overnight returndaytime reversal để dự đoán hiệu suất cổ phiếu.


Công thức Alpha gốc

RET_OCplus1 = close / open
RET_OC = RET_OCplus1 - 1
RETplus1 = close / ts_delay(close, 1)
RET_CO = RETplus1 / RET_OCplus1 - 1

NUM = if_else((RET_CO > threshold) & (RET_OC < -threshold), 1, 0)

NR = ts_sum(NUM, 20) / 20
AB_NR = NR / ts_mean(NR, 240)

Diễn giải các biến

Biến Giải thích
RET_OC Return trong phiên giao dịch (mở → đóng)
RETplus1 Return tổng thể từ hôm trước tới hôm nay
RET_CO Đo độ đảo chiều giữa overnight và intraday
NUM Biến nhị phân: 1 nếu có đảo chiều đủ mạnh
NR Tần suất tín hiệu trong 20 phiên gần nhất
AB_NR Chuẩn hóa NR bằng rolling mean 240 ngày để tìm “bất thường”

Biểu đồ minh họa bằng Python

Code Python (giả lập)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
n = 300

# Tạo dữ liệu giả
open_price = np.cumprod(1 + np.random.normal(0, 0.01, n))
close_price = open_price * (1 + np.random.normal(0, 0.005, n))

df = pd.DataFrame({'open': open_price, 'close': close_price})
df['close_lag1'] = df['close'].shift(1)

# Tính toán Alpha gốc
df['RET_OCplus1'] = df['close'] / df['open']
df['RET_OC'] = df['RET_OCplus1'] - 1
df['RETplus1'] = df['close'] / df['close_lag1']
df['RET_CO'] = df['RETplus1'] / df['RET_OCplus1'] - 1

# Lọc tín hiệu đảo chiều
threshold = 0.01
df['NUM'] = np.where((df['RET_CO'] > threshold) & (df['RET_OC'] < -threshold), 1, 0)

# Rolling signals
df['NR'] = df['NUM'].rolling(window=20).mean()
df['AB_NR'] = df['NR'] / df['NR'].rolling(window=240).mean()

# Biểu đồ
fig, axs = plt.subplots(3, 1, figsize=(12, 10), sharex=True)

axs[0].plot(df['RET_OC'], label='RET_OC (Intraday Return)', color='blue')
axs[0].plot(df['RETplus1'] - 1, label='RETplus1-1 (Overnight Return)', color='orange')
axs[0].legend(); axs[0].set_title('Overnight vs Intraday Return')

axs[1].plot(df['RET_CO'], label='RET_CO (Đảo chiều)', color='green')
axs[1].legend(); axs[1].set_title('RET_CO – Mức độ đảo chiều')

axs[2].plot(df['AB_NR'], label='AB_NR (Bất thường hóa)', color='purple')
axs[2].legend(); axs[2].set_title('AB_NR – Tín hiệu đảo chiều bất thường')

plt.tight_layout()
plt.show()

Tổng kết

Alpha gốc sử dụng một ý tưởng đơn giản nhưng hiệu quả:

  • Kết hợp hành vi giá trước và trong phiên
  • Lọc tín hiệu đảo chiều bằng rolling logic
  • Chuẩn hóa bằng AB_NR để phát hiện bất thường