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 return và daytime 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