cust_pft:
客户(cust_id)
日期(date)
资产净值(pft)
现在需要获得每个客户近1年的最大回撤:
最大回撤定义:在该客户的净值曲线中,当出现最大的净值的时点记为m1,这之后出现的净值比m1那天净值相差最大的净值记为m2,
最大回撤就是(m2-m1)/m1.(注意是出现最大净值之后的最小净值,两者的差)
- 思路:
- 选出近一年的数据,然后用窗口函数求出每个客户近一年的最大净值
- 根据上一步结果,用窗口函数增加一列,为第一次出现最大净值的日期
- 根据上一步结果,过滤出第一次最大净值日期之后的数据,然后根据客户分组,求最大回撤:(最大值-最小值)/最小值
-- 建表插入数据
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;