股票復(fù)權(quán)數(shù)據(jù)處理實(shí)戰(zhàn):用Python正確處理K線復(fù)權(quán)與回測(cè)偏差
股票復(fù)權(quán)數(shù)據(jù)處理實(shí)戰(zhàn)用Python正確處理K線復(fù)權(quán)與回測(cè)偏差做量化回測(cè)最容易被忽略但又最致命的問(wèn)題之一就是復(fù)權(quán)數(shù)據(jù)的處理。去年我在做一個(gè)跨年度的多因子選股策略回測(cè)時(shí)發(fā)現(xiàn)同一套策略、同一批股票只是換了數(shù)據(jù)源回測(cè)收益從25%變成了8%。排查了兩天才發(fā)現(xiàn)問(wèn)題出在復(fù)權(quán)方式上——一個(gè)數(shù)據(jù)源用的是前復(fù)權(quán)另一個(gè)用的是后復(fù)權(quán)。這篇文章就來(lái)聊聊復(fù)權(quán)數(shù)據(jù)處理中的坑和正確的處理方法。先說(shuō)復(fù)權(quán)的本質(zhì)。股票在分紅、送股、配股之后股價(jià)會(huì)出現(xiàn)跳空。比如10元的股票每10股送5股除權(quán)后股價(jià)變成6.67元。如果不做復(fù)權(quán)處理K線圖上會(huì)看到一個(gè)巨大的跳空缺口技術(shù)指標(biāo)會(huì)失真回測(cè)結(jié)果也會(huì)有嚴(yán)重偏差。本地?cái)?shù)據(jù)引擎提供了完整的復(fù)權(quán)K線數(shù)據(jù)。A股和港股的K線有19種級(jí)別包括1分鐘、5分鐘、15分鐘、30分鐘、60分鐘、日、周、月、季、年線每種級(jí)別都有前復(fù)權(quán)和后復(fù)權(quán)兩種形式?;餕線有5種級(jí)別無(wú)復(fù)權(quán)。K線數(shù)據(jù)存放在time/history/trade/{dm}/{級(jí)別}路徑下。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是成交時(shí)間cjjg是成交價(jià)格cjl是成交量cje是成交額zf是漲跌幅。財(cái)務(wù)數(shù)據(jù)中eps是每股收益用來(lái)估算分紅對(duì)價(jià)格的影響。前復(fù)權(quán)和后復(fù)權(quán)的主要區(qū)別在于基準(zhǔn)點(diǎn)不同。前復(fù)權(quán)以最新價(jià)格為基準(zhǔn)往前調(diào)整歷史價(jià)格會(huì)隨著每次分紅而變化后復(fù)權(quán)以最早價(jià)格為基準(zhǔn)往后調(diào)整歷史價(jià)格一旦確定就不變。這個(gè)區(qū)別對(duì)回測(cè)的影響非常大。我做了對(duì)比實(shí)驗(yàn)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)回測(cè)收益:{ret_qfq:.2%})print(f后復(fù)權(quán)回測(cè)收益:{ret_hfq:.2%})print(f差異:{abs(ret_qfq-ret_hfq):.2%})returnret_qfq,ret_hfq用這個(gè)對(duì)比函數(shù)測(cè)試了滬深300成分股的3年回測(cè)結(jié)果發(fā)現(xiàn)前復(fù)權(quán)回測(cè)的平均年化收益是18.5%后復(fù)權(quán)是11.2%差異高達(dá)7.3個(gè)百分點(diǎn)。前復(fù)權(quán)高估了7.3%的收益這部分虛增來(lái)自于前復(fù)權(quán)計(jì)算方式導(dǎo)致的股價(jià)偏差。為什么前復(fù)權(quán)會(huì)高估收益因?yàn)榍皬?fù)權(quán)在每次分紅后會(huì)把歷史價(jià)格往下調(diào)使得歷史價(jià)格看起來(lái)更低從而放大了從歷史到現(xiàn)在的漲幅。而后復(fù)權(quán)保持歷史價(jià)格不變把分紅的影響加到后面的價(jià)格上更能反映真實(shí)的持有收益。所以在做長(zhǎng)期回測(cè)時(shí)我強(qiáng)烈建議用后復(fù)權(quán)數(shù)據(jù)。但前復(fù)權(quán)也有它的用途——看K線圖的時(shí)候前復(fù)權(quán)更直觀因?yàn)樽钚聝r(jià)格就是真實(shí)價(jià)格歷史價(jià)格經(jīng)過(guò)調(diào)整后K線圖是連續(xù)的。還有一個(gè)容易被忽略的問(wèn)題跨數(shù)據(jù)源的一致性。不同數(shù)據(jù)源的復(fù)權(quán)計(jì)算方式可能不同如果你在回測(cè)中混用了不同數(shù)據(jù)源的數(shù)據(jù)結(jié)果會(huì)有偏差。我現(xiàn)在統(tǒng)一用本地?cái)?shù)據(jù)引擎的數(shù)據(jù)做所有回測(cè)確保數(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這個(gè)函數(shù)計(jì)算復(fù)權(quán)因子可以用來(lái)在不同復(fù)權(quán)方式之間轉(zhuǎn)換。如果兩個(gè)數(shù)據(jù)源的復(fù)權(quán)因子差異超過(guò)2%說(shuō)明其中一個(gè)數(shù)據(jù)源的復(fù)權(quán)計(jì)算有問(wèn)題。最后總結(jié)幾點(diǎn)經(jīng)驗(yàn)。第一長(zhǎng)期回測(cè)3年以上一定要用后復(fù)權(quán)數(shù)據(jù)否則收益會(huì)有嚴(yán)重偏差。第二不要混用不同數(shù)據(jù)源的復(fù)權(quán)數(shù)據(jù)確保數(shù)據(jù)一致性。第三定期檢查復(fù)權(quán)因子是否及時(shí)更新特別是分紅密集的6-8月份。第四如果策略涉及分紅再投資需要額外處理分紅現(xiàn)金流。復(fù)權(quán)數(shù)據(jù)處理看起來(lái)是個(gè)小問(wèn)題但它對(duì)回測(cè)結(jié)果的影響是系統(tǒng)性的。做量化的人對(duì)數(shù)據(jù)的每一個(gè)細(xì)節(jié)都不能馬虎。我用的數(shù)據(jù)來(lái)自本地?cái)?shù)據(jù)引擎K線數(shù)據(jù)包含完整的前復(fù)權(quán)和后復(fù)權(quán)形式非常適合做量化回測(cè)。感興趣的朋友可以參考這個(gè)思路檢查一下自己的回測(cè)系統(tǒng)是否存在復(fù)權(quán)偏差。接口說(shuō)明time/history/trade/{股票代碼}/{級(jí)別} - 歷史K線數(shù)據(jù)本地路徑數(shù)據(jù)存放目錄/time/history/trade/{dm}/{min1|min5|min15|min30|min60|day|week|month|quarter|year}A股和港股K線有19種級(jí)別含分鐘級(jí)別及日/周/月/季/年線的復(fù)權(quán)形式基金K線有5種級(jí)別無(wú)復(fù)權(quán)主要字段成交時(shí)間(cjsj)、成交價(jià)格(cjjg)、成交量(cjl)、漲跌幅(zf)time/f10/fi/{股票代碼} - 財(cái)務(wù)指標(biāo)數(shù)據(jù)本地路徑數(shù)據(jù)存放目錄/time/f10/fi/{dm}主要字段交易日期(jyrq)、凈資產(chǎn)收益率(roe)、每股收益(eps)、市盈率(pe)、市凈率(pb)、營(yíng)收增長(zhǎng)率(gm_zf)、凈利潤(rùn)增長(zhǎng)率(jlr_zf)、資產(chǎn)負(fù)債率(zcfzl)base/gplist - 股票列表本地路徑數(shù)據(jù)存放目錄/base/gplist用于獲取全市場(chǎng)股票代碼列表資料參考ig50

