久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

【手把手教你】使用Python全面分析股票數(shù)據(jù)特征

 ramdisk 2022-06-18 發(fā)布于上海

導(dǎo)讀: 本文主要從股市數(shù)據(jù)變量的特征分布及特征重要性兩個(gè)角度對(duì)數(shù)據(jù)進(jìn)行分析。

通過繪制圖表等方法分析特征本身對(duì)分布狀況或特征間相互關(guān)系,。通過機(jī)器學(xué)習(xí)模型方法分析出特種重要性排序,選出對(duì)結(jié)果貢獻(xiàn)較大對(duì)那幾個(gè)特征,這對(duì)后面建模對(duì)模型效果有著不可小覷對(duì)效果,。

????點(diǎn)擊關(guān)注|選擇星標(biāo)|干貨速遞????


數(shù)據(jù)準(zhǔn)備

此處數(shù)據(jù)獲取可參見金融數(shù)據(jù)準(zhǔn)備

df.info()

  1. <class 'pandas.core.frame.DataFrame'>
  2. DatetimeIndex: 1260 entries, 2015-12-31 to 2020-12-31
  3. Data columns (total 6 columns):
  4. # Column Non-Null Count Dtype
  5. --- ------ -------------- -----
  6. 0 Open 1260 non-null float64
  7. 1 High 1260 non-null float64
  8. 2 Low 1260 non-null float64
  9. 3 Close 1260 non-null float64
  10. 4 Adj Close 1260 non-null float64
  11. 5 Volume 1260 non-null int64
  12. dtypes: float64(5), int64(1)
  13. memory usage: 68.9 KB

特征構(gòu)造

  1. df['H-L'] = df['High'] - df['Low']
  2. df['O-C'] = df['Adj Close'] - df['Open']
  3. df['3day MA'] = df['Adj Close'].shift(1).rolling(window=3).mean()
  4. df['10day MA'] = df['Adj Close'].shift(1).rolling(window=10).mean()
  5. df['30day MA'] = df['Adj Close'].shift(1).rolling(window=30).mean()
  6. df['Std_dev'] = df['Adj Close'].rolling(5).std()
  7. df.dtypes

描述性統(tǒng)計(jì)

df.describe().T

缺失值分析

檢查缺失值

df.isnull().sum() 
  1. Open 0
  2. High 0
  3. Low 0
  4. Close 0
  5. Adj Close 0
  6. Volume 0
  7. H-L 0
  8. O-C 0
  9. 3day MA 3
  10. 10day MA 10
  11. 30day MA 30
  12. Std_dev 4
  13. dtype: int64

缺失值可視化

這里使用Series的屬性plot直接繪制條形圖,。

  1. df_missing_count = df.isnull().sum() 
  2. # -1表示缺失數(shù)據(jù)
  3. # 另一個(gè)不常見的設(shè)置畫布的方法
  4. plt.rcParams['figure.figsize'] = (15,8)
  5. df_missing_count.plot.bar()
  6. plt.show()
  1. for column in df:
  2.    print("column nunique  NaN")
  3.     print("{0:15} {1:6d} {2:6}".format(
  4.           column, df[column].nunique(), 
  5.           (df[column] == -1).sum()))
  1. column nunique NaN
  2. Open 1082 0
  3. High 1083 0
  4. Low 1025 0
  5. Close 1098 0
  6. Adj Close 1173 0
  7. Volume 1250 0
  8. H-L 357 0
  9. O-C 1237 2
  10. 3day MA 1240 0
  11. 10day MA 1244 0
  12. 30day MA 1230 0
  13. Std_dev 1252 0

特征間相關(guān)性分析

  1. import seaborn as sns
  2. # 一個(gè)設(shè)置色板的方法
  3. # cmap = sns.diverging_palette(220, 10,
  4.                         as_cmap=True)
  5. sns.heatmap(df.iloc[:df.shape[0]].corr()
  6.         ,annot = True, cmap = 'Blues')

特征值分布

直方圖

  1. columns_multi = [x for x in list(df.columns)]
  2. df.hist(layout = (3,4), column = columns_multi)
  3. # 一種不常用的調(diào)整畫布大小的方法
  4. fig=plt.gcf()
  5. fig.set_size_inches(20,9)

