← warin.me · Data Science and EngineeringEnglish

FINANCIAL DATA ENGINEERING · FEATURE LAB

Indicator คือกฎการวัด ไม่ใช่คำทำนาย และไม่ใช่คำสั่งซื้อขาย

Lab นี้เปลี่ยน Price, Volume, Quote, Order Book และ Benchmark Series ให้เป็น Model Feature ที่ Version ได้ จุดเน้นไม่ใช่การจำ Indicator แต่คือการนิยามเวลา Adjustment, Window, Availability และต้นทุน เพื่อให้สร้าง Feature เดิมซ้ำได้อย่างซื่อตรง

01

นิยาม

ระบุ Price Field, Clock, Window และ Adjustment

02

คำนวณ

สร้าง Rolling และ Cross-sectional Feature อย่างปลอดภัย

03

ตรวจสอบ

ตรวจ Leakage, Stale Quote และ Corporate-action Break

04

จัดเก็บ

Version Observation เพื่อใช้ซ้ำในงานวิจัยและโมเดล

01 · FROM MARKET EVENT TO FEATURE

การคำนวณเริ่มได้หลังจาก Observation มีความน่าเชื่อถือแล้ว

Ticker ไม่ใช่ Identity ถาวร Close อาจเป็น Adjusted หรือ Raw, Timestamp อาจหมายถึง Event หรือ Arrival และตลาดหนึ่งแห่งอาจไม่แทน Order Book ทั้งหมด

RAW MARKET DATAtrade · quote · OHLCV · corporate action
NORMALIZEinstrument ID · timezone · calendar · currency
ADJUST & ALIGNsplit/dividend policy · event/available time
FEATUREvalue · as_of · window · version
Entityinstrument_id + venue
Observationfeature_timestamp
Availabilityavailable_at ≤ decision_time
Versionformula + parameters + adjustment

02 · FIFTEEN CORE FINANCIAL FEATURES

แยกวัดทิศทาง ความแปรปรวน กิจกรรม Liquidity และความเสี่ยงสัมพัทธ์

Feature หลายตัวมีข้อมูลซ้ำ RSI, Momentum และ MACD อาจสัมพันธ์กัน ส่วน Spread กับ Amihud วัด Liquidity คนละด้าน ควรใช้ Correlation และ Ablation Test ตัดสิน ไม่ใช่ความนิยมของ Indicator

RETURN & MOMENTUM

01

Log return

rₜ = ln(Pₜ / Pₜ₋₁)

Return แบบ Continuous หนึ่งช่วง ต้องประกาศนโยบาย Adjusted Price

Window 1 · O(T)
02

Rate of Change / Momentum

ROC_w = Pₜ/Pₜ₋w − 1

การเปลี่ยนราคาระยะ w Observations ซึ่งไม่เท่ากับจำนวนวันปฏิทิน

Window w · O(T)
03

RSI

100 − 100/(1 + avg_gain/avg_loss)

Transform ของ Gain/Loss แบบ Smoothed ต้อง Version วิธี Initialize และ Smoothing

Typical w=14 · incremental O(T)
04

MACD

EMA_fast − EMA_slow

ผลต่าง EMA สองช่วง Signal และ Histogram ต้องมี Smoothing Definition เพิ่ม

Typical 12/26/9 · O(T)

TREND & POSITION

05

SMA/EMA distance

Pₜ / MA_w − 1

ระยะจาก Rolling Trend แบบ Scale-free เหมาะกว่าผลต่างราคาดิบข้ามหุ้น

w=20/50/200 · O(T)
06

Bollinger z-position

(Pₜ − SMA_w) / SD_w

ตำแหน่งเทียบ Rolling Mean และ Dispersion สามารถเก็บ Bandwidth แยก

w=20 · O(T)
07

Drawdown

Pₜ / max(P₁…Pₜ) − 1

การลดจาก Running Peak ภายใต้นโยบาย Adjusted Price และ Start Date

Expanding · O(T)

VOLATILITY & RANGE

08

Realized volatility

SD(rₜ₋w+1…rₜ) × annualization

การกระจาย Historical Return การ Annualize ต้องระบุ Frequency/Calendar

w=20/60 · O(T)
09

ATR / NATR

TR=max(H−L, |H−C₋₁|, |L−C₋₁|)

ความแปรปรวนจาก Range รวม Gap ควร Normalize ด้วยราคาเมื่อเทียบข้ามหุ้น

w=14 · O(T)

VOLUME & LIQUIDITY

10

Volume z-score

(Vₜ − mean_w(V)) / sd_w(V)

กิจกรรมผิดปกติเทียบประวัติตนเอง ต้องจัดการ Zero และ Regime Shift

w=20 · O(T)
11

Turnover

volume / adjusted_free_float

กิจกรรมซื้อขายเทียบหุ้นที่หมุนเวียนได้ Denominator เปลี่ยนตาม Corporate Action

Daily/rolling · O(T)
12

Relative bid–ask spread

(ask−bid) / mid

Quoted Liquidity ที่ Top-of-book ณ Venue/เวลา ต้องกรอง Locked, Crossed, Stale Quote

Quote-level · O(Q)
13

Order-book imbalance

(Σbid_size−Σask_size)/(Σbid_size+Σask_size)

Displayed Depth Imbalance ตาม Level/Venue ที่ระบุ และ Order อาจถูกยกเลิก

Depth L · O(L) per snapshot
14

