You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 17:45:02