密度圖

  1. names = columns_multi
  2. df.plot(kind='density', subplots=True, 
  3.         layout=(3,4), sharex=False)

特征間的關(guān)系

函數(shù)可視化探索數(shù)據(jù)特征間的關(guān)系

  1. sns.pairplot(df, size=3, 
  2.              diag_kind="kde")

特征重要性

通過多種方式對(duì)特征重要性進(jìn)行評(píng)估,,將每個(gè)特征的特征重要的得分取均值,最后以均值大小排序繪制特征重要性排序圖,直觀查看特征重要性,。

導(dǎo)入相關(guān)模塊

  1. from sklearn.feature_selection import RFE,RFECV, f_regression
  2. from sklearn.linear_model import (LinearRegression, Ridge, Lasso,,LarsCV)
  3. from stability_selection import StabilitySelection, RandomizedLasso
  4. from sklearn.preprocessing import MinMaxScaler
  5. from sklearn.ensemble import RandomForestRegressor
  6. from sklearn.ensemble import RandomForestClassifier
  7. from sklearn.svm import SVR

線性回歸系數(shù)大小排序

回歸系數(shù)(regression coefficient)在回歸方程中表示自變量   對(duì)因變量   影響大小的參數(shù)?;貧w系數(shù)越大表示   對(duì)   影響越大,。

創(chuàng)建排序函數(shù)

  1. df = df.dropna()
  2. Y = df['Adj Close'].values
  3. X = df.values
  4. colnames = df.columns
  5. # 定義字典來存儲(chǔ)的排名
  6. ranks = {}
  7. # 創(chuàng)建函數(shù),它將特征排名存儲(chǔ)到rank字典中
  8. def ranking(ranks, names, order=1):
  9.     minmax = MinMaxScaler()
  10.     ranks = minmax.fit_transform(
  11.           order*np.array([ranks]).T).T[0]
  12.     ranks = map(lambda x: round(x,2), ranks)
  13.     res = dict(zip(names, ranks))
  14.     return res

多個(gè)回歸模型系數(shù)排序

  1. # 使用線性回歸
  2. lr = LinearRegression(normalize=True)
  3. lr.fit(X,Y)
  4. ranks["LinReg"] = ranking(np.abs(lr.coef_), colnames)
  5. # 使用 Ridge 
  6. ridge = Ridge(alpha = 7)
  7. ridge.fit(X,Y)
  8. ranks['Ridge'] = ranking(np.abs(ridge.coef_), colnames)
  9. # 使用 Lasso
  10. lasso = Lasso(alpha=.05)
  11. lasso.fit(X, Y)
  12. ranks["Lasso"] = ranking(np.abs(lasso.coef_), colnames)

隨機(jī)森林特征重要性排序

隨機(jī)森林得到的特征重要性的原理是我們平時(shí)用的較頻繁的一種方法,,無論是對(duì)分類型任務(wù)還是連續(xù)型任務(wù),,都有較好對(duì)效果。在隨機(jī)森林中某個(gè)特征X的重要性的計(jì)算方法如下:

  1. 對(duì)于隨機(jī)森林中的每一顆決策樹,, 使用相應(yīng)的OOB(袋外數(shù)據(jù))數(shù)據(jù)來計(jì)算它的袋外數(shù)據(jù)誤差 ,,記為 .

  2. 隨機(jī)地對(duì)袋外數(shù)據(jù)OOB所有樣本的特征X加入噪聲干擾 (就可以隨機(jī)的改變樣本在特征X處的值), 再次計(jì)算它的袋外數(shù)據(jù)誤差 ,,記為 .

  3. 假設(shè)隨機(jī)森林中有   棵樹,,那么對(duì)于特征X的重要性,之所以可以用這個(gè)表達(dá)式來作為相應(yīng)特征的重要性的度量值是因?yàn)椋喝艚o某個(gè)特征隨機(jī)加入噪聲之后,,袋外的準(zhǔn)確率大幅度降低,,則說明這個(gè)特征對(duì)于樣本的分類結(jié)果影響很大,也就是說它的重要程度比較高,。

連續(xù)型特征重要性

