นิยาม
ระบุ Price Field, Clock, Window และ Adjustment
FINANCIAL DATA ENGINEERING · FEATURE LAB
Lab นี้เปลี่ยน Price, Volume, Quote, Order Book และ Benchmark Series ให้เป็น Model Feature ที่ Version ได้ จุดเน้นไม่ใช่การจำ Indicator แต่คือการนิยามเวลา Adjustment, Window, Availability และต้นทุน เพื่อให้สร้าง Feature เดิมซ้ำได้อย่างซื่อตรง
ระบุ Price Field, Clock, Window และ Adjustment
สร้าง Rolling และ Cross-sectional Feature อย่างปลอดภัย
ตรวจ Leakage, Stale Quote และ Corporate-action Break
Version Observation เพื่อใช้ซ้ำในงานวิจัยและโมเดล
01 · FROM MARKET EVENT TO FEATURE
Ticker ไม่ใช่ Identity ถาวร Close อาจเป็น Adjusted หรือ Raw, Timestamp อาจหมายถึง Event หรือ Arrival และตลาดหนึ่งแห่งอาจไม่แทน Order Book ทั้งหมด
02 · FIFTEEN CORE FINANCIAL FEATURES
Feature หลายตัวมีข้อมูลซ้ำ RSI, Momentum และ MACD อาจสัมพันธ์กัน ส่วน Spread กับ Amihud วัด Liquidity คนละด้าน ควรใช้ Correlation และ Ablation Test ตัดสิน ไม่ใช่ความนิยมของ Indicator
rₜ = ln(Pₜ / Pₜ₋₁)Return แบบ Continuous หนึ่งช่วง ต้องประกาศนโยบาย Adjusted Price
Window 1 · O(T)ROC_w = Pₜ/Pₜ₋w − 1การเปลี่ยนราคาระยะ w Observations ซึ่งไม่เท่ากับจำนวนวันปฏิทิน
Window w · O(T)100 − 100/(1 + avg_gain/avg_loss)Transform ของ Gain/Loss แบบ Smoothed ต้อง Version วิธี Initialize และ Smoothing
Typical w=14 · incremental O(T)EMA_fast − EMA_slowผลต่าง EMA สองช่วง Signal และ Histogram ต้องมี Smoothing Definition เพิ่ม
Typical 12/26/9 · O(T)Pₜ / MA_w − 1ระยะจาก Rolling Trend แบบ Scale-free เหมาะกว่าผลต่างราคาดิบข้ามหุ้น
w=20/50/200 · O(T)(Pₜ − SMA_w) / SD_wตำแหน่งเทียบ Rolling Mean และ Dispersion สามารถเก็บ Bandwidth แยก
w=20 · O(T)Pₜ / max(P₁…Pₜ) − 1การลดจาก Running Peak ภายใต้นโยบาย Adjusted Price และ Start Date
Expanding · O(T)SD(rₜ₋w+1…rₜ) × annualizationการกระจาย Historical Return การ Annualize ต้องระบุ Frequency/Calendar
w=20/60 · O(T)TR=max(H−L, |H−C₋₁|, |L−C₋₁|)ความแปรปรวนจาก Range รวม Gap ควร Normalize ด้วยราคาเมื่อเทียบข้ามหุ้น
w=14 · O(T)(Vₜ − mean_w(V)) / sd_w(V)กิจกรรมผิดปกติเทียบประวัติตนเอง ต้องจัดการ Zero และ Regime Shift
w=20 · O(T)volume / adjusted_free_floatกิจกรรมซื้อขายเทียบหุ้นที่หมุนเวียนได้ Denominator เปลี่ยนตาม Corporate Action
Daily/rolling · O(T)(ask−bid) / midQuoted Liquidity ที่ Top-of-book ณ Venue/เวลา ต้องกรอง Locked, Crossed, Stale Quote
Quote-level · O(Q)(Σbid_size−Σask_size)/(Σbid_size+Σask_size)Displayed Depth Imbalance ตาม Level/Venue ที่ระบุ และ Order อาจถูกยกเลิก
Depth L · O(L) per snapshotmean(|return| / traded_value)Price Response ต่อมูลค่าซื้อขาย ต้องระวัง Denominator เล็กหรือศูนย์
Window w · O(T)Cov(rᵢ,rₘ) / Var(rₘ)Historical Sensitivity ต่อ Benchmark, Frequency และ Calendar ที่ระบุ
w=60/252 · O(T)03 · SEE THE INDICATORS AS A SYSTEM
04 · PYTHON LAB: BUILD VERSIONED DAILY FEATURES
ตัวอย่างใช้ Pandas-style Operation ระบบจริงต้อง Group ตาม Instrument จัดการ Calendar, Stable Sort และทดสอบ Missing/Duplicate Observation
import numpy as np
import pandas as pd
def build_features(df: pd.DataFrame) -> pd.DataFrame:
x = df.sort_values(["instrument_id", "trading_date"]).copy()
g = x.groupby("instrument_id", group_keys=False)
x["log_return_1d"] = g["adjusted_close"].transform(
lambda s: np.log(s / s.shift(1)))
x["momentum_20"] = g["adjusted_close"].transform(
lambda s: s / s.shift(20) - 1)
x["sma_distance_20"] = x["adjusted_close"] / g["adjusted_close"].transform(
lambda s: s.rolling(20, min_periods=20).mean()) - 1
x["volatility_20"] = g["log_return_1d"].transform(
lambda s: s.rolling(20, min_periods=20).std())
x["volume_z_20"] = g["volume"].transform(
lambda s: (s - s.rolling(20).mean()) / s.rolling(20).std())
mid = (x["best_bid"] + x["best_ask"]) / 2
x["relative_spread"] = (x["best_ask"] - x["best_bid"]) / mid
feature_cols = ["log_return_1d", "momentum_20", "sma_distance_20",
"volatility_20", "volume_z_20", "relative_spread"]
# Example contract: a decision at date t uses features available through t-1.
x[feature_cols] = g[feature_cols].shift(1)
x["feature_version"] = "daily_market_v1"
return xยังต้องตรวจว่า Source พร้อมใช้เมื่อไร Closing Price อาจใช้ได้หลังตลาดปิด Fundamental Report ที่แก้ไขต้องใช้ Publication/Revision Timestamp และประวัติราคาที่ปรับ Corporate Action อาจถูกคำนวณใหม่ภายหลัง
05 · COMPLEXITY AND MATERIALIZATION
สำหรับ A Instruments, T Observations และ E Experiments การสร้าง Linear Feature Set ใหม่มีต้นทุนประมาณ O(EAT) ส่วน Versioned Feature Build ลดการคำนวณสู่ O(AT) แล้วเพิ่มค่าอ่าน Feature ขณะที่ Cross-sectional Ranking อาจเพิ่ม O(TA log A)
20 experiments × 2,000 stocks × 2,500 days × 15 features
Build ครั้งเดียว Validate ครั้งเดียว แล้วใช้ซ้ำข้าม Experiment
instrument_id + venue + feature_timestamp + feature_set_version
+ price_adjustment_version + calendar_version + source_snapshot06 · LEAKAGE AND BIAS CHECKLIST
ใช้ Close, Volume หรือ Report ก่อนเวลาที่การตัดสินใจมองเห็นได้
Train เฉพาะหุ้นที่ยังจดทะเบียนอยู่ในปัจจุบัน
ใช้ราคาที่ปรับย้อนหลังโดยไม่บันทึก Adjustment Version และวัตถุประสงค์
Normalize หุ้นด้วย Peer ที่ยังไม่มีข้อมูลหรืออยู่นอก Historical Universe
มอง Bid/Ask เก่าว่าเป็น Liquidity ในเวลาปัจจุบัน
Join ตลาดคนละ Session ด้วย Date Label แทน Event Time ที่เทียบกันได้
ทดลอง Window จำนวนมากแล้วเก็บเฉพาะตัวที่ดูสำเร็จ
จัดเก็บหรือเผยแพร่ Derived Feature เกินเงื่อนไขสิทธิ์ข้อมูลตลาด
07 · STUDENT CHALLENGES
Implement Log Return, Momentum, Rolling Volatility, Relative Spread และ Amihud Illiquidity จาก Synthetic Dataset เดียว
เปรียบเทียบ Raw Close กับ Adjusted Close รอบเหตุการณ์ Split 2-for-1 และอธิบาย Feature ที่เสีย
พิสูจน์ว่า Naive Rolling กับ Incremental Computation ให้ค่าเท่ากันภายใน Tolerance
สร้าง Point-in-time Universe ที่มีหุ้น Delisted แล้วเทียบกับ Universe ที่เหลือรอดถึงปัจจุบัน
วัด Correlation ระหว่าง RSI, Momentum, MACD และ SMA Distance แล้วตัด Feature ซ้ำด้วยกฎชัดเจน
ออกแบบ Feature-store Contract ที่มี Source, Venue, Calendar, Adjustment และ Availability Time
THE CENTRAL IDEA