手动调整股票拆分前Pandas DataFrame中的股价与成交量数据
增量更新股票数据并手动调整拆股前数据的实现
核心需求实现
下面是满足「增量更新CSV股票数据+手动修正拆股历史数据」的完整实现,解决了拆股对价格曲线、成交量计算的干扰问题:
完整代码
import yfinance as yf import pandas as pd from datetime import datetime def update_stock_data(ticker, csv_path, split_coefficient): # 1. 增量更新数据逻辑 try: # 读取已有CSV数据,获取最新记录日期 existing_df = pd.read_csv(csv_path, parse_dates=['Date'], index_col='Date') last_record_date = existing_df.index[-1].strftime('%Y-%m-%d') # 仅下载最新日期之后的新数据 new_data = yf.download(ticker, start=last_record_date) # 合并新数据并去重 combined_df = pd.concat([existing_df, new_data]).drop_duplicates() except FileNotFoundError: # 首次运行,直接下载全量数据 combined_df = yf.download(ticker) # 2. 手动调整拆股前的数据 # 示例:手动指定拆股日期,实际可从yfinance自动获取拆股事件 split_date = datetime(2022, 6, 1) # 拆分拆股前后数据集 pre_split_df = combined_df[combined_df.index < split_date] post_split_df = combined_df[combined_df.index >= split_date] # 调整拆股前的价格与成交量 price_cols = ['Open', 'High', 'Low', 'Close', 'Adj Close'] pre_split_df[price_cols] = pre_split_df[price_cols] / split_coefficient pre_split_df['Volume'] = pre_split_df['Volume'] * split_coefficient # 合并处理后的数据集并排序 final_df = pd.concat([pre_split_df, post_split_df]).sort_index() # 3. 保存更新后的数据到CSV final_df.to_csv(csv_path) print(f"数据已更新并保存至 {csv_path}") # 使用示例:苹果2020年拆股系数为4(1拆4) if __name__ == "__main__": update_stock_data('AAPL', 'aapl_stock_data.csv', split_coefficient=4)
关键逻辑说明
- 增量更新:优先读取已有CSV的最新日期,只下载该日期之后的新数据,避免重复下载全量数据;首次运行则直接拉取全量数据。
- 拆股修正:
- 按拆股日期将数据集拆分为「拆股前」「拆股后」两部分
- 拆股前的价格类字段除以拆股系数,成交量字段乘以拆股系数,保证数据前后口径统一
- 数据去重:合并新旧数据时自动剔除重复记录,避免CSV中出现冗余数据
优化补充
实际场景中可以通过yfinance自动获取标的的拆股事件,无需手动指定日期和系数:
ticker_obj = yf.Ticker('AAPL') # 获取所有拆股事件:索引为拆股日期,值为拆股系数 splits = ticker_obj.splits
内容的提问来源于stack exchange,提问作者Henning
相关产品推荐
相关产品推荐