對(duì)于連續(xù)型任務(wù)的特征重要性,,可以使用回歸模型RandomForestRegressorfeature_importances_屬性。

  1. X_1 = dataset[['Open', 'High', 'Low', 'Volume', 
  2.                'Increase_Decrease','Buy_Sell_on_Open',
  3.                'Buy_Sell', 'Returns']]
  4. y_1 = dataset['Adj Close']
  5. # 創(chuàng)建決策樹分類器對(duì)象
  6. clf = RandomForestRegressor(random_state=0, n_jobs=-1)
  7. # 訓(xùn)練模型
  8. model = clf.fit(X_1, y_1)
  9. # 計(jì)算特征重要性
  10. importances = model.feature_importances_
  11. # 按降序排序特性的重要性
  12. indices = np.argsort(importances)[::-1]
  13. # 重新排列特性名稱,,使它們與已排序的特性重要性相匹配
  14. names = [dataset.columns[i] for i in indices]
  15. # 創(chuàng)建畫布
  16. plt.figure(figsize=(10,6))
  17. # 添加標(biāo)題
  18. plt.title("Feature Importance")
  19. # 添加柱狀圖
  20. plt.bar(range(X.shape[1]), importances[indices])
  21. # 為x軸添加特征名
  22. plt.xticks(range(X.shape[1]), names, rotation=90)

分類型特征重要性

當(dāng)該任務(wù)是分類型,,需要用分類型模型時(shí),可以使用RandomForestClassifier中的feature_importances_屬性,。

  1. X2 = dataset[['Open', 'High', 'Low','Adj Close',
  2.               'Volume', 'Buy_Sell_on_Open', 
  3.               'Buy_Sell', 'Returns']]
  4. y2 = dataset['Increase_Decrease']
  5. clf = RandomForestClassifier(random_state=0, n_jobs=-1)
  6. model = clf.fit(X2, y2)
  7. importances = model.feature_importances_
  8. indices = np.argsort(importances)[::-1]
  9. names = [dataset.columns[i] for i in indices]
  10. plt.figure(figsize=(10,6))
  11. plt.title("Feature Importance")
  12. plt.bar(range(X2.shape[1]), importances[indices])
  13. plt.xticks(range(X2.shape[1]), names, rotation=90)
  14. plt.show()

本案例中使用回歸模型

  1. rf = RandomForestRegressor(n_jobs=-1, n_estimators=50, verbose=3)
  2. rf.fit(X,Y)
  3. ranks["RF"] = ranking(rf.feature_importances_, colnames);

下面介紹兩個(gè)頂層特征選擇算法,,之所以叫做頂層,是因?yàn)樗麄兌际墙⒃诨谀P偷奶卣鬟x擇方法基礎(chǔ)之上的,,例如回歸和SVM,,在不同的子集上建立模型,然后匯總最終確定特征得分,。

RandomizedLasso

RandomizedLasso的選擇穩(wěn)定性方法排序,。

穩(wěn)定性選擇是一種基于二次抽樣和選擇算法相結(jié)合較新的方法,選擇算法可以是回歸,、SVM或其他類似的方法,。它的主要思想是在不同的數(shù)據(jù)子集和特征子集上運(yùn)行特征選擇算法,不斷的重復(fù),,最終匯總特征選擇結(jié)果,,比如可以統(tǒng)計(jì)某個(gè)特征被認(rèn)為是重要特征的頻率(被選為重要特征的次數(shù)除以它所在的子集被測(cè)試的次數(shù)),。理想情況下,重要特征的得分會(huì)接近100%,。稍微弱一點(diǎn)的特征得分會(huì)是非0的數(shù),,而最無用的特征得分將會(huì)接近于0。

  1. lambda_grid = np.linspace(0.001, 0.5, num=100)
  2. rlasso = RandomizedLasso(alpha=0.04)
  3. selector = StabilitySelection(base_estimator=rlasso, lambda_name='alpha',
  4.                               lambda_grid=lambda_grid, threshold=0.9, verbose=1)
  5. selector.fit(X, Y)
  6. # 運(yùn)行隨機(jī)Lasso的選擇穩(wěn)定性方法
  7. ranks["rlasso/Stability"] = ranking(np.abs(selector.stability_scores_.max(axis=1)), colnames)
  8. print('finished')
  1. {'Open': 1.0, 'High': 1.0, 'Low': 0.76,
  2. 'Close': 1.0, 'Adj Close': 0.99, 'Volume': 0.0,
  3. 'H-L': 0.0, 'O-C': 1.0, '3day MA': 1.0,
  4. '10day MA': 0.27, '30day MA': 0.75, 'Std_dev': 0.0}
  5. finished

