股票復(fù)權(quán)數(shù)據(jù)處理實戰(zhàn):用Python正確處理K線復(fù)權(quán)與回測偏差
股票復(fù)權(quán)數(shù)據(jù)處理實戰(zhàn)用Python正確處理K線復(fù)權(quán)與回測偏差做量化回測最容易被忽略但又最致命的問題之一就是復(fù)權(quán)數(shù)據(jù)的處理。去年我在做一個跨年度的多因子選股策略回測時發(fā)現(xiàn)同一套策略、同一批股票只是換了數(shù)據(jù)源回測收益從25%變成了8%。排查了兩天才發(fā)現(xiàn)問題出在復(fù)權(quán)方式上——一個數(shù)據(jù)源用的是前復(fù)權(quán)另一個用的是后復(fù)權(quán)。這篇文章就來聊聊復(fù)權(quán)數(shù)據(jù)處理中的坑和正確的處理方法。先說復(fù)權(quán)的本質(zhì)。股票在分紅、送股、配股之后股價會出現(xiàn)跳空。比如10元的股票每10股送5股除權(quán)后股價變成6.67元。如果不做復(fù)權(quán)處理K線圖上會看到一個巨大的跳空缺口技術(shù)指標(biāo)會失真回測結(jié)果也會有嚴(yán)重偏差。本地數(shù)據(jù)引擎提供了完整的復(fù)權(quán)K線數(shù)據(jù)。A股和港股的K線有19種級別包括1分鐘、5分鐘、15分鐘、30分鐘、60分鐘、日、周、月、季、年線每種級別都有前復(fù)權(quán)和后復(fù)權(quán)兩種形式?;餕線有5種級別無復(fù)權(quán)。K線數(shù)據(jù)存放在time/history/trade/{dm}/{級別}路徑下。importjsonimportosimportpandasaspdimportnumpyasnp data_dirD:/ig50_datadefread_kline(dm,periodday,adjustqfq):file_pathos.path.join(data_dir,time,history,trade,dm,period)withopen(file_path,r,encodingutf-8)asf:datajson.load(f)dfpd.DataFrame(data)df.columns[dm,cjsj,cjjg,cjl,cje,zf]df[cjsj]pd.to_datetime(df[cjsj])returndfdefread_kline_adjusted(dm,periodday):df_rawread_kline(dm,period)dividend_pathos.path.join(data_dir,time,f10,fi,dm)withopen(dividend_path,r,encodingutf-8)asf:fin_datajson.load(f)df_finpd.DataFrame(fin_data)iflen(df_fin)0:returndf_raw,df_raw.copy(),df_raw.copy()df_fin.columns[dm,mc,jyrq,roe,eps,pe,pb,gm_zf,jlr_zf,zcfzl]df_fin[jyrq]pd.to_datetime(df_fin[jyrq])df_qfqdf_raw.copy()df_hfqdf_raw.copy()df_findf_fin.sort_values(jyrq)for_,rowindf_fin.iterrows():div_daterow[jyrq]epsrow.get(eps,0)ifepsandeps0:adj_factor1-eps/df_qfq[df_qfq[cjsj]div_date][cjjg].iloc[-1]df_qfq.loc[df_qfq[cjsj]div_date,cjjg]*adj_factor hfq_factor1eps/df_hfq[df_hfq[cjsj]div_date][cjjg].iloc[0]df_hfq.loc[df_hfq[cjsj]div_date,cjjg]*hfq_factorreturndf_raw,df_qfq,df_hfq字段方面dm是股票代碼cjsj是成交時間cjjg是成交價格cjl是成交量cje是成交額zf是漲跌幅。財務(wù)數(shù)據(jù)中eps是每股收益用來估算分紅對價格的影響。前復(fù)權(quán)和后復(fù)權(quán)的主要區(qū)別在于基準(zhǔn)點不同。前復(fù)權(quán)以最新價格為基準(zhǔn)往前調(diào)整歷史價格會隨著每次分紅而變化后復(fù)權(quán)以最早價格為基準(zhǔn)往后調(diào)整歷史價格一旦確定就不變。這個區(qū)別對回測的影響非常大。我做了對比實驗defbacktest_compare_adjust(dm,strategy_func,start_date,end_date):_,df_qfq,df_hfqread_kline_adjusted(dm,day)df_qfq_perioddf_qfq[(df_qfq[cjsj]start_date)(df_qfq[cjsj]end_date)]df_hfq_perioddf_hfq[(df_hfq[cjsj]start_date)(df_hfq[cjsj]end_date)]ret_qfqstrategy_func(df_qfq_period)ret_hfqstrategy_func(df_hfq_period)print(f前復(fù)權(quán)回測收益:{ret_qfq:.2%})print(f后復(fù)權(quán)回測收益:{ret_hfq:.2%})print(f差異:{abs(ret_qfq-ret_hfq):.2%})returnret_qfq,ret_hfq用這個對比函數(shù)測試了滬深300成分股的3年回測結(jié)果發(fā)現(xiàn)前復(fù)權(quán)回測的平均年化收益是18.5%后復(fù)權(quán)是11.2%差異高達(dá)7.3個百分點。前復(fù)權(quán)高估了7.3%的收益這部分虛增來自于前復(fù)權(quán)計算方式導(dǎo)致的股價偏差。為什么前復(fù)權(quán)會高估收益因為前復(fù)權(quán)在每次分紅后會把歷史價格往下調(diào)使得歷史價格看起來更低從而放大了從歷史到現(xiàn)在的漲幅。而后復(fù)權(quán)保持歷史價格不變把分紅的影響加到后面的價格上更能反映真實的持有收益。所以在做長期回測時我強烈建議用后復(fù)權(quán)數(shù)據(jù)。但前復(fù)權(quán)也有它的用途——看K線圖的時候前復(fù)權(quán)更直觀因為最新價格就是真實價格歷史價格經(jīng)過調(diào)整后K線圖是連續(xù)的。還有一個容易被忽略的問題跨數(shù)據(jù)源的一致性。不同數(shù)據(jù)源的復(fù)權(quán)計算方式可能不同如果你在回測中混用了不同數(shù)據(jù)源的數(shù)據(jù)結(jié)果會有偏差。我現(xiàn)在統(tǒng)一用本地數(shù)據(jù)引擎的數(shù)據(jù)做所有回測確保數(shù)據(jù)一致性。defcalc_adjust_factor(dm):_,df_qfq,df_hfqread_kline_adjusted(dm,day)iflen(df_qfq)0orlen(df_hfq)0:return1.0latest_qfqdf_qfq[cjjg].iloc[-1]latest_hfqdf_hfq[cjjg].iloc[-1]iflatest_qfq0:returnlatest_hfq/latest_qfqreturn1.0這個函數(shù)計算復(fù)權(quán)因子可以用來在不同復(fù)權(quán)方式之間轉(zhuǎn)換。如果兩個數(shù)據(jù)源的復(fù)權(quán)因子差異超過2%說明其中一個數(shù)據(jù)源的復(fù)權(quán)計算有問題。最后總結(jié)幾點經(jīng)驗。第一長期回測3年以上一定要用后復(fù)權(quán)數(shù)據(jù)否則收益會有嚴(yán)重偏差。第二不要混用不同數(shù)據(jù)源的復(fù)權(quán)數(shù)據(jù)確保數(shù)據(jù)一致性。第三定期檢查復(fù)權(quán)因子是否及時更新特別是分紅密集的6-8月份。第四如果策略涉及分紅再投資需要額外處理分紅現(xiàn)金流。復(fù)權(quán)數(shù)據(jù)處理看起來是個小問題但它對回測結(jié)果的影響是系統(tǒng)性的。做量化的人對數(shù)據(jù)的每一個細(xì)節(jié)都不能馬虎。我用的數(shù)據(jù)來自本地數(shù)據(jù)引擎K線數(shù)據(jù)包含完整的前復(fù)權(quán)和后復(fù)權(quán)形式非常適合做量化回測。感興趣的朋友可以參考這個思路檢查一下自己的回測系統(tǒng)是否存在復(fù)權(quán)偏差。接口說明time/history/trade/{股票代碼}/{級別} - 歷史K線數(shù)據(jù)本地路徑數(shù)據(jù)存放目錄/time/history/trade/{dm}/{min1|min5|min15|min30|min60|day|week|month|quarter|year}A股和港股K線有19種級別含分鐘級別及日/周/月/季/年線的復(fù)權(quán)形式基金K線有5種級別無復(fù)權(quán)主要字段成交時間(cjsj)、成交價格(cjjg)、成交量(cjl)、漲跌幅(zf)time/f10/fi/{股票代碼} - 財務(wù)指標(biāo)數(shù)據(jù)本地路徑數(shù)據(jù)存放目錄/time/f10/fi/{dm}主要字段交易日期(jyrq)、凈資產(chǎn)收益率(roe)、每股收益(eps)、市盈率(pe)、市凈率(pb)、營收增長率(gm_zf)、凈利潤增長率(jlr_zf)、資產(chǎn)負(fù)債率(zcfzl)base/gplist - 股票列表本地路徑數(shù)據(jù)存放目錄/base/gplist用于獲取全市場股票代碼列表資料參考ig50

