日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

自己动手写一个印钞机 第二章

發布時間:2025/3/21 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自己动手写一个印钞机 第二章 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

作者:阿布?

未經本人允許禁止轉載

ipython notebook git版本

目錄章節地址: 自己動手寫一個印鈔機 第一章 自己動手寫一個印鈔機 第二章 自己動手寫一個印鈔機 第三章 自己動手寫一個印鈔機 第四章 自己動手寫一個印鈔機 第五章 自己動手寫一個印鈔機 第六章 自己動手寫一個印鈔機 第七章

簡書目錄章節地址: 自己動手寫一個印鈔機 第一章 自己動手寫一個印鈔機 第二章 自己動手寫一個印鈔機 第三章 自己動手寫一個印鈔機 第四章 自己動手寫一個印鈔機 第五章 自己動手寫一個印鈔機 第六章 自己動手寫一個印鈔機 第七章 自己動手寫一個印鈔機 附錄章

股票量化專題地址,請關注,謝謝!


非均衡勝負收益帶來的必然非均衡勝負比例,目標由因子的能力解決一部分,模式識別提升關鍵的一部分

本章開始說文章的核心了,模式識別提升關鍵的一部分?本章的內容主要是通過機器學習如svm,隨機森林等對stock模式識別的初步探索,俗稱罪惡的第一步,但還是要堅定的賣出,畢竟目標是印鈔機

下面運行因子對多年數據進行回測,模式識別中基本的需求就是生成訓練集數據與測試集數據,對訓練集的數據抽取特質,總結規律,在測試集上指導交易,與沒有指導交易的測試集進行比對,查看效果。

BuyGoldenFactor.g_enable_filter_ml = True # 回測因子的歷史且結果集加入機器學習需要的數據 BuyGoldenFactor.g_enable_snap = True # 生成交易這一時刻60日圖像,為深度學習準備, 詳情見第四章 buy_factors = [{'XD': 42, 'class': BuyGoldenFactorClass, 'draw': True}]# n_folds: 6年數據回測生成五年單子 # train_test_split:回測時預留一份stock代碼表作為測試集,生成9份訓練集,當use_last_test為True 時只用一份測試stock代碼表進行因子回測 # ret_cnt_need = 0:回測所有stock out, orders_pd_train_snap = MetricsManger.make_metrics_rsc_mul_symbol_grid(buy_factors, n_folds=6, score_type=METRICSTYPE.SYSMBOL_R_SCORES_GOLDEN.value, ret_cnt_need=0, train_test_split=True, use_last_test=False, force_one_process=False)pd.options.display.max_columns = 40 orders_pd_train_snap.tail(2) # 看看添加了提供機器學習數據的pandas

由于簡書不支持html的表格,完整表格請查閱git上完整版ipython notebook


這些特征都是什么比如deg_windowPd就是買入stock這一天前42天k線圖的線性擬合斜率,deg_hisWindowPd是252天k線圖的線性擬合斜率,它們代表了買入前stock的一種狀態也就能代表一種特征,你可以理解為這些特征都是發生交易前的一些狀態的量化值特征,暫時沒有必要全部深入了解,知道是特征就行。

下面生成測試集數據

BuyGoldenFactor.g_enable_fiter = False BuyGoldenFactor.g_enable_snap = True buy_factors = [{'XD': 42, 'class': BuyGoldenFactorClass, 'draw': True}] out, orders_pd_test = MetricsManger.make_metrics_rsc_mul_symbol_grid(buy_factors, n_folds=6, score_type=METRICSTYPE.SYSMBOL_R_SCORES_GOLDEN.value, ret_cnt_need=0, train_test_split=False, use_last_test=True, force_one_process=False)
orders_pd_train_snap.shape, orders_pd_test_snap.shape# out((44412, 32), (4956, 32))

對訓練集及測試集的結果進行大體的度量:主要就是看看非均衡勝負收益帶來的必然非均衡勝負比例,目標由因子的能力解決一部分效果怎么樣

train_ump = UmpMainClass(orders_pd_train_snap, MlFiterGoldenPdClass) train_ump.show_general()# outall fit order = (41225, 32)win rate = 0.493559733172profit_cg.sum() = 281.687935222win mean = 0.0770327160087 loss_mean = -0.061738192442

test_ump = UmpMainClass(orders_pd_test_snap, MlFiterGoldenPdClass) test_ump.show_general()# outall fit order = (4612, 32)win rate = 0.5profit_cg.sum() = 37.4002795407win mean = 0.076550446692 loss_mean = -0.0605681543452

