计算基金净值回撤

文章介绍了如何使用SQL查询来计算每个客户在过去一年中的最大回撤,即在净值达到峰值后出现的最小净值与峰值之间的差值占峰值的比例。通过窗口函数找出最大净值和首次达到最大净值的日期,然后过滤并计算最大回撤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cust_pft:

​ 客户(cust_id)

​ 日期(date)

​ 资产净值(pft)

现在需要获得每个客户近1年的最大回撤:

最大回撤定义:在该客户的净值曲线中,当出现最大的净值的时点记为m1,这之后出现的净值比m1那天净值相差最大的净值记为m2,

最大回撤就是(m2-m1)/m1.(注意是出现最大净值之后的最小净值,两者的差)

  • 思路:
    1. 选出近一年的数据,然后用窗口函数求出每个客户近一年的最大净值
    2. 根据上一步结果,用窗口函数增加一列,为第一次出现最大净值的日期
    3. 根据上一步结果,过滤出第一次最大净值日期之后的数据,然后根据客户分组,求最大回撤:(最大值-最小值)/最小值
-- 建表插入数据
CREATE OR REPLACE TEMPORARY VIEW cust_pft (cust_id, `date`, pft)
AS
VALUES (1, '2022-05-20', 520),
       (1, '2022-08-01', 10000),
       (1, '2022-08-02', 10010),
       (1, '2022-08-03', 10020),
       (1, '2022-08-04', 9999),
       (1, '2022-08-05', 9998),
       (1, '2022-08-06', 10020),
       (1, '2022-12-27', 6000),
       (1, '2022-12-28', 6001),
       (1, '2022-12-29', 6002),
       (2, '2022-08-04', 20),
       (2, '2022-08-05', 10);


SELECT *
FROM cust_pft;
WITH t1 AS (
    SELECT *,
           MAX(pft) OVER (PARTITION BY cust_id) max_pft
    FROM cust_pft
    WHERE `date` >= DATE_SUB(CURRENT_DATE, 365)
)

   , t2 AS (SELECT *,
                   MIN(IF(max_pft = pft, date, NULL)) OVER (PARTITION BY cust_id) AS max_date
            FROM t1)
SELECT cust_id,
       MAX(max_pft)                                max_pft,
       MIN(pft)                                    min_pft,
       (MAX(max_pft) - MIN(pft)) / MAX(max_pft) AS max_withdraw
FROM t2
WHERE `date` >= max_date
GROUP BY cust_id;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lucky bigdata

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值