自己动手写一个印钞机 第二章
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()
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
總結
以上是生活随笔為你收集整理的自己动手写一个印钞机 第二章的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS app性能优化的那些事
- 下一篇: JSTL函数标签库 fn标签