Feature Importance - jaeaehkim/trading_system_beta GitHub Wiki
Motivation
- ์๋ชป๋ ์ ์ฐจ : ํน์ Data ์ ํ > ML ์๊ณ ๋ฆฌ์ฆ fitting > backtest ํด๋น loop ๋ฐ๋ณต
- ๋์ผํ ๋ฐ์ดํฐ์ ๋ํด ์ง์์ ์ผ๋ก ํ ์คํธ๋ฅผ ๋ฐ๋ณตํ๋ ๊ฒ์ ์๋ชป๋ ๋ฐ๊ฒฌ์ผ๋ก ๊ท๊ฒฐ ๊ฐ๋ฅ์ฑ ๋์. ๊ฑฐ์ง ํฌ์ ์ ๋ต์ ๋ฐ๊ฒฌํ๋๋ฐ๋ 20๋ฒ ์ ๋์ ๋ฐ๋ณต์ด๋ฉด ๊ฐ๋ฅ.
The Importance of Feature Importance
- Backtest๋ ๋งค์ฐ ์ฝ๊ฒ ๊ณผ์ ํ ๋ ์ ์๋ค. ์ด ์ฌ์ค์ ์ฒซ ๋ฒ์งธ๋ก ์ธ์งํด์ผ ํจ
- Cross Validation์ผ๋ก ๋ชจ๋ธ์ fittingํ ํ ํด๋น ๋ชจ๋ธ์ metric์ ๋ณด๊ณ ์ด๋ค Feature์ ์ํด์ ๋ชจ๋ธ์ metric์ด ์ข์ ์ฑ๊ณผ๋ฅผ ๋๋์ง๋ฅผ ํ๋จํด์ผ ํจ. Feature์ ๋ํด ์ฐ๊ตฌํ๊ณ Importance๋ฅผ ์ ๋ํ ํ์ฌ ์ต์ข ์ ์ผ๋ก ์ ํํ๋ ๊ณผ์ ์ด Research
- ์ง๋ํ์ต ๋ชจ๋ธ๋ค์ Feature๋ฅผ ์ฐ๊ตฌํ๋ ์๊ฐ black box๊ฐ ์๋๊ฒ ๋๋ค. ๋จธ์ ๋ฌ๋์ ํต์ฌ์ ํ์ตํ๋ ๊ณผ์ ์์ ์ง์ ํด์ค์ผ ํ ์๋ง์ ํ๋ก์ธ์ค๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ค๋ ์ .
- Lopez์ ๋น์ : ์ฌ๋ฅ๊พผ๋ค์ ์์ ์ ์ฌ๋ฅ๊ฐ๊ฐ ์ก์์จ ๋ชจ๋ ๊ฒ์ ๋จน์ง ์๋๋ค.
- Research
- Q1) ํด๋น Feature๊ฐ ๋ ์ค์ํ๊ฐ? ํน์ ํ๊ฒฝ์์๋ง ์ค์ํ๊ฐ?
- Q2) ์๊ฐ์ ๋ฐ๋ผ Feature์ ์ค์์ฑ์ ๋ค๋ฅด๊ฒ ํ๋ ๊ฒ์ ๋ฌด์์ธ๊ฐ?
- Q3) ์ํฉ ๋ณํ(regime)์ ์์ธกํ ์ ์๋๊ฐ?
- Q4) ์ค์ํ๋ค๊ณ ๊ฒฐ๋ก ๋ธ Feature๊ฐ ๋ค๋ฅธ ๊ธ์ต ์ํ์์๋ ์ค์ํ๊ฐ?
- Q5) ๋ค๋ฅธ ์์ฐ ๋ถ๋ฅ์๋ ๊ด๋ จ์ด ์๋๊ฐ?
- Q6) ๋ชจ๋ ๊ธ์ต์ํ์ ์์ด์ ๊ฐ์ฅ ๊ณตํต์ ์ผ๋ก ๊ด๋ จ์๋ Feature๋ ๋ฌด์์ธ๊ฐ?
Feature Importance with Substitution Effects
- Feature Importance๋ฅผ ํด์ํ ๋ ์ฃผ์ํด์ผ ํ ์ ์ Substitution Effects์ด๋ค. ์ด๋ ํต๊ณ์์ **๋ค์ค๊ณต์ ์ฑ(Multi-collinearity)**๊ณผ ์ฒ ํ์ ์ผ๋ก ๋์ผํ๋ค.
- ๋ฐฉ๋ฒ๋ก ๋ค์ Substitution Effects์ ์ํฅ์ ๋ฐ์์ ์ค์ ๋ก ๋ฐ์์ผ ํ ์ค์์ฑ ๋ณด๋ค ๋ฎ๊ฒ ๋ํ๋ ์ ์๋ค. ์ฆ, ๊ฒฐํฉ ํจ๊ณผ๋ฅผ ๊ณ ๋ คํ Feature Importance ๋ฐฉ๋ฒ๋ก ์ด ์๊ณ ๊ฐ๋ณ ๋จ์๋ก Feature Importance๋ฅผ ๊ณ์ฐํ๋ฉด ๋์ฒด ํจ๊ณผ์ ๊ดํด์ ์ํฅ ๋ฐ์ง ์์ผ๋ ๊ฒฐํฉ ํจ๊ณผ๋ฅผ ๊ณ ๋ คํ์ง ๋ชปํ๋ค๋ ๋จ์ ์ด ์๋ค. 2๊ฐ์ง ์นดํ ๊ณ ๋ฆฌ์ ๋ฐฉ๋ฒ๋ก ์ Ensembleํด์ ์ฐ๋ ๊ฒ์ด ์ข์.
- ์์ ๋ฐฉ๋ฒ์ Quant Researcher๋ค์ด ๋ง๋ค์ด๋ธ ๋ค์ํ Feature ์ค์์ noise๊ฐ ์๋ Feature Selection์ ํ๋ ๋ฐฉ์์ด๋ค. ์ฌ๊ธฐ์ PCA(Principal Component Analysis) ๊ฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ฐจ์์ ์ฌ์กฐํฉํ๊ณ ์ฃผ์ ํน์ง์ผ๋ก๋ง Feature๋ฅผ ๋ง๋ค์ด๋ด์ ์ฌ์ฉํ ์๋ ์๋ค. ๋ค๋ง, ์ด ๋ฐฉ๋ฒ์ ์ ํ ์กฐํฉ๋ ์ฃผ์ ํน์ง๋ค์ ๋๋ฉ์ธ์ด ๋ฐ์๋์ง ์์ ์์น ์์ฒด๋ก๋ง ์ต์ ํ ๋๋ ๊ฒฝํฅ์ด ์๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ์ ์ํ์ฑ์ด ์กด์ฌํ๊ณ PCA๋ฅผ ํตํด ๋์จ ์์ฝ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฆํ๋ Tool๋ก ์ฌ์ฉํ๋ ๊ฒ๋ ํ๋์ ๋ฐฉ๋ฒ์ด๋ค.
- Importance๋ฅผ ์ ๋์ ์ผ๋ก ๊ณ์ฐํ ๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ป๊ฒ ํ์ฉํ๋๋์ ๋ฐ๋ผ In-sample(IS) ๋ฐฉ์๊ณผ Out-of-sample(OS) ๋ฐฉ์์ด ์๋๋ฐ ์ฌ๋ฌ ์ฉ์ด๊ฐ ํผ์ฉ๋๋ ๊ฒฝํฅ์ด ์์ด ์ ๋ฆฌ
- Explanatory ๋ฐฉ์ (In-Sample)
- ์ค๋ช (Explanation), Train data, ํ๋ณธ๋ด ์ฑ๋ฅ ๊ฒ์ฆ(in-sample testing), explanatory-importance, explanatory-regression analysis
- Predictve ๋ฐฉ์ (Out-of-Sample)
- ์์ธก(Prediction), Test data, ํ๋ณธ์ธ ์ฑ๋ฅ ๊ฒ์ฆ(out-of-sample testing), predictive-importance, predictive-regression analysis
- Explanatory ๋ฐฉ์ (In-Sample)
MDI (Mean Decrease Impurity)
MDI์ ๋ํ ์ค๋ช
- ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก๋ Gini Importance ๋ผ๊ณ ๋ ๋ถ๋ฆฐ๋ค. ์์ ์์ Gini Impurity ๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ Decision-Tree ๋ชจ๋ธ์์ ๊ฐ ๋ ธ๋์ Impurity๋ฅผ ๋ฎ์ถ๊ธฐ ์ํด ์ต์ ํ ์์ ์ด ์งํ๋๋ค. ์์ ์์ ์ง๊ด์ ์ผ๋ก ํด์ํ๋ฉด ๊ฐ Class์ Sample์ด ๊ณจ๊ณ ๋ฃจ ๋ถํฌ๋์ด ์์์๋ก Impurity๋ ๋์์ง๊ณ ํ ๋ฐฉํฅ์ ์น์ฐ์น ์๋ก ๋ฎ์์ง๋ค. (์๋, homogeneity ์ฆ๊ฐ)
- Tree ๋ชจ๋ธ์ Node๋ฅผ ๊ณ์ ํ๊ณ ๋ด๋ ค๊ฐ๋ ๊ตฌ์กฐ์ด๊ณ ๊ฐ Node์ Importance๋ ๊ณ์ฐํ ์ ์๋ค. w_j๋ ์ ์ฒด ์ํ ์์ ๋ํ ๋ ธ๋ C_j์ ํด๋นํ๋ ์ํ ์์ ๋น์จ๋ก ๊ณ์ฐํ ์ ์๊ณ j_left, j_right๋ c_j ๋ค์์์ ๊ฐ๋ผ์ง๋ ๋ node๋ฅผ ์๋ฏธํ๋ค. node importanc ๊ฐ์ด ํด์๋ก ํด๋น ๋ ธ๋์์ Impurity๊ฐ ํฌ๊ฒ ๊ฐ์ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
- ๊ฐ feature์ ๊ณ์ฐ์ Node Importance๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ค์๋๋ฅผ ๋ํ๋ผ ์ ์๊ณ , 2๋ฒ์งธ ์์ normalizeํ ๊ฒ์ด๋ค
- Question) Splitํ๋ Feature์ Order์ ๋ฐ๋ผ Importance ๊ณ์ฐ ๊ฐ์ด ๋ฌ๋ผ์ง ๊ฒ ๊ฐ์๋ฐ DecisionTree model์ ์ด๋ค ์์ผ๋ก ํด๊ฒฐํ๋๊ฐ?
- ์ถ์ธก) ์ฒซ node ๋ง๋ค impurity๋ฅผ ๊ฐ์ฅ ๋ฎ๊ฒ ํด์ฃผ๋ ์ฃผ์ feature๋ถํฐ ๊ณ์ฐํ๋ ์์ผ๋ก ordering์ ์งํํ ๊ฒ์ผ๋ก ์์ -A) random seed์ ์กด์ฌ์ ๋ฐ๋ผ ๊ฐ์ด ๋ค๋ฅด๊ฒ ๋์ค๋ ๊ฑธ ๋ณด๋ฉด random์ผ๋ก ordering์ด ์งํ๋๋ ๊ฒ์ผ๋ก ๋ณด์
MDI ํน์ง
- Random Forest, Decision-Tree ๋ชจ๋ธ์ ํนํ๋์ด ์์ด Feature Importance ๊ณ์ฐ ์์ model dependency๊ฐ ์กด์ฌ. (Tree ๊ธฐ๋ฐ ์๋ ๋ชจ๋ธ์์ ์ฌ์ฉ X) Louppe, 2013
- Model Specific
- ํน์ Feature์ Bias๋ฅผ ๊ฐ์ ์ ์์ด์ ๋ค๋ฅธ ํน์ง์ ๋ฌด์ํ๋ Mask Effect ๋ฐ์ํ ์ ์์. Storbl, 2007
- ํ๋ณธ ๋ด ์ฑ๋ฅ ๊ฒ์ฆ์ด๋ฏ๋ก ์์ธก๋ ฅ์ด ์๋ Feature๋ ์ค์๋๋ฅผ ๊ฐ๋ ๊ฒ์ฒ๋ผ ๋์ด.
- ์ค์๋๋ 0~1์ ๊ฐ์ ๊ฐ๋ ์ํ์ ์ผ๋ก ์ข์ ํน์ฑ์ ์ง๋.
- ๋์ฒดํจ๊ณผ์ ์ํด์ ๋์ผํ ๋ ๊ฐ์ง ํน์ง์ด ์๋ ๊ฒฝ์ฐ ์ค์ง ์ค์๋ ๋ณด๋ค ์ ๋ฐ์ผ๋ก ๊ฐ์๋จ.
def featImpMDI(fit, featNames):
# feat importance based on IS mean impurity reduction
df0 = {i: tree.feature_importances_ for i, tree in enumerate(fit.estimators_)}
df0 = pd.DataFrame.from_dict(df0, orient='index')
df0.columns = featNames
df0 = df0.replace(0, np.nan) # because max_features = 1
imp = pd.concat({'mean': df0.mean(), 'std': df0.std() * df0.shape[0] ** -0.5}, axis=1)
imp /= imp['mean'].sum()
return
Mean Decrease Accuracy
MDA์ ๋ํ ์ค๋ช
- Permutation Feature Importance ๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ฉฐ ๊ธฐ๋ณธ์ ์ธ ์ปจ์ ์ X1~X_n๊น์ง n๊ฐ์ feature๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์ ์ ๋๋ก ๋ชจ๋ n๊ฐ์ feature๋ฅผ train ํ์ ๋์ metric performance์ n๊ฐ ์ค์ 1๊ฐ์ feature๋ฅผ shuffleํ์ฌ train ํ์ ๋์ ์ฑ๋ฅ ์์ค ์ ๋๊ฐ ํด ์๋ก ์ค์ํ feature๋ก ํ๋จํ๋ค. ๊ทธ๋ ๊ธฐ์ model dependency๊ฐ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
MDA ํน์ง
- ํ๋ณธ์ธ ์ฑ๋ฅ ๊ฒ์ฆ(out-of-sample testing)์ด ์งํ๋จ.
- ๋ชจ๋ Classifier์ ์ ์ฉ ๊ฐ๋ฅํจ
- ์ฑ๋ฅ metric์ ๋ค์ํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ. ex) Accuracy, F1 Score, neg log loss
- ์๊ด๋ ํน์ง์ด ์๋ ๊ฒฝ์ฐ importance ๊ฐ์ ์ํฅ์ ๋ฏธ์นจ
- MDI์ ๋ฌ๋ฆฌ ๋ชจ๋ ํน์ง์ด ์ค์ํ์ง ์๋ ๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ์์. why? ํ๋ณธ์ธ ์ฑ๋ฅ ๊ฒ์ฆ์ด๊ธฐ ๋๋ฌธ.
def featImpMDA(clf, X, y, cv, sample_weight, t1, pctEmbargo, scoring='neg_log_loss'):
# feat importance based on OOS score reduction
if scoring not in ['neg_log_loss', 'accuracy']:
raise ValueError('wrong scoring method')
from sklearn.metrics import log_loss, accuracy_score
cvGen = PurgedKFold(n_splits=cv, t1=t1, pctEmbargo=pctEmbargo)
scr0, scr1 = pd.Series(), pd.DataFrame(columns=X.columns)
for i, (train, test) in enumerate(cvGen.split(X=X)):
X0, y0, w0 = X.iloc[train, :], y.iloc[train], sample_weight.iloc[train]
X1, y1, w1 = X.iloc[test, :], y.iloc[test], sample_weight.iloc[test]
fit = clf.fit(X=X0, y=y0, sample_weight=w0.values)
if scoring == 'neg_log_loss':
prob = fit.predict_proba(X1)
scr0.loc[i] = -log_loss(y1, prob, sample_weight=w1.values, labels=clf.classes_)
else:
pred = fit.predict(X1)
scr0.loc[i] = accuracy_score(y1, pred, sample_weight=w1.values)
for j in X.columns:
X1_ = X1.copy(deep=True)
np.random.shuffle(X1_[j].values) # permutation of a single column
if scoring == 'neg_log_loss':
prob = fit.predict_proba(X1_)
scr1.loc[i, j] = -log_loss(y1, prob, sample_weight=w1.values, labels=clf.classes_)
else:
pred = fit.predict(X1_)
scr1.loc[i, j] = accuracy_score(y1, pred, sample_weight=w1.values)
imp = (-scr1).add(scr0, axis=0)
if scoring == 'neg_log_loss':
imp = imp / -scr1
else:
imp = imp / (1.0 - scr1)
imp = pd.concat({'mean': imp.mean(), 'std': imp.std() * imp.shape[0] ** -0.5}, axis=1)
return imp, scr0.mean()
- ์ฝ๋ ๋ถ์
- PurgedKFold,
if scoring == 'neg_log_loss':
์ด ๋ถ๋ถ์ Cross-Validataion-in-Model ์ ์ฐธ๊ณ ํ๋ฉด ์ ์ด๋ ๊ฒ ์งค ์ ์๋์ง ์ดํดํ ์ ์๋ค. - ํต์ฌ์ ์ผ๋ก ๋ด์ผํ ๋ถ๋ถ์
scr0.loc[i] = -log_loss(y1, prob, sample_weight=w1.values, labels=clf.classes_)
src0๋ฅผ ๊ณ์ฐํ๋ ๋ถ๋ถ ์ด ๋ถ๋ถ์ ๋ชจ๋ feature๋ฅผ ์ ๋๋ก ๋ฃ๊ณ ๊ณ์ฐํ๋ ํํธ์ด๊ณ neg_log_loss์ accuracy ๋ชจ๋ ๊ตฌํ๋์ด ์๋ ์ํ np.random.shuffle(X1_[j].values) # permutation of a single column
์ ํตํด์ j๋ฒ์งธ column์ ์๊ณ ๊ทธ๋์ score๋ฅผ src1์ ์ ์ฅํจ.- src0, src1์ ๊ฐ์ง๊ณ importance๋ฅผ
imp = (-scr1).add(scr0, axis=0)
๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐํจ.
- PurgedKFold,
Feature Importance without Substitution Effects
- Substitution Effects๋ฅผ ๊ณ ๋ คํ์ง ์์ Feature Importance ๋ฐฉ๋ฒ๋ก ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ค์ํ Feature๋ฅผ ์ค์ํ์ง ์์ ๊ฑธ๋ก ๋์ฌ ์ ์๋ค. ์ด๋ฅผ ์ํด์ ๋ณด์ํ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค. SFI(Single Feature Importance)๋ฅผ ํ์ฉํด ๋ณด์ํ ์ ์๋ค.
Single Feature Importance
SFI ์ค๋ช
- Feature ํ๋์ฉ Performance๋ฅผ ์ธก์ ํ๊ธฐ ๋๋ฌธ์ Cross-sectional ํ๋ค๊ณ ๋ณผ ์ ์๊ณ , metric์ accuracy, neg log loss ๋ฌด์์ด๋ ์๊ด์๋ค.
SFI ํน์ง
- ๋ชจ๋ Classifier์ ์ ์ฉ ๊ฐ๋ฅํ๋ค.
- metric์ผ๋ก ์ ๋ํ๋ ๋ชจ๋ ์๋ฌด๊ฑฐ๋ ์ฌ์ฉํด๋ ๊ฐ๋ฅํ๋ค.
- out-of-sample testing ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ํน์ง์ด ์ค์ํ์ง ์๋ค๋ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ์๋ค.
def auxFeatImpSFI(featNames, clf, trnsX, cont, scoring, cvGen):
imp = pd.DataFrame(columns=['mean', 'std'])
for featName in featNames:
df0 = cvScore(clf, X=trnsX[featName](/jaeaehkim/trading_system_beta/wiki/featName), y=cont['bin'], sample_weight=cont['w'], scoring=scoring, cvGen=cvGen)
imp.loc[featName, 'mean'] = df0.mean()
imp.loc[featName, 'std'] = df0.std() * df0.shape[0] ** -0.5
return imp
- ์ฝ๋ ๋ถ์
for featName in featNames:
์ ํตํด single feature ๋ง๋ค loop- single feature ๋ง๋ค
cvScore(clf, X=trnsX[featName](/jaeaehkim/trading_system_beta/wiki/featName), y=cont['bin'], sample_weight=cont['w'], scoring=scoring, cvGen=cvGen)
metric ๊ณ์ฐํจ. - ๋ง์ง๋ง์ normalize๋ฅผ ํจ
Orthogonal Features
Orthogonal Features ์ค๋ช
- PCA๋ฅผ ํตํด ๋์ค๋ ์๋กญ๊ฒ ์ ํ ์กฐํฉ๋ Feature๋ ๋ชจ๋ Substitution Effects๋ฅผ ๊ฐ์์ํค์ง ์์ง๋ง Linear Substitution Effects๋ ๊ฐ์์ํฌ ์ ์๋ค.
- Feature Matrix X (t X n) ๊ฐ ์๊ณ ์ด๋ฅผ sigma_n (1 X n) vector์ mu_n (1 X n) vector๋ก ํ์คํํ matrix๊ฐ Z (t X n)์ด๋ค.
- ๊ณ ์ณ๊ฐ ๋ถํด๋ฅผ ํตํด์ Lambda diagonal matrix (n x n, descending order)์ W orhtonormal matrix(n x n)๋ฅผ ๊ตฌํ๋ค. Z`Z = n X n matrix
- orthonormal feature matrix P = ZW๋ก ๊ณ์ฐํ๊ณ P`P์ ๊ณ์ฐ์ ํตํด orthonormality๋ฅผ ๊ฒ์ฆํ๋ค.
- Z๋ฅผ ๊ณ์ฐํ์ฌ ๊ณ ์ณ๊ฐ ๋ถํด๋ฅผ ์งํํ๋ ์ด์ ?
- ๋ฐ์ดํฐ ์ค์ํ : ์ฒซ ๋ฒ์งธ ์ฃผ์ฑ๋ถ์ด Observations(X, Train data)์ ์ฃผ๋ฐฉํฅ๊ณผ ์ ํํ ์ผ์น์์ผ ํํํ๊ฒ ๋จ.
- ๋ฐ์ดํฐ ์ค์ผ์ผ๋ง : ๋ถ์ฐ ๋ณด๋ค ์๊ด๊ด๊ณ๋ฅผ ์ค๋ช ํ๋๋ฐ ๋ ์ง์ค. ๋ง์ฝ ์ํ๋ฉด ๋ถ์ฐ์ด ๊ฐ์ฅ ํฐ Feature์ ์ฃผ๋ ๋นํ๋ ๊ฒฐ๊ณผ๊ฐ ์ฐ์ถ๋จ.
def get_eVec(dot, varThres):
eVal, eVec = np.linalg.eigh(dot)
idx = eVal.argsort()[::-1]
eVal, eVec = eVal[idx], eVec[:, idx]
eVal = pd.Series(eVal, index=['PC_'+str(i+1) for i in range(eVal.shape[0])])
eVec = pd.DataFrame(eVec, index=dot.index, columns=eVal.index)
eVec = eVec.loc[:,eVal.index]
cumVar = eVal.cumsum() / eVal.sum()
dim = cumVar.values.searchsorted(varThres)
eVal, eVec = eVal.iloc[:dim+1], eVec.iloc[:,:dim+1]
return eVal, eVec
def orthoFeats(dfX, varThres=0.95):
dfZ = dfX.sub(dfX.mean(), axis=1).div(dfX.std(), axis=1)
dot = pd.DataFrame(np.dot(dfZ.T, dfZ), index=dfX.columns, columns=dfX.columns)
eVal, eVec = get_eVec(dot, varThres)
dfP = np.dot(dfZ, eVec)
return dfP
def PCA_rank(dfX):
dfZ = dfX.sub(dfX.mean(), axis=1).div(dfX.std(), axis=1)
dot1 = np.nan_to_num(np.dot(dfZ.T, dfZ))
eVal1, eVec1 = np.linalg.eig(dot1)
perm = np.random.permutation(dfZ.columns)
dfZ = dfZ.reindex(perm, axis=1)
dot = np.nan_to_num(pd.DataFrame(np.dot(dfZ.T, dfZ), index=perm, columns=perm))
eVal, eVec = np.linalg.eig(dot)
return pd.Series(eVal.shape[0] - eVal.argsort().argsort(), index=dfX.columns, name='PCA_rank')
- ์ฝ๋ ๋ถ์
get_eVec
์ ํตํด์ W matrix (eVec)๋ฅผ ๊ณ์ฐํ๋ค. ํจ์ ์์ ๋ด์ฉ์ ์์์ ์ฝ๋ํ ํ์ ๋ฟ.orthoFeats
์ ํตํด P matrix(dfP, orthonormal features)๋ฅผ ๊ณ์ฐํจ.
Orthogonal Features ์ฃผ์ ํน์ง ๋ฐ ์ฃผ์ํ ์
- ์ง๊ตํ๋ฅผ ํตํด ๊ณ ์ณ๊ฐ๊ณผ ์ฐ๊ณ๋ ์ ๋๊ฐ ์์ ํน์ง์ ๋ฒ๋ฆผ์ผ๋ก์จ ์ฐจ์ ์ถ์์ ์ฐ์ฐ ์๋๋ฅผ ์ฆ๊ฐ์ํฌ ์ ์๊ณ ์ง๊ต ํน์ง์ ์ป์ด๋ผ ์ ์์. ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํด์ํ๋๋ฐ ๋์์ด ๋๋ค.
- PCA๋ ๊ธฐ๋ณธ์ ์ผ๋ก label์ ๋ํ ์ง์ ์์ด (Unsupervised Learning)์ ํตํด ์ด๋ค ํน์ง์ด ๋ค๋ฅธ ํน์ง ๋ณด๋ค ์ฃผ์(Principal)ํ๋ค๋ ๊ฒฐ์ ์ ๋ด๋ฆฐ๋ค. ์ฆ, ๊ณผ์ ํฉ์ ๊ฐ๋ฅ์ฑ์ ๊ณ ๋ คํ์ง ์์
- PCA ๊ฒ์ฆ ํ์ฉ ๋ฐฉ๋ฒ
- ๋ชจ๋ feature๊ฐ random์ด๋ผ๋ฉด PCA์ ์์์ MDI,MDA,SFI ์์์ ์ผ์นํ์ง ์์ ๊ฒ์ด๋ค. ์ ์ฌํ ์๋ก ๊ณผ์ ํฉ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์์ ์๋ฏธํ๋ค๊ณ ํด์ ๊ฐ๋ฅ
- egien values (inverse of pca rank) ~~ mdi,mda,sfi rank ์ weighted Kendallโs tau๋ฅผ ๊ณ์ฐํ์ฌ ๊ณผ์ ํฉ ์ํ๋ฅผ ์ฒดํฌํ ์ ์๋ค.
Parallelized VS. Stacked Feature Importance
Parallelized
- small lambda : ๊ฐ ์ํ i, ๊ธฐ์ค(train data-label data) k์ ๋ํ ํน์ง ์ค์๋ j๋ฅผ ๋ํ๋ด๊ณ ์ด๋ฅผ ๋ณํฉํด large lambda(j,k) ๋ฅผ ๋์ถํ ์ ์๊ณ ํฌ์ ์ํ ์์ญ ์ ๋ฐ์ ๊ฑธ์ณ ์ค์ํ ์๋ก ๊ธฐ์ ํ์(theoritical mechanism) ์ผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- ๋ณ๋ ฌ์ ์ผ๋ก ๊ณ์ฐ์ด ๊ฐ๋ฅํ๊ณ ๊ฐ ์ํ ๋ณ๋ก ํน์ง ์์๊ฐ ๋ฐ๋ ์ ์์ผ๋ ์ด๋ฅผ ํ๊ท ํํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ๋ค๋ง, ์ํ์ ๋ํด ํ๊ท ํ ํ๋ ๋ฐฉ์์ ๊ฒฐํฉํจ๊ณผ๋ฅผ ์ผ๋ถ ๋์น๊ฒ ๋๋ค.
Stacked
-
- ์๋ก ๋ค๋ฅธ ์ํ์ ํ๋์ dataset์ผ๋ก stacking ํ๋ ๋ฐฉ์์ด๊ณ ์ด๋ X'๋ standardized on a rolling trailing window ์ฌ์ผ ํ๋ค.
- X๊ฐ IID ํ๋ฉด X'๋ IID
- Parallelized version ์ ๋นํด ํจ์ฌ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ์ ํฉํ ๋๊ณ , ์ค์๋๋ฅผ ๊ณ์ฐํ๋ ๊ณผ์ ์ ๊ฐ๋จํด์ง๋ค.
- ์ด์ ๊ฐ๊ณผ ๊ณผ์ ํฉ์ ์ํ ํธํฅ์ด ์ ๋ค.
- ๊ฒฐํฉํจ๊ณผ๋ฅผ ๋์น์ง ์๊ฒ ๋๋ค.
- Stacking์ ๋ฐ์ดํฐ๊ฐ ๋ง์์ง์๋ก ์์ฒญ๋ ๋ฉ๋ชจ๋ฆฌ์ ์์์ ์๋ชจํ๋ค. ๊ทธ๋ฌ๋ฏ๋ก HPC(High Performance Computing) ์ด ๋งค์ฐ ์ค์ํด์ง
- ์๋ก ๋ค๋ฅธ ์ํ์ ํ๋์ dataset์ผ๋ก stacking ํ๋ ๋ฐฉ์์ด๊ณ ์ด๋ X'๋ standardized on a rolling trailing window ์ฌ์ผ ํ๋ค.
-
Feautre Importance๋ฅผ ๊ณ์ฐํ ๋์ ๋ ๊ฐ์ง ๋ฐฉ์
Application to Quant System
- PCA feature ์ค ๊ฐ์ฅ ์ฃผ์ํ feature๋ feature๋ก ์ถ๊ฐํด๋ด๋ ๋ ๋ฏ. ๋ฌผ๋ก redundancy๊ฐ ๋ฐ์ํ๊ฒ ์ง๋ง.
- feature importance ๊ณ์ฐ์ multi-processing์ ๋ถ์ฌ์ผ ํ๋ค.
- labeling case๊ฐ ๋๋ฌด ๋ค์ํจ.
- backtest๋ก ๋ฐ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ model ๋จ์์ ๋ง์ ๊ฒ์ ๋๋ด์ backtesting ์ชฝ์ ์ฐ์ฐ๋์ ์ต์ํ์ผ๋ก ์ค์ฌ์ค์ผ ํจ
- stacking ๋ฐฉ์์ผ๋ก ์ ๊ทผํ๋๊ฒ ์ข์ ๊ฒ ๊ฐ์.