使用pandas分组计算股票k个连续下跌日后次日上涨的概率
连续下跌后次日上涨条件概率计算方案
前置数据处理
首先完成日期格式转换、排序、前3年数据过滤:
import pandas as pd # 日期格式转换+按时间升序排序 df['Date'] = pd.to_datetime(df['Date']) df = df.sort_values('Date', ascending=True).reset_index(drop=True) # 截取前3年数据 start_date = df['Date'].min() three_year_cutoff = start_date + pd.DateOffset(years=3) df_3y = df[df['Date'] <= three_year_cutoff].copy()
实现方法
方法1:滑动窗口法(逻辑直观易调试)
遍历所有长度为k+1的连续序列,统计符合要求的样本占比:
labels = df_3y['True Label'].tolist() n = len(labels) def cal_k_prob(k): total_case = 0 success_case = 0 # 遍历所有可形成k+1长度序列的起始位置 for i in range(n - k): # 前k个均为下跌 if all(tag == '-' for tag in labels[i:i+k]): total_case += 1 if labels[i + k] == '+': success_case += 1 return success_case / total_case if total_case != 0 else 0 # 输出k=1/2/3对应的概率 for k in [1,2,3]: prob = cal_k_prob(k) print(f"k={k} 连续下跌后次日上涨的条件概率:{prob:.4f}")
方法2:分组统计法(大数据量下效率更高)
基于你原来的分组思路补全后续统计逻辑:
# 生成分组ID:遇到上涨标签则分组ID+1,同个ID对应一段连续下跌 df_3y['drop_group_id'] = (df_3y['True Label'] != '-').cumsum() # 统计每个连续下跌段的长度 drop_group_stats = df_3y[df_3y['True Label'] == '-'].groupby('drop_group_id').size().reset_index(name='drop_days') # 匹配每个下跌段之后的第一个交易日标签 first_label_per_group = df_3y.drop_duplicates('drop_group_id', keep='first').set_index('drop_group_id')['True Label'].to_dict() drop_group_stats['next_label'] = drop_group_stats['drop_group_id'].apply(lambda x: first_label_per_group.get(x+1, None)) # 初始化k=1/2/3的统计计数器 stat = {k: {'total': 0, 'success': 0} for k in [1,2,3]} for _, row in drop_group_stats.iterrows(): drop_days = row['drop_days'] next_label = row['next_label'] max_valid_k = min(drop_days, 3) for k in range(1, max_valid_k + 1): stat[k]['total'] += 1 # 只有连续下跌刚好k天时,才判断后续标签是否为上涨 if k == drop_days and next_label == '+': stat[k]['success'] += 1 # 输出结果 for k in [1,2,3]: total = stat[k]['total'] prob = stat[k]['success'] / total if total > 0 else 0 print(f"k={k} 连续下跌后次日上涨的条件概率:{prob:.4f}")
原有代码问题说明
你提供的分组代码仅完成了连续下跌段的拆分操作,没有统计每个下跌段的长度、匹配下跌段后的次日标签,也没有针对k=1/2/3三个场景分别做样本计数,因此无法直接得到概率结果。
内容的提问来源于stack exchange,提问作者Neonleon
相关产品推荐
相关产品推荐

