如何批量生成450+股票日收益率的滞后列,无需手动逐个操作?
批量处理股票日收益率滞后计算
问题描述
我正在处理450多只股票的日收益率滞后计算,已将日收益率存入DataFrame,也知晓单个列的滞后方法,但不想手动为每只股票重复操作,希望仅输入一次股票代码即可自动完成滞后处理。当前代码仅手动处理了少量列,效率极低,想通过for循环实现批量处理,但不清楚具体如何构建。
现有代码:
import yfinance as yf import pandas as pd data = yf.download("MMM AOS ABT ABBV ABMD ACN ATVI ADM ADBE ADP AAP AES AFL A APD AKAM ALK ALB ARE ALGN ALLE LNT ALL GOOGL GOOG MO AMZN AMCR AMD AEE AAL AEP AXP AIG AMT AWK AMP ABC AME AMGN APH ADI ANSS AON APA AAPL AMAT APTV ACGL ANET AJG AIZ T ATO ADSK AZO AVB AVY BKR BALL BAC BBWI BAX BDX WRB BRK.B BBY BIO TECH BIIB BLK BK BA BKNG BWA BXP BSX BMY AVGO BR BRO BF.B CHRW CDNS CZR CPT CPB COF CAH KMX CCL CTLT CAT CBOE CBRE CDW CE CNC CNP CF CRL SCHW CHTR CVX CMG CB CHD CI CINF CTAS CSCO C CFG CLX CME CMS KO CTSH CL CMCSA CMA CAG COP ED STZ COO CPRT GLW CSGP COST CTRA CCI CSX CMI CVS DHI DHR DRI DVA DE DAL XRAY DVN DXCM FANG DLR DFS DISH DIS DG DLTR D DPZ DOV DTE DUK DXC EMN ETN EBAY ECL EIX EW EA ELV LLY EMR ENPH ETR EOG EPAM EQT EFX EQR ESS EL ETSY RE ES EXC EXPE EXPD EXR XOM FFIV FDS FAST FRT FDX FITB FRC FE FIS FISV FLT FMC F FTNT FTV FBHS BEN FCX GRMN IT GEN GNRC GD GE GIS GM GPC GILD GL GPN GS HAL HIG HAS HCA PEAK HSY HES HPE HLT HOLX HD HON HRL HST HWM HPQ HUM HBAN HII IBM IEX IDXX ITW ILMN INCY IR INTC ICE IP IPG IFF INTU ISRG IVZ INVH IQV IRM JBHT JKHY J JNJ JCI JPM JNPR K KEY KEYS KMB KIM KMI KLAC KHC KR LH LRCX LW LVS LDOS LEN LNC LYV LKQ LMT L LOW LUMN LYB MTB MRO MPC MKTX MAR MMC MLM MAS MA MTCH MKC MCD MCK MDT MRK META MET MTD MGM MCHP MU MSFT MAA MHK MOH TAP MDLZ MPWR MNST MCO MS MOS MSI MSCI NDAQ NTAP NFLX NEM NEE NKE NI NSC NTRS NOC NRG NUE NVDA NVR NXPI ORLY OXY ODFL OMC ON OKE ORCL PCAR PKG PARA PH PAYX PAYC PYPL PNR PEP PKI PFE PCG PM PSX PNW PXD PNC POOL PPG PPL PFG PG PGR PLD PRU PEG PSA PHM QRVO PWR QCOM DGX RL RJF RTX O REGN RF RSG RMD RHI ROK ROL ROP ROST RCL SPGI CRM SBAC SLB STX SEE SRE NOW SHW SBNY SPG SWKS SJM SNA SEDG SO LUV SWK SBUX STT STE SYK SIVB SYF SNPS SYY TMUS TROW TTWO TPR TRGP TGT TEL TDY TFX TSLA TXN TXT TMO TJX TSCO TT TDG TRV TRMB TFC TYL TSN USB UDR ULTA UNP UPS URI UNH UHS VLO VTR VRSN VRSK VZ VRTX VFC VTRS V VNO VMC WAB WBA WMT WBD WM WAT WEC WFC WST WDC WRK WY WHR WMB GWW WYNN XEL XYL YUM ZBRA ZBH ZION ZTS", start="2017-01-01",end="2022-01-01") daily_returns = data['Adj Close'].pct_change() df2 = pd.DataFrame(daily_returns) df2['AOS_lag'] = df2['AOS'].shift(1) df2['MMM_lag'] = df2['MMM'].shift(1)
解决方案
方法1:使用for循环批量处理
遍历DataFrame的每一列(即每只股票代码),为每个列生成对应的滞后列:
# 遍历所有股票列 for ticker in df2.columns: # 生成滞后列名,格式为"股票代码_lag" lag_col_name = f"{ticker}_lag" # 添加滞后1期的列到df2 df2[lag_col_name] = df2[ticker].shift(1)
方法2:更高效的向量化操作(推荐)
直接对整个DataFrame调用shift()方法,然后重命名所有列,这种方法比循环更高效,尤其适合处理大量股票:
# 生成所有滞后列组成的DataFrame lagged_returns = df2.shift(1) # 重命名列,添加"_lag"后缀 lagged_returns.columns = [f"{col}_lag" for col in lagged_returns.columns] # 将滞后列合并到原DataFrame df2 = pd.concat([df2, lagged_returns], axis=1)
两种方法都能自动为所有股票生成滞后1期的列,无需手动逐个处理。方法2利用pandas的向量化特性,处理450+只股票时性能更优。
内容的提问来源于stack exchange,提问作者Ean Bigelow
相关产品推荐
相关产品推荐