Amihud illiquidity

mean(|return| / traded_value)

Price Response ต่อมูลค่าซื้อขาย ต้องระวัง Denominator เล็กหรือศูนย์

Window w · O(T)

CROSS-ASSET RISK

15

Rolling beta

Cov(rᵢ,rₘ) / Var(rₘ)

Historical Sensitivity ต่อ Benchmark, Frequency และ Calendar ที่ระบุ

w=60/252 · O(T)

03 · SEE THE INDICATORS AS A SYSTEM

Price Path เดียวสร้างมุมมองหลักฐานได้หลายแบบ

ADJUSTED PRICEpricerolling meanMOMENTUMreturn · ROC · RSI · MACDTRENDMA distance · z-positionVOLATILITYSD · ATR · drawdownLIQUIDITYspread · turnover · AmihudRELATIVE RISKbeta · correlation
ภาพที่ 1 Indicator เป็น Transformation ต่างรูปแบบของ Observation ที่เกี่ยวข้องกัน การเพิ่มจำนวน Indicator ไม่ได้รับประกันว่าได้ข้อมูลอิสระเพิ่ม

04 · PYTHON LAB: BUILD VERSIONED DAILY FEATURES

Shift Feature ก่อน Join เข้ากับการตัดสินใจที่เกิดใน Observation ถัดไป

ตัวอย่างใช้ 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
Shift จำเป็นแต่ยังไม่เพียงพอ

ยังต้องตรวจว่า Source พร้อมใช้เมื่อไร Closing Price อาจใช้ได้หลังตลาดปิด Fundamental Report ที่แก้ไขต้องใช้ Publication/Revision Timestamp และประวัติราคาที่ปรับ Corporate Action อาจถูกคำนวณใหม่ภายหลัง

05 · COMPLEXITY AND MATERIALIZATION

Rolling Indicator ส่วนใหญ่เป็น Linear เมื่อ Implement แบบ Incremental แต่การรันซ้ำข้าม Experiment ยังคงมีต้นทุน

สำหรับ A Instruments, T Observations และ E Experiments การสร้าง Linear Feature Set ใหม่มีต้นทุนประมาณ O(EAT) ส่วน Versioned Feature Build ลดการคำนวณสู่ O(AT) แล้วเพิ่มค่าอ่าน Feature ขณะที่ Cross-sectional Ranking อาจเพิ่ม O(TA log A)

WITHOUT STORECompute ≈ E × A × T × F

20 experiments × 2,000 stocks × 2,500 days × 15 features

WITH VERSIONED FEATURESCompute ≈ A × T × F

Build ครั้งเดียว Validate ครั้งเดียว แล้วใช้ซ้ำข้าม Experiment

OFFLINE FINANCIAL FEATURE KEYinstrument_id + venue + feature_timestamp + feature_set_version
+ price_adjustment_version + calendar_version + source_snapshot

06 · LEAKAGE AND BIAS CHECKLIST

สูตรที่สะอาดยังสร้างหลักฐานที่ไม่ซื่อตรงได้

01

Look-ahead

ใช้ Close, Volume หรือ Report ก่อนเวลาที่การตัดสินใจมองเห็นได้

02

Survivorship bias

Train เฉพาะหุ้นที่ยังจดทะเบียนอยู่ในปัจจุบัน

03

Corporate-action leakage

ใช้ราคาที่ปรับย้อนหลังโดยไม่บันทึก Adjustment Version และวัตถุประสงค์

04

Cross-sectional leakage

Normalize หุ้นด้วย Peer ที่ยังไม่มีข้อมูลหรืออยู่นอก Historical Universe

05

Stale quote

มอง Bid/Ask เก่าว่าเป็น Liquidity ในเวลาปัจจุบัน

06

Timezone/calendar mismatch

Join ตลาดคนละ Session ด้วย Date Label แทน Event Time ที่เทียบกันได้

07

Multiple testing

ทดลอง Window จำนวนมากแล้วเก็บเฉพาะตัวที่ดูสำเร็จ

08

Licensing and redistribution

จัดเก็บหรือเผยแพร่ Derived Feature เกินเงื่อนไขสิทธิ์ข้อมูลตลาด

07 · STUDENT CHALLENGES

มองแต่ละ Indicator เป็น Hypothesis ที่ Version ได้

01

Implement Log Return, Momentum, Rolling Volatility, Relative Spread และ Amihud Illiquidity จาก Synthetic Dataset เดียว

02

เปรียบเทียบ Raw Close กับ Adjusted Close รอบเหตุการณ์ Split 2-for-1 และอธิบาย Feature ที่เสีย

03

พิสูจน์ว่า Naive Rolling กับ Incremental Computation ให้ค่าเท่ากันภายใน Tolerance

04

สร้าง Point-in-time Universe ที่มีหุ้น Delisted แล้วเทียบกับ Universe ที่เหลือรอดถึงปัจจุบัน

05

วัด Correlation ระหว่าง RSI, Momentum, MACD และ SMA Distance แล้วตัด Feature ซ้ำด้วยกฎชัดเจน

06

ออกแบบ Feature-store Contract ที่มี Source, Venue, Calendar, Adjustment และ Availability Time

THE CENTRAL IDEA

Financial Feature Engineering คือวินัยในการสร้างซ้ำว่า ณ เวลานั้น ข้อมูลตลาดบอกอะไรเราได้อย่างซื่อตรง