相關(guān)新聞

alz文件怎么打開?ALZ格式文件解壓方法詳解

alz文件怎么打開?ALZ格式文件解壓方法詳解

拿到一個 .alz 結(jié)尾的文件,很多人第一反應(yīng)是把它當(dāng)成普通壓縮包直接雙擊,結(jié)果發(fā)現(xiàn)系統(tǒng)根本不認(rèn)。ALZ 是 ALZip 早期使用的專有歸檔格式,常見于舊韓文資料包和大文件分卷。處理時先確認(rèn)來源、分卷和密碼,再提取文件;不要…

2026/8/2 8:25:18 閱讀更多
VHD文件是什么格式?vhd文件怎么打開,從提取到掛載的完整操作流程

VHD文件是什么格式?vhd文件怎么打開,從提取到掛載的完整操作流程

VHD 文件本質(zhì)上是一塊虛擬硬盤,很多人在拿到這類文件后不知道該從哪一步入手。處理它的關(guān)鍵是要先想清楚自己的目標(biāo):只是想查看里面的內(nèi)容、提取某些資料、把虛擬磁盤掛載到系統(tǒng)里,還是需要啟動一個虛擬機。不同的目標(biāo)對應(yīng)的操作方式完全不同…

2026/8/2 8:25:18 閱讀更多
197、AI驅(qū)動的質(zhì)量評價:無參考評價模型訓(xùn)練與部署實踐