穩(wěn)定性得分可視化

  1. fig, ax = plot_stability_path(selector)
  2. fig.set_size_inches(15,6)
  3. fig.show()

查看得分超過閾值的變量索引及其得分

  1. # 獲取所選特征的掩碼或整數(shù)索引
  2. selected_variables = selector.get_support(indices=True)
  3. selected_scores = selector.stability_scores_.max(axis=1)
  4. print('Selected variables are:')
  5. print('-----------------------')
  6. for idx, (variable, score) in enumerate(
  7.                 zip(selected_variables, 
  8.                     selected_scores[selected_variables])):
  9.     print('Variable %d: [%d], 
  10.           score %.3f' % (idx + 1, variable, score))
  1. Selected variables are:
  2. -----------------------
  3. Variable 1: [0], score 1.000
  4. Variable 2: [1], score 1.000
  5. Variable 3: [3], score 1.000
  6. Variable 4: [4], score 0.990
  7. Variable 5: [7], score 1.000
  8. Variable 6: [8], score 1.000

RFE遞歸特征消除特征排序

基于遞歸特征消除的特征排序,。

給定一個(gè)給特征賦權(quán)的外部評(píng)估器(如線性模型的系數(shù)),,遞歸特征消除(RFE)的目標(biāo)是通過遞歸地考慮越來越小的特征集來選擇特征。

主要思想是反復(fù)的構(gòu)建模型(如SVM或者回歸模型)然后選出最好的(或者最差的)的特征(可以根據(jù)系數(shù)來選),。

  1. 首先,,在初始特征集上訓(xùn)練評(píng)估器,并通過任何特定屬性或可調(diào)用屬性來獲得每個(gè)特征的重要性,。

  2. 然后,,從當(dāng)前的特征集合中剔除最不重要的特征。

  3. 這個(gè)過程在訓(xùn)練集上遞歸地重復(fù),,直到最終達(dá)到需要選擇的特征數(shù),。

這個(gè)過程中特征被消除的次序就是特征的排序。因此,,這是一種尋找最優(yōu)特征子集的貪心算法,。

RFE的穩(wěn)定性很大程度上取決于在迭代的時(shí)候底層用哪種模型。例如,,假如RFE采用的普通的回歸,,沒有經(jīng)過正則化的回歸是不穩(wěn)定的,那么RFE就是不穩(wěn)定的,;假如采用的是Ridge,,而用Ridge正則化的回歸是穩(wěn)定的,那么RFE就是穩(wěn)定的,。

  1. sklearn.feature_selection.RFE(estimator,
  2.         *, n_features_to_select=None,
  3.         step=1, verbose=0, 
  4.         importance_getter='auto')

estimator Estimator instance
一種帶有""擬合""方法的監(jiān)督學(xué)評(píng)估器,它提供關(guān)于特征重要性的信息(例如"coef_",、"feature_importances_"),。

n_features_to_select int or float, default=None
要選擇的功能的數(shù)量。如果'None',,則選擇一半的特性,。如果為整數(shù),則該參數(shù)為要選擇的特征的絕對(duì)數(shù)量,。如果浮點(diǎn)數(shù)在0和1之間,,則表示要選擇的特征的分?jǐn)?shù)。

step int or float, default=1
如果大于或等于1,,那么'step'對(duì)應(yīng)于每次迭代要?jiǎng)h除的(整數(shù))特征數(shù),。如果在(0.0,1.0)范圍內(nèi),,則'step'對(duì)應(yīng)于每次迭代中要?jiǎng)h除的特性的百分比(向下舍入)。

verbose int, default=0
控制輸出的冗長(zhǎng),。

importance_getter str or callable, default='auto'
如果是'auto',,則通過估計(jì)器的'coef_'或'feature_importances_'屬性使用特征重要性。

  1. lr = LinearRegression(normalize=True)
  2. lr.fit(X,Y)
  3. # 當(dāng)且僅當(dāng)剩下最后一個(gè)特性時(shí)停止搜索
  4. rfe = RFE(lr, n_features_to_select=1, verbose =3)
  5. rfe.fit(X,Y)
  6. ranks["RFE"] = ranking(list(map(float, rfe.ranking_)),
  7.                        colnames, order=-1)
  1. Fitting estimator with 12 features.
  2. ...
  3. Fitting estimator with 2 features.

