境搭建到首個策略Demo全流程解析)
簡介一份面向量化交易入門者的Python機器學習與量化交易學習筆記聚焦多因子選股與數(shù)據(jù)預(yù)處理核心環(huán)節(jié)。內(nèi)容覆蓋p16~p20五個章節(jié)包括市值因子選股策略的案例介紹與代碼演示、多因子策略整體流程、因子數(shù)據(jù)組成與面板數(shù)據(jù)概念并重點講解中位數(shù)去極值、三倍中位數(shù)去極值和三倍標準差法去極值的具體實現(xiàn)以及如何利用RiceQuant平臺獲取財務(wù)數(shù)據(jù)、篩選股票池、調(diào)整持倉。筆記為單文件PDF共一個文件壓縮包大小五百六十二KB適合直接閱讀和隨時回看。已有一千三百余人學習被不少量化入門者作為參考。通過閱讀這份筆記讀者可快速掌握市值因子選股的完整步驟理解因子異常值對模型穩(wěn)定性的影響學會使用去極值技術(shù)減小極端數(shù)據(jù)干擾為后續(xù)構(gòu)建更復(fù)雜的多因子策略打下扎實基礎(chǔ)。1. 這一part到底講了啥從“跑通代碼”到“看懂流程”先說個實話量化交易這塊大多數(shù)人一開始都是被“自動賺錢”四個字吸引進來的結(jié)果一上手就懵了——pandas都沒裝明白機器學習四個字更是聽著像天書。我當初也是這樣所以這份筆記我特意按p16到p20的順序重新整理了一遍核心就一件事把機器學習在量化里的角色講清楚然后讓你親手跑通一個最簡單的流程。這4節(jié)課的內(nèi)容定位很明確不是教你寫多復(fù)雜的策略而是幫你把“數(shù)據(jù) → 特征 → 模型 → 信號 → 回測”這條鏈路打通。p16到p20剛好覆蓋了環(huán)境搭建收尾、機器學習基礎(chǔ)概念、以及第一個簡單的量化策略demo。如果你正卡在“代碼能跑但不知道在干嘛”的階段這幾節(jié)課就是給你補上那個“干嘛”的。適合誰來參考兩類人。一是剛學完python基礎(chǔ)、想往量化方向走但不知道從哪下手的二是已經(jīng)裝了一堆庫、但始終沒搞明白機器學習在交易里到底怎么用的人。如果你是沖著“一周暴富”來的那可以直接關(guān)掉這里只有枯燥的數(shù)據(jù)和代碼。2. 環(huán)境搭建收尾別在第一步就勸退自己2.1 python裝哪個版本、用不用anacondap16花了些時間講環(huán)境很多人覺得啰嗦但以我?guī)н^幾十個新人的經(jīng)驗講環(huán)境問題能卡住一半以上的人。python版本這塊無腦選3.8到3.10之間的就行別追最新版。原因很實際量化生態(tài)里大量庫的預(yù)編譯包更新速度跟不上python新版本發(fā)布速度你裝個3.12很可能遇到numba、ta-lib這種庫直接沒有對應(yīng)wheel包只能源碼編譯然后報一堆錯。至于anaconda我的建議是如果你只是學機器學習那直接裝miniconda就行體積小夠用。如果你連python都沒裝過那anaconda一步到位更省心自帶conda環(huán)境管理python版本隨便切換不污染系統(tǒng)環(huán)境。我當年就是嫌anaconda太大死活不用結(jié)果裝個庫把系統(tǒng)python搞崩了一次后來老實了。提示環(huán)境管理是量化開發(fā)的剛需千萬別圖省事把所有庫都往系統(tǒng)python里裝。一個項目一個虛擬環(huán)境出事直接刪掉重建五分鐘恢復(fù)。2.2 vscode還是jupyter這兩節(jié)課明顯是用jupyter notebook演示的我建議你也用。機器學習的探索階段特征怎么選、參數(shù)怎么調(diào)本身就是不斷試錯的過程jupyter的單元格執(zhí)行模式天然適合這種工作流。數(shù)據(jù)長什么樣、中間結(jié)果對不對你一眼就能看到。vscode當然也有jupyter插件但我個人體驗是插件版偶爾會有內(nèi)核連不上的問題尤其是conda環(huán)境切換之后。所以你要是純學習直接裝個anaconda打開jupyter就能用界面丑點沒關(guān)系能干活就行。等后面寫正式策略了再換vscode寫.py文件也不遲。3. 機器學習核心概念用“預(yù)測房價”理解一切3.1 特征、標簽、訓練集、測試集p17到p18開始講機器學習基礎(chǔ)這部分如果你之前看過相關(guān)視頻會覺得重復(fù)但它的意義在于把概念和量化場景綁在一起講——這是很多純機器學習課程做不到的。拿預(yù)測房價來打比方你要預(yù)測一套房子能賣多少錢這是標簽也就是y你手里有面積、地段、房齡、朝向這些信息這是特征也就是X。機器學習做的就是找到一套規(guī)則能從這些特征算出房價。規(guī)則怎么找給它看大量“特征真實房價”的樣本這叫訓練集看完之后拿它沒見過的數(shù)據(jù)考它這叫測試集。放到量化里特征就是各種技術(shù)指標、量價數(shù)據(jù)、甚至輿情信息標簽就是你未來N天是漲還是跌或者漲跌幅。模型的任務(wù)變成根據(jù)這些特征算出未來上漲的概率或者預(yù)測的漲跌幅。本質(zhì)和預(yù)測房價沒區(qū)別只是數(shù)據(jù)源和業(yè)務(wù)背景不同。3.2 過擬合你以為學會了其實只是背題了p19重點講了過擬合我建議你把這個概念刻在腦子里因為它是量化策略回測最經(jīng)典的坑。過擬合說白了就是模型在訓練集上表現(xiàn)極好因為把它“背”下來了但一到?jīng)]見過的數(shù)據(jù)上就原形畢露。我見過太多新手策略在回測里收益曲線完美得像畫出來的一樣一上實盤就虧成狗九成都是過擬合。怎么判斷最簡單的辦法是看訓練集和測試集的差距訓練集準確率95%測試集只有60%那基本就是過擬合了。后面做特征工程和參數(shù)優(yōu)化時這個問題會反復(fù)遇到現(xiàn)在先有這個概念后面少交學費。4. 你的第一個“量化策略”demo從數(shù)據(jù)到信號4.1 數(shù)據(jù)從哪里來p20開始動手寫第一個簡單的策略demo用到的數(shù)據(jù)是tushare或者其他免費數(shù)據(jù)源。這里有個大坑我先提醒一下現(xiàn)在很多數(shù)據(jù)源的接口改了規(guī)則老視頻里的代碼直接跑會報錯別慌這是正常現(xiàn)象。我寫這篇筆記的時候tushare pro需要積分才能獲取完整日線數(shù)據(jù)但基礎(chǔ)的每日行情數(shù)據(jù)用免費額度基本夠用。如果你不想注冊、不想搞token也可以直接用yfinance拉美股數(shù)據(jù)接口穩(wěn)定、不用注冊?;蛘哂胊kshare覆蓋國內(nèi)數(shù)據(jù)免費且接口比較干凈。選數(shù)據(jù)源的原則就一條先跑通流程別在數(shù)據(jù)下載上耗太久。import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression # 模擬數(shù)據(jù)過去20天的收盤價 np.random.seed(42) price pd.Series(np.cumsum(np.random.randn(100) * 2 50)) # 構(gòu)造特征過去N天的收益率 df pd.DataFrame({price: price}) df[ret_1] df[price].pct_change() df[ret_2] df[price].pct_change(2) df[ret_3] df[price].pct_change(3) df[ret_5] df[price].pct_change(5) # 標簽未來1天的收益率 df[target] df[price].shift(-1) / df[price] - 1 df df.dropna() # 特征和標簽劃分 X df[[ret_1, ret_2, ret_3, ret_5]].values y df[target].values # 劃分訓練集和測試集 split int(len(X) * 0.8) X_train, X_test X[:split], X[split:] y_train, y_test y[:split], y[split:] # 訓練線性回歸模型 model LinearRegression() model.fit(X_train, y_train) # 預(yù)測測試集 y_pred model.predict(X_test) # 簡單判斷方向預(yù)測漲就買預(yù)測跌就賣 signal np.where(y_pred 0, 1, -1)這段代碼看著簡單但包含了完整流程造數(shù)據(jù)、做特征、設(shè)標簽、分訓練集測試集、訓練模型、生成交易信號。我建議你一定要親手敲一遍而不是復(fù)制粘貼。敲的過程中你會注意到很多細節(jié)比如pct_change會產(chǎn)生NaN需要dropna比如shift(-1)才是“未來一天”方向搞反了整個模型就廢了。4.2 這個demo的局限它離“策略”還差得遠p20這個demo說白了是個教學演示不是能實盤的東西。它沒有算交易成本沒有考慮資金管理也沒有做任何回測驗證。線性回歸預(yù)測漲跌幅本身就是一個極弱的模型更別說只用過去幾天收益率當特征這本質(zhì)上就是在預(yù)測一個隨機游走序列——理論上就賺不到錢。但它的意義在于把一個抽象的“量化機器學習流程”變成了具體可運行的代碼。你可以改特征、換模型、調(diào)參數(shù)然后在同樣的數(shù)據(jù)上看效果變化這是理解整個系統(tǒng)的最高效路徑。我自己當年就是把每個小demo都改一遍、折騰一遍才真正把流程刻進腦子里的。4.3 特征工程初體驗不是特征越多越好p16到p20雖然沒有展開講特征工程但demo里其實隱含了這個問題。上面代碼里我用了ret_1、ret_2、ret_3、ret_5四個特征它們之間高度相關(guān)——都基于同一個價格序列算出來的。特征之間的相關(guān)性高會對某些模型比如線性回歸的系數(shù)解釋造成干擾但這不代表模型完全不能用。新手做特征工程最大的誤區(qū)是堆特征覺得特征越多信息越多模型越準。實際往往是反的冗余特征帶來噪聲增加過擬合風險拉慢訓練速度。我的習慣是先用手里的數(shù)據(jù)做幾個有業(yè)務(wù)邏輯的特征跑一版看效果再逐步加特征對比驗證每個特征是否真的在“增量”。這個方法論比特征本身重要得多。5. 常見問題與排查技巧實錄5.1 pandas的pct_change和shift方向搞混這是我自己第一批踩的坑也是我?guī)率謺r見的最多的錯誤。pct_change是算當前值相對前一個值的變化率方向是“過去 → 當前”而shift(-1)是把整個序列往前移動一格相當于把未來的值放到現(xiàn)在的位置。做標簽時要用shift(-1)把未來收益挪到當前行做特征時用pct_change是取值過去的變化。我見過有人把標簽方向弄反了模型訓練出來預(yù)測結(jié)果和實際走勢恰好相反——預(yù)測漲的它跌、預(yù)測跌的它漲。但神奇的是如果忽略正負號只看絕對值模型“準確率”還挺高。這種錯誤最迷惑人因為你會覺得自己已經(jīng)做出來了只是效果不夠好于是開始調(diào)參、換特征折騰半天才發(fā)現(xiàn)方向反了。注意寫完特征和標簽后先打印出最后幾行看一遍確認“當前行的特征是已知的標簽是未來發(fā)生的”這是最便宜的驗證方式。5.2 sklearn版本更新導(dǎo)致的代碼不兼容老視頻里的很多代碼在最新版sklearn下會報Warning甚至Error最典型的就是一些舊API被移除了。比如老代碼里可能有from sklearn.cross_validation import train_test_split這個模塊早就被移到sklearn.model_selection底下了。解決方法很簡單報錯了就搜一下新API是什么別死磕舊代碼。順便說一句國內(nèi)訪問部分pip鏡像源不穩(wěn)定建議把源切到清華或者阿里云pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scikit-learn pandas numpy或者一次性配置好pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple5.3 jupyter kernel連接不上這個問題在新手期太常見了。明明conda環(huán)境里裝了庫jupyter里import卻報錯或者kernel直接死掉。原因通常是jupyter不是在當前環(huán)境里啟動的。解決辦法conda activate your_env conda install ipykernel python -m ipykernel install --user --name your_env --display-name your_env然后在jupyter界面里切換kernel到你剛注冊的環(huán)境。這個操作本質(zhì)上就是在告訴jupyter“每個kernel對應(yīng)哪個python環(huán)境別搞混了”。5.4 回測結(jié)果好得離譜先別高興看p20的demo如果你把策略的收益率曲線打印出來可能會發(fā)現(xiàn)“哇這策略太強了”。停一下先冷靜。這個demo沒有任何交易成本、沒有任何滑點假設(shè)它的“收益”是模型在測試集上預(yù)測方向和實際走勢一致的累計結(jié)果本質(zhì)上是在驗證模型有沒有學到東西不是在證明這個策略能賺錢。真實的回測至少要包含手續(xù)費和滑點、漲跌停無法成交的情況、停牌股的處理、信號產(chǎn)生到實際成交的時間差。這些p16到p20都沒涉及后面才會講到。所以你現(xiàn)在看任何回測曲線都默認打上“理想化”三個字別上頭。6. 這4節(jié)課學完你該有什么狀態(tài)按我的理解p16到p20學完之后你不需要背下來任何算法原理也不需要記住所有函數(shù)參數(shù)。你只需要確認自己能做到三件事第一能獨立搭建起jupyter環(huán)境知道在哪個環(huán)境里安裝了哪些庫。第二能看懂一行簡單的機器學習代碼在做什么——特征、標簽、訓練、預(yù)測這四個環(huán)節(jié)分別對應(yīng)哪段代碼。第三能跑通上面那個demo并且能動手改一個特征或多個參數(shù)觀察結(jié)果怎么變。做到這三點這4節(jié)課就算真正吸收了。如果還要再進一步我建議你試著用真實股票數(shù)據(jù)替換掉demo里的模擬數(shù)據(jù)把代碼里sklearn的LinearRegression換成其他模型比如隨機森林RandomForest或者邏輯回歸LogisticRegression你會發(fā)現(xiàn)同一個流程換個模型只需要改一兩行代碼但對整體流程的理解會深很多。最后再分享一個小經(jīng)驗學量化機器學習最怕的不是數(shù)學差、代碼弱而是“看懂了但不動手”。視頻里代碼一跑結(jié)果一出來你覺得“我懂了”關(guān)閉視頻三天后讓你自己寫大腦一片空白。所以我的習慣是每看完一小節(jié)先關(guān)掉視頻憑記憶手寫一遍代碼寫不出來的地方先空著最后再對照視頻補。這樣折騰幾輪代碼就是你自己的了。p21開始估計就要進入真實的特征工程和策略優(yōu)化了這部分底子打好了后面會輕松很多。本文還有配套的精品資源點擊獲取