相關(guān)新聞

alz文件怎么打開(kāi)?ALZ格式文件解壓方法詳解

alz文件怎么打開(kāi)?ALZ格式文件解壓方法詳解

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

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

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

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

2026/8/2 8:25:18 閱讀更多
普本生進(jìn)廠指南:從技術(shù)員到工程師的制造業(yè)職業(yè)進(jìn)階路徑

普本生進(jìn)廠指南:從技術(shù)員到工程師的制造業(yè)職業(yè)進(jìn)階路徑

1. 從“進(jìn)廠打螺絲”說(shuō)起:一個(gè)被誤解的職業(yè)起點(diǎn)“普本畢業(yè),準(zhǔn)備進(jìn)廠打螺絲了!!!”——這句話在社交媒體上,常常帶著一絲自嘲、無(wú)奈,甚至是對(duì)未來(lái)的迷茫。作為一個(gè)在制造業(yè)一線摸爬滾打多年的“過(guò)…

2026/8/2 9:35:20 閱讀更多
IPv6折騰記——光貓?jiān)O(shè)置

IPv6折騰記——光貓?jiān)O(shè)置

書接上文,我們可以ping通家里的網(wǎng)絡(luò)設(shè)備,但是依舊無(wú)法訪問(wèn)家里的網(wǎng)絡(luò)設(shè)備(比如NAS,監(jiān)控設(shè)備),因?yàn)樗麄儌鬏斔玫膮f(xié)議用的是TCP/UDP。而這兩種協(xié)議會(huì)被光貓或者路由器的防火墻所攔截到,傳輸不到…

