器學(xué)習(xí)量化交易實(shí)戰(zhàn):從數(shù)據(jù)清洗到特征工程與建模)
簡(jiǎn)介資源是《4天學(xué)會(huì)Python機(jī)器學(xué)習(xí)與量化交易》系列筆記的第二部分對(duì)應(yīng)視頻教程p16至p20面向正在入門量化投資與Python機(jī)器學(xué)習(xí)的學(xué)習(xí)者。筆記聚焦多因子策略中的市值因子選股結(jié)合RiceQuant在線量化平臺(tái)以滬深300成分股為例介紹如何通過(guò)get_fundamentals等API獲取市值、財(cái)務(wù)等基本面數(shù)據(jù)并利用query函數(shù)按市值排序篩選股票、構(gòu)建并動(dòng)態(tài)調(diào)整個(gè)股組合。內(nèi)容還系統(tǒng)梳理了多因子策略的完整流程——從數(shù)據(jù)獲取、因子計(jì)算、因子篩選到組合構(gòu)建與交易執(zhí)行同時(shí)說(shuō)明因子數(shù)據(jù)中截面數(shù)據(jù)與面板數(shù)據(jù)的區(qū)別。去極值處理是重點(diǎn)模塊分別講解了中位數(shù)去極值、3倍中位數(shù)去極值和3sigma法的原理及代碼實(shí)現(xiàn)并配有p19、p20的具體案例幫助讀者消除極端值對(duì)因子模型的干擾。資源以單個(gè)PDF文件呈現(xiàn)大小僅562KB方便本地閱讀與檢索目前已有1363人學(xué)習(xí)瀏覽適合希望快速上手量化選股與常見(jiàn)因子預(yù)處理方法的初學(xué)者作為筆記型參考。 這是“4天學(xué)會(huì)python機(jī)器學(xué)習(xí)與量化交易”系列筆記的第二篇接著上次的進(jìn)度今天覆蓋p16到p20這5節(jié)課程。上一篇筆記寫(xiě)完了p1~p15那會(huì)兒還處在python基礎(chǔ)語(yǔ)法、numpy和pandas的入門階段代碼寫(xiě)得再多也還是“學(xué)會(huì)了工具但不知道拿來(lái)干嘛”的狀態(tài)。到p16~p20這塊課程節(jié)奏明顯變了開(kāi)始真正進(jìn)入量化交易的數(shù)據(jù)獲取、數(shù)據(jù)處理、特征工程和機(jī)器學(xué)習(xí)建模環(huán)節(jié)算是第一次把python、機(jī)器學(xué)習(xí)和量化交易串在了一條線上。如果你正在跟著這套課學(xué)或者只是想看看“機(jī)器學(xué)習(xí)做量化到底怎么落地”這篇筆記應(yīng)該能幫你省不少事。我不光會(huì)把每節(jié)課的知識(shí)點(diǎn)重新梳理一遍還會(huì)把跑代碼時(shí)遇到的坑、視頻里沒(méi)解釋清楚的細(xì)節(jié)、以及我自己的一些擴(kuò)展思考一并寫(xiě)出來(lái)方便你復(fù)現(xiàn)和避雷。1. p16~p20課程地圖學(xué)習(xí)量化的第一段完整閉環(huán)1.1 五節(jié)課分別講了什么前15節(jié)還在鋪python基礎(chǔ)語(yǔ)法和數(shù)據(jù)分析工具的底子到了p16~p20課程開(kāi)始動(dòng)真格了。我把這幾節(jié)的內(nèi)容做了一張對(duì)照表方便你一目了然地看到整個(gè)節(jié)奏安排視頻主題核心知識(shí)點(diǎn)p16機(jī)器學(xué)習(xí)與量化交易概述機(jī)器學(xué)習(xí)在量化中的應(yīng)用場(chǎng)景、策略類型、整體處理流程p17行情數(shù)據(jù)獲取akshare/tushare等數(shù)據(jù)接口的基本用法、數(shù)據(jù)結(jié)構(gòu)p18數(shù)據(jù)清洗與預(yù)處理列名統(tǒng)一、缺失值處理、數(shù)據(jù)類型轉(zhuǎn)換、時(shí)間索引設(shè)置p19特征工程與標(biāo)簽構(gòu)造常用技術(shù)指標(biāo)計(jì)算、訓(xùn)練樣本構(gòu)造、預(yù)測(cè)目標(biāo)定義p20第一個(gè)機(jī)器學(xué)習(xí)模型線性回歸入門、sklearn建模、訓(xùn)練集測(cè)試集劃分與評(píng)估這五節(jié)課整體看下來(lái)其實(shí)就是在走一條“從數(shù)據(jù)到模型”的產(chǎn)業(yè)鏈先用接口把行情數(shù)據(jù)拿到手然后清洗成能用的標(biāo)準(zhǔn)格式接著從價(jià)格序列中構(gòu)造出特征和預(yù)測(cè)目標(biāo)最后丟給sklearn跑一個(gè)最簡(jiǎn)單的模型。整套流程走完你就算是對(duì)“機(jī)器學(xué)習(xí)做量化”這件事有了一個(gè)全景認(rèn)知——盡管此時(shí)還看不清它的全貌但至少知道了零件長(zhǎng)什么樣、大概怎么裝配。1.2 為什么課程在這個(gè)位置切入機(jī)器學(xué)習(xí)我翻了一下p1~p15的內(nèi)容基本是變量、循環(huán)、函數(shù)、numpy和pandas的基礎(chǔ)操作。如果課程從這會(huì)兒就直接上隨機(jī)森林、神經(jīng)網(wǎng)絡(luò)新手大概率當(dāng)場(chǎng)勸退因?yàn)閿?shù)據(jù)不會(huì)整理、維度對(duì)不上、概念聽(tīng)不懂報(bào)錯(cuò)都看不懂在報(bào)什么。而p16~p20作為過(guò)渡段把“數(shù)據(jù)處理”當(dāng)成了先頭部隊(duì)——這其實(shí)是很符合實(shí)戰(zhàn)節(jié)奏的安排。實(shí)際做量化的朋友應(yīng)該深有體會(huì)真正花時(shí)間的從來(lái)不是模型調(diào)參而是數(shù)據(jù)獲取、清洗、拼接、對(duì)齊這些臟活累活。數(shù)據(jù)質(zhì)量不過(guò)關(guān)后面模型再?gòu)?qiáng)也是“垃圾進(jìn)、垃圾出”。課程把數(shù)據(jù)處理放在建模前面而且是分了兩節(jié)課篇幅來(lái)講這個(gè)比例我是認(rèn)可的。另外線性回歸作為第一個(gè)模型也選得很穩(wěn)它足夠簡(jiǎn)單幾行代碼就能跑完能讓剛接觸機(jī)器學(xué)習(xí)的人先建立起“特征-模型-預(yù)測(cè)-評(píng)估”的完整心智模型而不是一上來(lái)就被復(fù)雜算法的數(shù)學(xué)推導(dǎo)勸退。2. 數(shù)據(jù)獲取別一上來(lái)就調(diào)接口2.1 akshare和tushare到底選哪個(gè)視頻里老師用的是tushare但我實(shí)操下來(lái)發(fā)現(xiàn)tushare的新版接口需要先到官網(wǎng)注冊(cè)申請(qǐng)token部分接口還有積分門檻——不同積分等級(jí)能調(diào)用的數(shù)據(jù)范圍不一樣。對(duì)剛?cè)腴T的朋友來(lái)說(shuō)這是一個(gè)不小的隱形門檻。相比之下akshare不用注冊(cè)、不用token直接pip install akshare裝好就能用接口返回的就是pandas的DataFrame剛好可以順勢(shì)復(fù)習(xí)上一篇筆記里學(xué)的pandas操作。我把兩者做了個(gè)簡(jiǎn)單對(duì)比對(duì)比項(xiàng)aksharetushare是否需要token不需要需要注冊(cè)申請(qǐng)上手難度較低中等數(shù)據(jù)來(lái)源聚合公開(kāi)網(wǎng)頁(yè)數(shù)據(jù)自建數(shù)據(jù)倉(cāng)庫(kù)適合場(chǎng)景個(gè)人學(xué)習(xí)、快速驗(yàn)證想對(duì)數(shù)據(jù)穩(wěn)定性要求更高的場(chǎng)景當(dāng)然這只是我基于個(gè)人學(xué)習(xí)體驗(yàn)做的對(duì)比不是要分個(gè)高下。數(shù)據(jù)源沒(méi)有絕對(duì)的優(yōu)劣只有合不合適。如果你想快速驗(yàn)證一個(gè)想法、跑通一套流程akshare足夠如果后續(xù)要做更正式的量化項(xiàng)目再去研究tushare的積分體系也不遲。2.2 一個(gè)能跑的取數(shù)demo以獲取貴州茅臺(tái)的歷史日線數(shù)據(jù)為例用akshare只需要幾行代碼import akshare as ak # 獲取貴州茅臺(tái)歷史日線數(shù)據(jù)不復(fù)權(quán) df ak.stock_zh_a_hist( symbol600519, perioddaily, start_date20200101, end_date20241231, adjust ) print(df.head()) print(df.tail())第一次跑通這個(gè)接口時(shí)我還是有點(diǎn)興奮的——畢竟這是第一次真正“親手”把真實(shí)行情數(shù)據(jù)拉到本地。但興奮勁很快就過(guò)去了因?yàn)榫o接著就會(huì)發(fā)現(xiàn)一個(gè)讓人頭疼的問(wèn)題返回的DataFrame列名是中文的而且包含了不少我們暫時(shí)用不上的字段比如振幅、漲跌幅、換手率等。2.3 清洗從“能跑”到“能用”如果只是打印出來(lái)看看那確實(shí)不需要額外處理。但要喂給機(jī)器學(xué)習(xí)模型就得先把數(shù)據(jù)整理成統(tǒng)一格式。這一步?jīng)]什么高深技術(shù)主要就是四件事列名改英文、日期轉(zhuǎn)成datetime類型、把日期設(shè)為索引、按時(shí)間排序。我當(dāng)時(shí)的清洗代碼如下import pandas as pd # 統(tǒng)一列名只保留后續(xù)用得上的字段 df.columns [date, open, close, high, low, volume, amount, amplitude, pct_change, change, turnover] # 日期轉(zhuǎn)datetime并設(shè)為索引按時(shí)間正序排列 df[date] pd.to_datetime(df[date]) df df.set_index(date).sort_index() # 只保留建模需要的列 df df[[open, close, high, low, volume]] # 檢查缺失值 print(df.isnull().sum())這里有兩個(gè)細(xì)節(jié)值得多說(shuō)一句。第一sort_index()一定要做因?yàn)橛行?shù)據(jù)源返回的順序可能不是嚴(yán)格按時(shí)間排的而后續(xù)計(jì)算移動(dòng)平均線依賴數(shù)據(jù)的先后順序一旦順序亂了指標(biāo)就全是錯(cuò)的。第二改列名時(shí)不要只圖省事直接照抄建議提前想好你后面建模到底需要哪些字段把多余的列盡早砍掉數(shù)據(jù)干凈了后續(xù)的排查成本會(huì)低很多。3. 特征工程機(jī)器學(xué)習(xí)里的“吃雞裝備”3.1 為什么需要特征工程如果只把原始價(jià)格喂給模型相當(dāng)于讓一個(gè)沒(méi)帶裝備的新人直接跳傘到?jīng)Q賽圈——他肉眼看到的只有紅紅綠綠的K線很難從中歸納出規(guī)律。特征工程就是給這個(gè)新人配上倍鏡、防彈衣和醫(yī)療包讓模型從同樣的數(shù)據(jù)里看到更有區(qū)分度的信息。具體到量化場(chǎng)景移動(dòng)平均線、RSI、布林帶這些經(jīng)典技術(shù)指標(biāo)本質(zhì)上就是對(duì)原始價(jià)格序列做了一次加工和壓縮把“最近一段時(shí)間的趨勢(shì)強(qiáng)弱”這類信息顯式地暴露給模型。這一步做得好不好直接決定模型能力的上限。很多初學(xué)者喜歡把時(shí)間花在調(diào)模型超參數(shù)上但實(shí)戰(zhàn)經(jīng)驗(yàn)是特征工程對(duì)效果的提升往往比調(diào)參來(lái)得更明顯。3.2 用pandas計(jì)算常見(jiàn)技術(shù)指標(biāo)這里我用pandas把幾個(gè)出場(chǎng)率最高的指標(biāo)都算了一遍# 移動(dòng)平均線 df[ma5] df[close].rolling(window5).mean() df[ma10] df[close].rolling(window10).mean() df[ma20] df[close].rolling(window20).mean() # RSI指標(biāo) delta df[close].diff() gain delta.clip(lower0) loss -delta.clip(upper0) avg_gain gain.rolling(window14).mean() avg_loss loss.rolling(window14).mean() rs avg_gain / avg_loss df[rsi] 100 - (100 / (1 rs)) # 布林帶 df[std20] df[close].rolling(window20).std() df[boll_upper] df[ma20] 2 * df[std20] df[boll_lower] df[ma20] - 2 * df[std20] # 把剛開(kāi)始計(jì)算產(chǎn)生的NaN丟棄 df df.dropna()先解釋一下rolling(window5).mean()到底做了什么它相當(dāng)于開(kāi)了一個(gè)長(zhǎng)度為5的滑窗從數(shù)據(jù)第一行開(kāi)始往后滑動(dòng)每滑到一行就取包括自己在內(nèi)的前5行求平均這個(gè)值和這一行綁定在一起。所以ma5這一列的第10行表示第6到第10天的收盤價(jià)均值。窗口越短指標(biāo)對(duì)價(jià)格反應(yīng)越靈敏但也越容易產(chǎn)生噪音窗口越長(zhǎng)趨勢(shì)越平滑但滯后越嚴(yán)重。這個(gè)“靈敏與滯后”的權(quán)衡幾乎貫穿所有技術(shù)指標(biāo)的設(shè)計(jì)邏輯。RSI的公式看起來(lái)有點(diǎn)唬人其實(shí)就是計(jì)算一段時(shí)間內(nèi)“漲的力量”在總波動(dòng)中的占比取值在0到100之間。通常認(rèn)為RSI高于70進(jìn)入超買區(qū)、低于30進(jìn)入超賣區(qū)但學(xué)習(xí)階段先不用糾結(jié)閾值怎么選而是要把“它是在衡量什么”想明白——衡量的是最近漲跌力量的對(duì)比。3.3 標(biāo)簽構(gòu)造你到底要預(yù)測(cè)什么特征有了接下來(lái)最重要的問(wèn)題是模型的y是什么機(jī)器學(xué)習(xí)本質(zhì)上是找x到y(tǒng)的映射關(guān)系在量化場(chǎng)景里最常見(jiàn)的一個(gè)做法是把“明天的收盤價(jià)比今天高不高”定義為一個(gè)分類問(wèn)題明天漲記作1跌記作0。# 用明天的收盤價(jià)是否高于今天作為預(yù)測(cè)目標(biāo) df[target] (df[close].shift(-1) df[close]).astype(int) df df.dropna()這一行代碼可以說(shuō)是整個(gè)p16~p20里最容易被忽視、但最值得停下來(lái)想明白的地方。shift(-1)的作用是把整列數(shù)據(jù)向上平移一行——讓第t行的target值等于第t1天的收盤價(jià)與第t天收盤價(jià)的比較結(jié)果。為什么要這么干因?yàn)槲覀兘裉炷苣玫降乃刑卣鱩a5、rsi、布林帶等都是基于截至今天的歷史數(shù)據(jù)計(jì)算出來(lái)的我們想要預(yù)測(cè)的是明天會(huì)發(fā)生什么所以標(biāo)簽必須來(lái)自未來(lái)一天的信息。如果不做shift直接用當(dāng)天的close去構(gòu)造target模型就是在拿今天的特征預(yù)測(cè)今天已經(jīng)發(fā)生的事——這就不叫預(yù)測(cè)了叫“事后諸葛亮”。這也是量化里經(jīng)常提到的“未來(lái)函數(shù)”問(wèn)題后面踩坑部分我會(huì)專門展開(kāi)說(shuō)。4. 第一個(gè)模型線性回歸其實(shí)暴露了很多問(wèn)題4.1 為什么選線性回歸而不是別的p20一口氣把線性回歸的建模、訓(xùn)練、評(píng)估流程走完了。這里選線性回歸而不是邏輯回歸或者決策樹(shù)我覺(jué)得有三個(gè)原因簡(jiǎn)單、可解釋、跑得快。線性回歸的預(yù)測(cè)結(jié)果本質(zhì)上是對(duì)所有特征做了一次加權(quán)求和公式就是y w1x1 w2x2 ... b配合sklearn大概五行代碼就能訓(xùn)練完。對(duì)于剛接觸機(jī)器學(xué)習(xí)的同學(xué)重要的不是模型多高級(jí)而是先把“fit-predict-evaluate”這條流水線走通。當(dāng)然線性回歸本身是回歸模型輸出的是連續(xù)值而我們構(gòu)造的target是0和1的分類標(biāo)簽。課程這里直接用“預(yù)測(cè)值大于0.5就判定為漲”的方式把回歸結(jié)果硬掰成分類結(jié)果。嚴(yán)格來(lái)說(shuō)更標(biāo)準(zhǔn)的做法是用邏輯回歸LogisticRegression它對(duì)分類問(wèn)題的建模方式更合理。但作為啟蒙演示線性回歸夠用了它能把“訓(xùn)練一套模型”的流程感建立起來(lái)邏輯回歸的數(shù)學(xué)細(xì)節(jié)留到后面再深入反而是更平滑的學(xué)習(xí)曲線。4.2 時(shí)間序列數(shù)據(jù)不能隨機(jī)切分很多第一次跑機(jī)器學(xué)習(xí)的人會(huì)習(xí)慣性地直接調(diào)用train_test_split()把數(shù)據(jù)隨機(jī)切成訓(xùn)練集和測(cè)試集。但在量化場(chǎng)景里這個(gè)做法有嚴(yán)重問(wèn)題時(shí)間序列數(shù)據(jù)有先后依賴關(guān)系隨機(jī)切分等于讓模型“看了未來(lái)再做過(guò)去題”測(cè)試集里混入了未來(lái)信息評(píng)估結(jié)果會(huì)虛高得非常離譜。正確做法是按時(shí)間順序用前80%的數(shù)據(jù)訓(xùn)練、后20%的數(shù)據(jù)測(cè)試from sklearn.linear_model import LinearRegression from sklearn.metrics import classification_report # 特征列 feature_cols [ma5, ma10, ma20, rsi, boll_upper, boll_lower] X df[feature_cols].values y df[target].values # 按時(shí)間切分前80%訓(xùn)練后20%測(cè)試 split_idx int(len(X) * 0.8) X_train, X_test X[:split_idx], X[split_idx:] y_train, y_test y[:split_idx], y[split_idx:] # 訓(xùn)練線性回歸模型 model LinearRegression() model.fit(X_train, y_train) # 預(yù)測(cè)并將連續(xù)值轉(zhuǎn)換為0/1 y_pred (model.predict(X_test) 0.5).astype(int) # 輸出評(píng)估報(bào)告 print(classification_report(y_test, y_pred))這里還有個(gè)容易踩的雷特征x和標(biāo)簽y必須嚴(yán)格對(duì)齊。如果特征計(jì)算完dropna之后又單獨(dú)對(duì)y做了一次dropna行數(shù)就對(duì)不上了后面的fit會(huì)直接報(bào)錯(cuò)。我當(dāng)時(shí)就犯過(guò)這個(gè)錯(cuò)來(lái)回對(duì)了好幾遍索引才發(fā)現(xiàn)是行數(shù)不一致。建議習(xí)慣性看一眼X.shape和y.shape是不是一致。4.3 評(píng)估結(jié)果怎么看以及為什么賺錢沒(méi)那么容易classification_report會(huì)輸出precision、recall、f1-score這些指標(biāo)。第一次看到這份報(bào)告的時(shí)候我的準(zhǔn)確率大概在53%左右比瞎猜的50%強(qiáng)了一點(diǎn)點(diǎn)但遠(yuǎn)談不上“找到了財(cái)富密碼”。這里多說(shuō)一句很多新手容易盯住準(zhǔn)確率不放但漲跌分類有一個(gè)天然的不平衡問(wèn)題如果市場(chǎng)整體上漲天數(shù)略多模型什么都不做、全部預(yù)測(cè)“漲”也能拿到一個(gè)還不錯(cuò)的準(zhǔn)確率。所以真正要看的其實(shí)是precision、recall和f1-score的組合尤其對(duì)“漲”這個(gè)類別單獨(dú)看。更扎心的是即便模型準(zhǔn)確率做到了52%在真實(shí)交易里還要扣掉手續(xù)費(fèi)、滑點(diǎn)這些交易成本52%的勝率扣完成本很可能根本不賺錢。機(jī)器學(xué)習(xí)在量化里的作用不是“點(diǎn)石成金”而是幫你從大量數(shù)據(jù)里找出統(tǒng)計(jì)意義上的規(guī)律再把規(guī)律包裝成策略去執(zhí)行。離“穩(wěn)定盈利”中間還隔著一個(gè)完整的交易系統(tǒng)——倉(cāng)控、止損、資金管理、回撤控制這些一個(gè)都不能少。p16~p20只是把機(jī)器學(xué)習(xí)模型的輪子轉(zhuǎn)了起來(lái)離“上路”還遠(yuǎn)。5. 踩坑記錄這些坑比課程本身更有學(xué)習(xí)價(jià)值5.1 未來(lái)函數(shù)看似90%準(zhǔn)確率的假象我在自己動(dòng)手復(fù)現(xiàn)時(shí)曾經(jīng)寫(xiě)出了這樣一段錯(cuò)誤的標(biāo)簽構(gòu)造代碼# 錯(cuò)誤示范 df[target] (df[close] df[close].shift(1)).astype(int)看起來(lái)好像沒(méi)什么問(wèn)題就是把“今天比昨天漲沒(méi)漲”作為標(biāo)簽。問(wèn)題出在特征里ma5、ma10、ma20這些指標(biāo)都包含了當(dāng)天的收盤價(jià)信息而target又是由當(dāng)天收盤價(jià)和昨天收盤價(jià)的比較得到的。模型訓(xùn)練時(shí)特征和標(biāo)簽共享了同一個(gè)“今天的收盤價(jià)”相當(dāng)于考試時(shí)答案就壓在卷子底下——測(cè)試集準(zhǔn)確率沖到了90%以上我還以為自己發(fā)現(xiàn)了什么不得了的規(guī)律后來(lái)對(duì)照課程才發(fā)現(xiàn)標(biāo)簽構(gòu)造邏輯搞反了方向。應(yīng)該用close.shift(-1)制造“明天”的信息而不是用close.shift(1)去提取“昨天”的信息。這類未來(lái)函數(shù)問(wèn)題是量化新手最容易踩的坑錯(cuò)誤代碼跑出來(lái)的評(píng)估結(jié)果越漂亮越要警惕數(shù)據(jù)里是不是藏著未來(lái)。5.2 除權(quán)除息會(huì)把股價(jià)“打出一個(gè)坑”取數(shù)時(shí)還有一個(gè)很容易被忽視的細(xì)節(jié)默認(rèn)參數(shù)獲取的往往是“不復(fù)權(quán)”數(shù)據(jù)。一旦股票在某一天除權(quán)除息價(jià)格會(huì)突然向下跳空一大截但跳空之前的歷史價(jià)格沒(méi)有做調(diào)整。這時(shí)候計(jì)算均線、RSI等指標(biāo)就會(huì)在除權(quán)日附近出現(xiàn)假信號(hào)——模型會(huì)以為股價(jià)暴跌了但其實(shí)只是分紅除權(quán)導(dǎo)致的價(jià)格修正。解決辦法很簡(jiǎn)單把取數(shù)接口的adjust參數(shù)改成qfq前復(fù)權(quán)讓歷史價(jià)格在除權(quán)時(shí)做統(tǒng)一調(diào)整。前復(fù)權(quán)的邏輯是保持當(dāng)前價(jià)格不變把歷史價(jià)格按比例調(diào)整這樣算出來(lái)的技術(shù)指標(biāo)才是連續(xù)的。5.3 sklearn版本差異帶來(lái)的API變更課程視頻里用的是當(dāng)時(shí)某個(gè)版本的sklearn代碼在我現(xiàn)在的新版本環(huán)境里偶爾會(huì)碰到一些參數(shù)失效或者模塊遷移的情況。比如某些老版本里的函數(shù)在新版本中換了位置或者改了默認(rèn)值直接復(fù)制老代碼會(huì)莫名其妙報(bào)錯(cuò)。我的處理辦法是在項(xiàng)目一開(kāi)始就創(chuàng)建一個(gè)虛擬環(huán)境把依賴版本固定下來(lái)pip install scikit-learn1.0.2這樣做的好處是以后不管課程代碼怎么變、系統(tǒng)環(huán)境怎么升級(jí)項(xiàng)目本身能穩(wěn)定復(fù)現(xiàn)。如果你懶得管版本也沒(méi)問(wèn)題——但每跑一步遇到報(bào)錯(cuò)先看一眼報(bào)錯(cuò)信息里的sklearn相關(guān)字樣通常就能定位是版本問(wèn)題還是代碼問(wèn)題。5.4 重新理解“4天學(xué)會(huì)”這件事把p16~p20跑通之后我對(duì)“4天學(xué)會(huì)”這個(gè)標(biāo)題的理解更清醒了。4天時(shí)間能完成的事是搭好環(huán)境、了解接口、跑通一套標(biāo)準(zhǔn)的建模流程讓你看到一個(gè)從數(shù)據(jù)到模型的完整骨架。但距離真正“學(xué)會(huì)”還差著大量的實(shí)操換一只股票能不能跑通換一組特征效果會(huì)怎樣模型參數(shù)調(diào)一調(diào)又會(huì)怎樣這些問(wèn)題靠4天是不可能得到答案的。課程的真正價(jià)值是把一條最常用的技術(shù)路徑喂到你嘴邊——數(shù)據(jù)獲取-清洗-特征-建模-評(píng)估后面需要你自己反復(fù)咀嚼、消化成自己的能力。寫(xiě)到這里p16~p20的內(nèi)容算是基本消化完了。一個(gè)很主觀的感受這套課程真正的價(jià)值不在那幾行代碼而在把“機(jī)器學(xué)習(xí)做量化”這條路上最常見(jiàn)的幾個(gè)坑提前暴露給你。我踩過(guò)的未來(lái)函數(shù)、復(fù)權(quán)、版本兼容你大概率也會(huì)踩一遍早點(diǎn)知道至少能少掉幾根頭發(fā)。接下來(lái)我會(huì)繼續(xù)往下學(xué)下一篇筆記打算整理p21~p25的回測(cè)部分到那會(huì)兒就能看到策略完整跑起來(lái)是什么效果了。有興趣的可以繼續(xù)關(guān)注也建議你把上一篇筆記里的環(huán)境搭建和基礎(chǔ)語(yǔ)法補(bǔ)一補(bǔ)再看本文的代碼會(huì)順暢很多。本文還有配套的精品資源點(diǎn)擊獲取