如何遍历滚动日期范围?基于已实现的年周五生成功能求扩展
实现滚动周五起始的60天日期范围遍历并整合股票数据获取
修正通用的周五生成函数
原代码硬编码偏移量的方式不够通用,这里调整为自动计算任意年份的第一个周五:
from datetime import date, timedelta import pandas as pd from pandas_datareader import data as wb # 需提前安装:pip install pandas-datareader def all_fridays(year): d = date(year, 1, 1) # 计算到第一个周五的天数:isoweekday()返回1(周一)-7(周日),周五对应5 days_to_friday = (5 - d.isoweekday()) % 7 d += timedelta(days=days_to_friday) while d.year == year: yield d d += timedelta(days=7)
整合滚动日期范围与股票数据抓取
直接遍历每个周五作为起始日期,计算60天后的结束日期,再批量抓取对应窗口的股票数据:
# 替换为你的目标股票代码列表 tickers = ["AAPL", "MSFT", "GOOG"] all_price_data = [] # 遍历2022年的所有周五滚动窗口 for start_date in all_fridays(2022): end_date = start_date + timedelta(days=60) print(f"处理窗口: {start_date.strftime('%Y-%m-%d')} 至 {end_date.strftime('%Y-%m-%d')}") window_data = [] for ticker in tickers: try: # 转换日期格式适配Yahoo Finance要求的mm/dd/yyyy prices = wb.DataReader( ticker, start=start_date.strftime('%m/%d/%Y'), end=end_date.strftime('%m/%d/%Y'), data_source='yahoo' )[['Adj Close']] # 添加股票代码和窗口标记(可选,用于区分不同滚动周期) window_data.append( prices.assign( ticker=ticker, window_start=start_date.strftime('%Y-%m-%d') )[['ticker', 'window_start', 'Adj Close']] ) except Exception as e: print(f"{ticker}数据获取失败: {str(e)}") if window_data: all_price_data.append(pd.concat(window_data)) # 合并所有窗口的数据 final_df = pd.concat(all_price_data).reset_index()
关键说明
- 滚动窗口的结束日期通过
start_date + timedelta(days=60)直接计算,严格匹配你要求的"每个周五往后推60天"的逻辑。 - 新增
window_start字段可帮助后续分析时区分不同滚动周期的数据,不需要可直接删除该字段的赋值代码。 - 异常处理新增具体错误信息,便于定位单只股票的数据获取问题。
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

