基于WILL5000指数数据计算股指翻倍间隔时长的实现方法
美股翻倍时长统计复现方案
前置数据处理
首先对从FRED导出的WILL5000指数原始数据做清洗:
import pandas as pd # 读入原始数据,将日期列解析为datetime格式并设为索引 df = pd.read_csv('WILL5000原始数据路径.csv', parse_dates=['DATE'], index_col='DATE') # 剔除指数为空的无效行,按日期升序排序 df = df.dropna(subset=['WILL5000']).sort_index()
核心计算逻辑
方法1:逐行检索法(易理解,适配小数据集)
完全匹配你提出的思路,实现逻辑简单直观:
# 新增指数半值列 df['half_val'] = df['WILL5000'] / 2 def get_match_date(current_date, half_val): # 筛选当前日期之前的所有历史数据,找到最后一个指数小于等于半值的日期 historical_data = df.loc[df.index < current_date, 'WILL5000'] return historical_data[historical_data <= half_val].last_valid_index() # 逐行计算匹配的历史低点日期 df['low_date'] = df.apply(lambda x: get_match_date(x.name, x['half_val']), axis=1) # 计算翻倍耗时(天数) df['double_days'] = (df.index - df['low_date']).dt.days
方法2:merge_asof高效计算(适配1970年至今全量时序数据,速度提升10倍以上)
利用pandas内置的邻近匹配能力,避免逐行遍历,适合长时序数据计算:
# 构造匹配用的左右表 left_table = df[['WILL5000']].reset_index().rename(columns={'DATE':'current_date', 'WILL5000':'current_val'}) left_table['half_val'] = left_table['current_val'] / 2 right_table = df[['WILL5000']].reset_index().rename(columns={'DATE':'low_date', 'WILL5000':'low_val'}) # 按半值做邻近匹配,自动找小于等于半值的最近历史指数对应的日期 match_result = pd.merge_asof( left_table.sort_values('half_val'), right_table.sort_values('low_val'), left_on='half_val', right_on='low_val', direction='backward' ) # 筛选低点日期早于当前日期的有效记录,计算翻倍天数 match_result = match_result[match_result['low_date'] < match_result['current_date']] match_result['double_days'] = (match_result['current_date'] - match_result['low_date']).dt.days match_result = match_result.sort_values('current_date').set_index('current_date')
结论验证
计算完成后直接检索最短翻倍时长即可验证统计结论:
min_days = match_result['double_days'].min() min_record = match_result[match_result['double_days'] == min_days].iloc[0] print(f"历史最短翻倍天数:{min_days}") print(f"翻倍终点日期:{min_record.name.date()},起点日期:{min_record['low_date'].date()}")
其他可选实现思路
- 滑动窗口法:遍历不同长度的时间窗口,计算窗口首尾指数涨幅,筛选涨幅≥100%的窗口后找最小长度
- 局部低点回溯法:先筛选历史所有局部低点,再计算每个低点之后指数首次翻倍的间隔天数,取最小值
- 向量化运算:用numpy构造全量比较矩阵,批量匹配满足翻倍条件的日期对,再筛选最小间隔,适合算力充足的场景
内容的提问来源于stack exchange,提问作者OnlySteve
相关产品推荐
相关产品推荐

