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

Kusto(KQL)实现按股票代码取最近非Flat策略的方法

提取每只股票最近非“Flat”策略的实现方案

核心逻辑是按股票代码分组、日期排序,保留并继承每只股票最近的非“Flat”策略值,以下是几种常用场景的实现方式:

1. 支持窗口函数的SQL(如MySQL 8.0+、PostgreSQL、BigQuery等)

利用LAST_VALUE函数结合条件过滤,自动跳过“Flat”行,继承最近的有效策略:

SELECT
    Date,
    Ticker,
    Strategy,
    LAST_VALUE(CASE WHEN Strategy != 'Flat' THEN Strategy END IGNORE NULLS) 
        OVER (PARTITION BY Ticker ORDER BY Date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS RevisedStrategy
FROM
    your_table_name
ORDER BY
    Date;
  • PARTITION BY Ticker:按股票代码分组处理
  • ORDER BY Date:确保按时间顺序查找最近策略
  • CASE WHEN将“Flat”转为NULL,IGNORE NULLS让LAST_VALUE跳过NULL,直接取最近的非“Flat”值

2. Python Pandas 处理

适合本地数据处理,通过分组+向前填充实现:

import pandas as pd

# 示例数据
df = pd.DataFrame({
    'Date': ['1-Jan', '2-Jan', '3-Jan', '15-Mar', '1-Jun', '15-Jun'],
    'Ticker': ['A', 'B', 'A', 'A', 'B', 'A'],
    'Strategy': ['Short', 'Long', 'Flat', 'Short', 'Flat', 'Flat']
})

# 转换日期为可排序格式(若原始是字符串)
df['Date'] = pd.to_datetime(df['Date'], format='%d-%b')

# 分组后替换Flat为NaN,再向前填充最近的非NaN值
df['RevisedStrategy'] = df.groupby('Ticker')['Strategy'].apply(
    lambda x: x.where(x != 'Flat').ffill()
)

# 恢复日期显示格式(可选)
df['Date'] = df['Date'].dt.strftime('%d-%b')

print(df)

3. Spark SQL 实现

语法和普通SQL类似,通过LAST_VALUE的第二个参数启用空值忽略:

SELECT
    Date,
    Ticker,
    Strategy,
    LAST_VALUE(CASE WHEN Strategy != 'Flat' THEN Strategy END, TRUE) 
        OVER (PARTITION BY Ticker ORDER BY Date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS RevisedStrategy
FROM
    your_table
ORDER BY
    Date;

为什么之前用prev函数没效果?

prev通常仅取上一行数据,如果上一行恰好是“Flat”,就无法追溯到更早的有效策略;而上述方法是在分组的时间序列中,取当前行及之前所有行里最近的非“Flat”值,能覆盖连续出现“Flat”的场景。

内容的提问来源于stack exchange,提问作者A_4964835789

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:05:10