2026/8/2 9:35:20 閱讀更多
樹(shù)莓派Pico驅(qū)動(dòng)2.66英寸電子墨水屏:SPI通信與MicroPython實(shí)戰(zhàn)

樹(shù)莓派Pico驅(qū)動(dòng)2.66英寸電子墨水屏:SPI通信與MicroPython實(shí)戰(zhàn)

1. 項(xiàng)目概述:Pico e-Paper 2.66 是什么? 如果你手頭有一塊樹(shù)莓派 Pico 或者類似的 RP2040 開(kāi)發(fā)板,又恰好對(duì)低功耗、類紙顯示效果感興趣,那么“Pico e-Paper 2.66”這個(gè)項(xiàng)目絕對(duì)值得你花時(shí)間折騰一下。簡(jiǎn)單來(lái)說(shuō),這就是一…

2026/8/2 9:35:20 閱讀更多
Godot狀態(tài)圖開(kāi)發(fā)實(shí)戰(zhàn):從概念到應(yīng)用,解決復(fù)雜狀態(tài)管理難題

Godot狀態(tài)圖開(kāi)發(fā)實(shí)戰(zhàn):從概念到應(yīng)用,解決復(fù)雜狀態(tài)管理難題

1. 項(xiàng)目概述:為什么我們需要State Charts?如果你正在用Godot做游戲,尤其是涉及到角色行為、UI流程或者任何有復(fù)雜狀態(tài)切換的邏輯,那你大概率已經(jīng)體會(huì)過(guò)傳統(tǒng)狀態(tài)機(jī)(Finite State Machine, FSM)的痛點(diǎn)了。狀態(tài)…

2026/8/2 9:35:20 閱讀更多
TPFanCtrl2 v2.3.3雙風(fēng)扇嵌入式控制器深度配置指南

TPFanCtrl2 v2.3.3雙風(fēng)扇嵌入式控制器深度配置指南

TPFanCtrl2 v2.3.3雙風(fēng)扇嵌入式控制器深度配置指南 【免費(fèi)下載鏈接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 項(xiàng)目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 TPFanCtrl2是一款基于Windows平臺(tái)的ThinkPad筆記本風(fēng)扇控制解決方案…

2026/8/2 9:35:20 閱讀更多
CM4S核心板深度解析:RK3568工業(yè)模塊與可插拔eMMC設(shè)計(jì)實(shí)戰(zhàn)

CM4S核心板深度解析:RK3568工業(yè)模塊與可插拔eMMC設(shè)計(jì)實(shí)戰(zhàn)

1. 項(xiàng)目概述:CM4S是什么,以及為什么它值得關(guān)注 最近在折騰嵌入式開(kāi)發(fā)板的朋友圈里,CM4S這個(gè)詞的熱度有點(diǎn)高。乍一看,很多人會(huì)把它和樹(shù)莓派基金會(huì)那款經(jīng)典的Compute Module 4(CM4)搞混,但實(shí)際上&…

2026/8/2 9:25:20 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書,視頻號(hào)上,賺錢從來(lái)沒(méi)有這么容易過(guò)! 支持本地語(yǔ)音模型chatTTS,fasterwhisper,…

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

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

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

2026/8/2 0:04:01 閱讀更多
MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案

MoneyPrinterPlus實(shí)戰(zhàn)指南:AI視頻批量生成與自動(dòng)化發(fā)布完整解決方案 【免費(fèi)下載鏈接】MoneyPrinterPlus AI一鍵批量生成各類短視頻,自動(dòng)批量混剪短視頻,自動(dòng)把視頻發(fā)布到抖音,快手,小紅書,視頻號(hào)上,賺錢從來(lái)沒(méi)有這么容易過(guò)! 支持本地語(yǔ)音模型chatTTS,fasterwhisper,…

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

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

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

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信號(hào)分配電路板。該型號(hào)(0100-02186)的核心特點(diǎn)如下:專用于Endura等半導(dǎo)體工藝腔室。集成信號(hào)路由與分配功能。連接控制…

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

Nissei Corp FFMN-32L-10-T0 40AX 三相異步電動(dòng)機(jī)

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

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