RFECV

遞歸特征消除交叉驗(yàn)證,。

Sklearn提供了 RFE 包,,可以用于特征消除,還提供了 RFECV ,,可以通過交叉驗(yàn)證來對(duì)的特征進(jìn)行排序,。

  1. # 實(shí)例化估計(jì)器和特征選擇器
  2. svr_mod = SVR(kernel="linear")
  3. rfecv = RFECV(svr_mod, cv=5)
  4. # 訓(xùn)練模型
  5. rfecv.fit(X, Y)
  6. ranks["RFECV"] = ranking(list(map(float, rfecv.ranking_)), colnames, order=-1)
  7. # Print support and ranking
  8. print(rfecv.support_)
  9. print(rfecv.ranking_)
  10. print(X.columns)

LarsCV

最小角度回歸模型(Least Angle Regression)交叉驗(yàn)證。

  1. # 刪除第二步中不重要的特征
  2. # X = X.drop('sex', axis=1)
  3. # 實(shí)例化
  4. larscv = LarsCV(cv=5, normalize=False)
  5. # 訓(xùn)練模型
  6. larscv.fit(X, Y)
  7. ranks["LarsCV"] = ranking(list(map(float, larscv.ranking_)), colnames, order=-1)
  8. # 輸出r方和估計(jì)alpha值
  9. print(larscv.score(X, Y))
  10. print(larscv.alpha_)

以上是兩個(gè)交叉驗(yàn)證,,在對(duì)特征重要性要求高時(shí)可以使用,。因運(yùn)行時(shí)間有點(diǎn)長(zhǎng),這里大家可以自行運(yùn)行得到結(jié)果,。

創(chuàng)建特征排序矩陣

創(chuàng)建一個(gè)空字典來存儲(chǔ)所有分?jǐn)?shù),,并求其平均值。

  1. r = {}
  2. for name in colnames:
  3.     r[name] = round(np.mean([ranks[method][name] 
  4.                              for method in ranks.keys()]), 2)
  5. methods = sorted(ranks.keys())
  6. ranks["Mean"] = r
  7. methods.append("Mean")
  8. print("\t%s" % "\t".join(methods))
  9. for name in colnames:
  10.     print("%s\t%s" % (name, "\t".join(map(str, 
  11.                          [ranks[method][name] for method in methods]))))
  1. Lasso LinReg RF RFE Ridge rlasso/Stability Mean
  2. Open 1.0 1.0 0.02 0.91 0.47 1.0 0.73
  3. High 0.14 0.0 0.1 0.36 0.06 1.0 0.28
  4. Low 0.02 0.0 0.08 0.73 0.05 0.76 0.27
  5. Close 0.14 0.0 0.64 0.55 0.32 1.0 0.44
  6. Adj Close 0.02 1.0 1.0 0.82 1.0 0.99 0.8
  7. Volume 0.0 0.0 0.0 0.0 0.0 0.0 0.0
  8. H-L 0.0 0.0 0.0 0.45 0.01 0.0 0.08
  9. O-C 0.85 1.0 0.0 1.0 0.53 1.0 0.73
  10. 3day MA 0.0 0.0 0.0 0.27 0.01 1.0 0.21
  11. 10day MA 0.0 0.0 0.02 0.09 0.0 0.27 0.06
  12. 30day MA 0.0 0.0 0.0 0.18 0.0 0.75 0.16
  13. Std_dev 0.0 0.0 0.0 0.64 0.01 0.0 0.11

繪制特征重要性排序圖

將平均得到創(chuàng)建DataFrame數(shù)據(jù)框,,從高到低排序,,并利用可視化方法將結(jié)果展示出。這樣就一目了然,,每個(gè)特征重要性大小,。

  1. meanplot = pd.DataFrame(list(r.items()), columns= ['Feature','Mean Ranking'])
  2. # 排序
  3. meanplot = meanplot.sort_values('Mean Ranking', ascending=False)
  4. g=sns.factorplot(x="Mean Ranking", y="Feature", data = meanplot, kind="bar", 
  5.                size=14, aspect=1.9, palette='coolwarm')

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多