顯示在所有有結果的單子中勝率可以接近一半,且每次贏的0.07比沒次輸的0.06多, 但是貪婪的我仍然認為有優化空間,這個空間就是利用這個因子產生的輸出數據 作為特征識別基礎,提煉特征,指導交易,

模式識別提升關鍵的一部分

下面我們看看如何做到的呢

首先確認ml封裝庫是否能正常運行

test_fiter_more = MlFiterClass.create_test_more_fiter()

學習曲線

test_fiter_more.estimator.logistic_regression() test_fiter_more.plot_learning_curve()

特征權重

test_fiter.importances_coef_pd()

樹邏輯圖

test_fiter.plot_graphviz_tree()

混淆矩陣

test_fiter_more.plot_confusion_matrices()# out[[453 96][100 242]]

roc

test_fiter_more.plot_roc_estimator()

特征選擇

test_fiter_more.feature_selection()# outRFE selectionranking supportSibSp 1 TrueParch 1 TrueCabin_No 1 TrueCabin_Yes 6 FalseEmbarked_C 2 FalseEmbarked_Q 5 FalseEmbarked_S 3 FalseSex_female 8 FalseSex_male 1 TruePclass_1 4 FalsePclass_2 7 FalsePclass_3 1 TrueAge_scaled 1 TrueFare_scaled 1 TrueRFECV selectionranking supportSibSp 1 TrueParch 2 FalseCabin_No 1 TrueCabin_Yes 7 FalseEmbarked_C 3 FalseEmbarked_Q 8 FalseEmbarked_S 4 FalseSex_female 1 TrueSex_male 9 FalsePclass_1 5 FalsePclass_2 6 FalsePclass_3 1 TrueAge_scaled 1 TrueFare_scaled 1 True

決策邊界

test_fiter.plot_decision_function()

train test score

test_fiter_more.cross_val_accuracy_score()# outaccuracy mean: 0.776812507093array([ 0.75555556, 0.72222222, 0.73033708, 0.75280899, 0.83146067,0.78651685, 0.80898876, 0.71910112, 0.82022472, 0.84090909])

切換使用其它學習方法

test_fiter_more.estimator.adaboost_classifier() test_fiter_more.cross_val_accuracy_score()# outaccuracy mean: 0.810433548973array([ 0.78888889, 0.78888889, 0.78651685, 0.80898876, 0.84269663,0.78651685, 0.82022472, 0.82022472, 0.79775281, 0.86363636])

可以證明封裝庫沒有問題,可以放心使用,下一步上真正的stock數據

由252,60, 42天組成的走勢數劇作為特質開始

from MlFiterDegPd import MlFiterDegPdClass deg = MlFiterDegPdClass(orderPd=orders_pd_train_snap) deg.df.head()

deg().estimator.svc() deg().cross_val_accuracy_score()# outaccuracy mean: 0.491279520472array([ 0.48920689, 0.51758428, 0.49987873, 0.49551298, 0.48168809,0.4887218 , 0.47610963, 0.47355653, 0.4853191 , 0.50521718])

0.49的準確率,相當于是亂猜 是不是特征選擇的不好呢,換一些特征試試

from MlFiterMainPd import MlFiterMainPdClass main = MlFiterMainPdClass(orderPd=orders_pd_train_snap) main.df.head()

main().cross_val_accuracy_score()# outaccuracy mean: 0.493608245706array([ 0.5008489 , 0.49890856, 0.49793839, 0.48678147, 0.50303177,0.47125879, 0.49648314, 0.49369238, 0.49332686, 0.49381218])

0.49的準確率,還是亂猜 是不是特征太少了,構建一個特征多的試試

from MlFiter import MlFiterClass order_has_ret = orders_pd_train_snap[(orders_pd_train_snap.result <> 0)]all_pd = order_has_ret.filter(['result', 'deg_hisWindowPd', 'deg_windowPd', 'deg_60WindowPd', 'atr_std', 'jump_power', 'diff_days', 'wave_score1', 'wave_score2', 'wave_score23']) train_np = all_pd.as_matrix() y = train_np[:, 0] x = train_np[:, 1:] all_filter = MlFiterClass(x, y, all_pd) all_pd.head()

# 這回使用隨機森林 all_filter.estimator.random_forest_classifier() all_filter.cross_val_accuracy_score()# outaccuracy mean: 0.505349477658array([ 0.48678147, 0.50788261, 0.53019646, 0.50497211, 0.51297599,0.46058695, 0.51564395, 0.50994663, 0.4942975 , 0.53021111])

