Feature Engineering برای ترید
ساخت متغیرهای پیشبینیکننده.
Feature Engineering برای ترید: ساخت متغیرهای پیشبینیکننده
هدف یادگیری
پس از مطالعه این درس، قادر خواهید بود متغیرهای پیشبینیکننده (features) کمّی از دادههای خام بازار بسازید، آنها را با معیارهای آماری ارزیابی کنید، و یک pipeline مقیاسپذیر برای ورود به مدلهای یادگیری ماشین طراحی کنید.
---
۱. جایگاه Feature Engineering در چرخه کوانتترید
در معماری یک استراتژی کوانت، دادههای خام — قیمت OHLCV، دفتر سفارش، دادههای آنچین، احساس بازار — به تنهایی قابل استفاده مستقیم در مدل نیستند. Feature Engineering پلی است میان این دادههای خام و الگوریتم یادگیری؛ هدفش تبدیل سیگنالهای پنهان در نویز بازار به متغیرهایی با قدرت توضیحدهندگی بالاست.
یک اشتباه رایج در میان تریدرهای مبتدی به کوانت این است که مستقیماً قیمت بسته شدن close_t را به مدل میدهند. این کار دو مشکل اساسی دارد:
- غیر-ایستایی (Non-stationarity): سری قیمت دارای روند است و توزیع آماریاش در طول زمان تغییر میکند.
- مقیاسناپذیری: مقایسه قیمت BTC در ۲۰۱۷ با ۲۰۲۴ بیمعناست.
راهحل استاندارد: کار با بازده لگاریتمی به جای قیمت مطلق:
r_t = ln(P_t / P_{t-1})
این تبدیل سری را تقریباً ایستا میکند و مقیاسپذیری را فراهم میآورد.
---
۲. دستهبندی Features در بازارهای مالی
Features را میتوان در پنج دسته کلی سازماندهی کرد:
الف) Features مبتنی بر قیمت و بازده
سادهترین و در عین حال پرکاربردترین نوع. نمونهها:
Momentum چندگانه:
MOM_n = r_t + r_{t-1} + ... + r_{t-n+1}
برای مثال MOM_5 مجموع بازده ۵ کندل اخیر است. در ادبیات مالی ثابت شده که momentum کوتاهمدت (۱–۵ روز) در کریپتو اثر معکوس دارد، در حالی که momentum میانمدت (۲۱–۶۳ روز) اثر تداوم نشان میدهد.
نسبت High-Low به ATR:
HL_ratio = (High_t - Low_t) / ATR_n
این feature میزان نوسان کندل جاری را نسبت به نوسان اخیر نرمال میکند.
Z-score قیمت:
Z_t = (P_t - μ_n) / σ_n
جایی که μ_n میانگین متحرک و σ_n انحراف معیار rolling در پنجره n است. Z-score بالاتر از ۲ یا پایینتر از ۲- نشانهی انحراف آماری قابل توجه است.
ب) Features مبتنی بر حجم و جریان سفارش
حجم خام اطلاعات محدودی دارد. ترکیب آن با قیمت قدرتمندتر است:
Volume-Weighted Average Price Deviation:
VWAP_dev = (P_t - VWAP_t) / VWAP_t
On-Balance Volume نرمالشده:
OBV_norm = OBV_t / rolling_max(OBV, n)
Amihud Illiquidity Ratio:
ILLIQ_t = |r_t| / Volume_t (در واحد دلار)
این معیار کلاسیک نشان میدهد هر واحد بازده چقدر حجم نقدینگی نیاز دارد. عدد بزرگتر یعنی بازار کمعمقتر است.
ج) Features آماری (Statistical Features)
این دسته از توزیع آماری بازده استخراج میشود:
Rolling Skewness:
skew_n = E[(r - μ)³] / σ³
skewness منفی در کریپتو اغلب پیش از ریزشهای شدید دیده میشود.
Realized Volatility:
RVol_n = sqrt(sum(r_t²) برای t از 1 تا n)
برخلاف انحراف معیار ساده، Realized Volatility از میانگین کم نمیکند و برای بازههای کوتاه دقیقتر است.
Autocorrelation Lag-1:
AC1 = corr(r_t, r_{t-1})
اگر AC1 به طور پایدار مثبت باشد، بازار در آن دوره momentum دارد؛ منفی یعنی mean-reversion.
د) Features مبتنی بر ساختار دفتر سفارش (Order Book)
در کریپتو با دسترسی به داده Level 2، میتوان features قویتری ساخت:
Order Book Imbalance:
OBI = (BidVol_k - AskVol_k) / (BidVol_k + AskVol_k)
جایی که k تعداد لِوِلهای مورد بررسی است (معمولاً ۵ تا ۱۰). OBI نزدیک به ۱ یعنی فشار خرید غالب است.
Mid-Price Micro-Return:
MidReturn = (MidPrice_t - MidPrice_{t-1}) / MidPrice_{t-1}
Mid-price میانگین بهترین bid و ask است و نویز اسپرد را حذف میکند.
ه) Features آنچین و احساس (برای کریپتو)
- Exchange Netflow: خروج بیتکوین از صرافیها (منفی = فشار فروش کمتر)
- Funding Rate: در بازار آتی دائمی (perpetual)، نرخ مثبت یعنی longs بیشتر از shorts هستند
- Social Sentiment Score: نسبت توییتهای مثبت به منفی با وزندهی بر اساس engagement
---
۳. مبارزه با Data Leakage: مهمترین چالش عملی
Data Leakage یعنی اطلاعات آینده به طور ناخواسته وارد features گذشته شود. این اشتباه رایجترین دلیل overfitting در استراتژیهای کوانت است.
مثال کلاسیک: اگر برای محاسبه Z-score در روز t، از دادههای کل دوره برای محاسبه μ و σ استفاده کنید (look-ahead bias)، مدل شما در بکتست عالی عمل میکند اما در live trading شکست میخورد.
قانون طلایی: همه محاسبات باید به صورت expanding یا rolling انجام شوند:
python
اشتباه — look-ahead bias
df['z_score'] = (df['close'] - df['close'].mean()) / df['close'].std()
درست — rolling window
df['z_score'] = (df['close'] - df['close'].rolling(60).mean()) / df['close'].rolling(60).std()---
۴. انتخاب Features: کدام متغیرها ارزش نگهداشتن دارند؟
ساختن صدها feature آسان است؛ انتخاب features با قدرت پیشبینی واقعی هنر است.
روش ۱: Information Coefficient (IC)
IC ضریب همبستگی رتبهای (Spearman) بین feature در زمان t و بازده آینده در t+h است:
IC = Spearman_corr(Feature_t, Return_{t+h})
یک feature با |IC| > 0.05 در بازارهای مالی قابل توجه محسوب میشود. معیار پایداری، IC Information Ratio است:
ICIR = mean(IC) / std(IC)
ICIR بالاتر از ۰.۵ نشاندهنده featureای با ارزش سیگنال پایدار است.
روش ۲: Feature Importance از مدلهای درختی
خروجی feature_importances_ از XGBoost یا LightGBM بر اساس Gain (کاهش impurity) محاسبه میشود. اما توجه: این معیار در برابر featureهای با cardinality بالا bias دارد. برای جبران، از Permutation Importance استفاده کنید:
PI(f) = Score(model) - Score(model با feature f shuffled)
روش ۳: Maximum Information Coefficient (MIC)
برای تشخیص روابط غیرخطی بین feature و target:
MIC(X, Y) = max_{n·m < B} I(X;Y) / log(min(n,m))
جایی که I(X;Y) اطلاعات متقابل و B پارامتر بزرگی شبکه است. MIC بالاتر از ۰.۳ معمولاً رابطه معناداری را نشان میدهد.
---
۵. نرمالسازی و آمادهسازی نهایی Features
Cross-sectional Ranking
اگر مدل شما چندین دارایی را همزمان بررسی میکند، features را به صورت cross-sectional رتبهبندی کنید:
Ranked_feature_{i,t} = rank(Feature_{i,t}) / N_t
این کار تأثیر outlier ها را کاهش داده و مقایسهپذیری بین داراییهای مختلف را ممکن میسازد.
Winsorization
بجای حذف outlier ها، آنها را در percentile مشخص کلیپ کنید:
Winsorized_x = clip(x, p5, p95)
جایی که p5 و p95 پرسنتایلهای ۵ و ۹۵ هستند. این روش اطلاعات را حفظ میکند بدون اینکه outlier ها مدل را منحرف کنند.
Temporal Decay Weighting
در بعضی features، دادههای اخیر باید وزن بیشتری داشته باشند:
EWM_feature_t = Σ (λ^k · Feature_{t-k}) برای k از 0 تا n
جایی که 0 < λ < 1
مثلاً برای λ = 0.94 (مقدار پیشنهادی RiskMetrics)، وزن دادهی ۱۰ روز پیش 0.94^10 ≈ 0.54 است — یعنی نصف وزن داده جاری.
---
۶. Pipeline عملی: از داده خام تا Feature Matrix
یک pipeline استاندارد برای کریپتو این مراحل را دارد:
- دریافت داده OHLCV → بررسی gap و دادههای مفقود
- محاسبه بازده لگاریتمی
- ساخت features (price, volume, statistical, orderbook)
- Winsorization در rolling percentile
- Cross-sectional ranking
- حذف features با IC < 0.03 یا correlation > 0.95 با یکدیگر
- ذخیره Feature Matrix با index زمانی دقیق
نکته کلیدی در گام ۶: حذف features همبسته (multicollinearity) از طریق Variance Inflation Factor (VIF) انجام میشود:
VIF_j = 1 / (1 - R²_j)
جایی که R²_j ضریب تعیین رگرسیون feature j بر روی سایر features است. VIF بالاتر از ۱۰ نشانه همبستگی شدید است.
---
نتیجهگیری
Feature Engineering نه یک مرحله یکبار و تمامشده، بلکه فرآیندی تکراری است. بازارهای کریپتو رژیمهای مختلفی دارند — روند، ranging، و انفجاری — و features که در یک رژیم کار میکنند ممکن است در رژیم دیگر بیاثر باشند. تست دورهای IC و ICIR features و بازطراحی pipeline بر اساس رژیم جاری بازار، از ملزومات یک کوانت حرفهای است.
---
خلاصه نقطهای
- بازده لگاریتمی را جایگزین قیمت مطلق کنید تا سری ایستا و مقیاسپذیر داشته باشید.
- Features را در پنج دسته سازماندهی کنید: قیمت، حجم، آماری، دفتر سفارش، و آنچین/احساس.
- Data Leakage مهلکترین خطاست؛ همه محاسبات باید rolling یا expanding باشند.
- IC و ICIR معیارهای اصلی ارزیابی قدرت پیشبینی یک feature هستند.
- Cross-sectional ranking و Winsorization مقیاسپذیری و مقاومت در برابر outlier را تضمین میکنند.
- VIF همبستگی بین features را میسنجد؛ features با VIF > 10 باید حذف یا ترکیب شوند.
- Pipeline شما باید قابل بازتولید (reproducible) و با index زمانی دقیق باشد.