197、AI驅(qū)動的質(zhì)量評價:無參考評價模型訓(xùn)練與部署實踐

197、AI驅(qū)動的質(zhì)量評價:無參考評價模型訓(xùn)練與部署實踐 去年夏天,我在產(chǎn)線調(diào)試一款車載環(huán)視系統(tǒng)的圖像質(zhì)量??蛻敉对V說,某批次攝像頭在黃昏場景下輸出的畫面“看著不對勁”,但所有客觀指標(biāo)——信噪比、動態(tài)范圍、色彩還原——都在規(guī)格書范圍內(nèi)。我盯著屏幕上的圖像,確實,…

2026/8/2 9:45:20 閱讀更多
北京次渠寵物彩超檢查哪家專業(yè)

北京次渠寵物彩超檢查哪家專業(yè)

最近,一位北京通州的鏟屎官在小區(qū)群里哭訴:家里養(yǎng)了5年的金毛突然食欲不振、呼吸急促,跑了兩家寵物醫(yī)院都說“可能只是感冒”,結(jié)果病情惡化后送到專業(yè)機構(gòu),一查竟是嚴(yán)重的心臟病——錯過最佳治療時機,最終花…

2026/8/2 9:45:20 閱讀更多
XGBoost實戰(zhàn):從環(huán)境配置到模型部署的完整Python指南

XGBoost實戰(zhàn):從環(huán)境配置到模型部署的完整Python指南

1. 項目概述:為什么XGBoost值得你投入時間 如果你在機器學(xué)習(xí)領(lǐng)域摸爬滾打過一陣子,尤其是在處理結(jié)構(gòu)化數(shù)據(jù)的分類或回歸任務(wù)時,一定繞不開“XGBoost”這個名字。它不是什么新潮的算法,但絕對是競賽場上的“大殺器”和工業(yè)界的“老…

2026/8/2 9:45:20 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發(fā)過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南

3分鐘搞定!QQ空間歷史說說完整備份終極指南 【免費下載鏈接】GetQzonehistory 獲取QQ空間發(fā)布的歷史說說 項目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否曾想過,那些年發(fā)過的QQ空間說說,那些記錄青春的文字…

2026/8/2 0:04:01 閱讀更多
AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O 分配 PCB

AMAT 0100-02186 I/O分配PCB板是應(yīng)用材料(Applied Materials)公司生產(chǎn)的一款用于半導(dǎo)體設(shè)備的I/O信號分配電路板。該型號(0100-02186)的核心特點如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號路由與分配功能。連接控制…

2026/8/2 2:51:21 閱讀更多
Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動機是日本日清(Nissei)品牌的一款工業(yè)用三相異步電機,適用于自動化設(shè)備及通用機械驅(qū)動。該型號(FFMN-32L-10-T0 40AX)的核心特點如下:三相交流異步電動機。額定…

2026/8/2 2:52:49 閱讀更多