0.50的準確率,這算是有所提升嗎??

下面把數據離散化后,換種分類器測試

deg = MlFiterDegPdClass(orderPd=orders_pd_train_snap, dummies=True, invoke_hmm=False,invoke_pca=False) deg.df.head()

由于簡書不支持html的表格,完整表格請查閱git上完整版ipython notebook


上邊封住好了的,在離散值的選擇上不是瞎來的,會通過可視化來選擇離散值bins,通過數據來指導數據最終指導交易

deg().estimator.random_forest_classifier() deg().cross_val_accuracy_score()# outaccuracy mean: 0.487590577522array([ 0.48217317, 0.51564395, 0.4962406 , 0.49890856, 0.49745331,0.48338588, 0.49527043, 0.45414847, 0.44479495, 0.50788644])

結果還是亂猜

用其它等等方式仍然是胡猜,自己寫的類似adaboost依然效果很差, 通過非均衡概率降低假陽,提高假陰的方式,最后統計所有測試集樣本的判別概率發現其實還瞎猜

提高分類數量,設置閥值,提高準確率的方案

通過將profit cg qcut 100份分類

orders_pd_train_snap.profit_cg.fillna(0, inplace=True) order_has_ret = orders_pd_train_snap[(orders_pd_train_snap.result <> 0)] n_class = 100 order_has_ret['class'] = pd.qcut(order_has_ret.profit_cg, n_class, labels=range(0, n_class)) order_has_ret['class'] = order_has_ret['class'].astype(int) ZLog.info(np.unique(order_has_ret['class']))deg_pd = order_has_ret.filter(['class', 'result', 'deg_hisWindowPd', 'deg_windowPd', 'deg_60WindowPd']) train_np = deg_pd.as_matrix() y = train_np[:, 0] x = train_np[:, 1:] deg = MlFiterClass(x, y, deg_pd, force_clf=True) deg_pd.head()

  • y為class train_test_split進行分類

  • 使用cv數據集的 predict < class閥值 使用result==0的情況查看概率

    from sklearn.cross_validation import train_test_split from sklearn.metrics import accuracy_score from sklearn.metrics import classification_report

    deg.estimator.random_forest_classifier()

    train_df, cv_df = train_test_split(deg.df, test_size=0.1, random_state=0)

    fiter = deg.get_fiter() fiter.fit(train_df.as_matrix()[:, 2:], train_df.as_matrix()[:, 0])

    predictions = fiter.predict(cv_df.as_matrix()[:, 2:])

    cv_df['predict'] = predictions cv_df.head()

cv_df['predict'].value_counts().sort_index().head(10)# out0.0 561.0 502.0 433.0 474.0 445.0 456.0 477.0 308.0 469.0 39Name: predict, dtype: int64
for threshold in np.arange(0, 10):ppv = cv_df[cv_df['predict'] <= threshold].result.value_counts()ZLog.info('threshold: {}, ppv: {}'.format(threshold, float(ppv[-1])/ppv.sum()))# outthreshold: 0, ppv: 0.607142857143threshold: 1, ppv: 0.632075471698threshold: 2, ppv: 0.58389261745threshold: 3, ppv: 0.586734693878threshold: 4, ppv: 0.579166666667threshold: 5, ppv: 0.571929824561threshold: 6, ppv: 0.551204819277threshold: 7, ppv: 0.541436464088threshold: 8, ppv: 0.526960784314threshold: 9, ppv: 0.523489932886

threshold: 0,1,達到0.6了 但是數量上只有100多個,之后會有使用gmm-hmm的方式繼續擴展這種思路,提高收益

只能說最后一種的這個思想可以作為擴展使用,實際中由于 '非均衡勝負收益' 很難帶來質的好轉,突然想到阿西莫夫的小說基地,對心理史學的最開始的評估,‘可能但是不可行’,我們的印鈔機之路是否也是這樣呢,下一章開始就是真正的印鈔機之路了,一個即可能又可行之路!!! 下一章開始將使用深度學習方法來訓練數據,提高勝率主要是卷機神經網絡的使用


下一章地址 自己動手寫一個印鈔機 第三章


感謝?您能有耐心看到這里

如果有什么問題可以加阿布的微信

微信號:aaaabbbuu

轉載于:https://my.oschina.net/u/577691/blog/776216

總結

以上是生活随笔為你收集整理的自己动手写一个印钞机 第二章的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。