oracle回撤,Oracle使用排列组合计算最大回撤幅度

需要了解的知识点:

最大回撤率:在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值。

最大回撤率计算公式:

最大回撤率=max[(Di−Dj)/ Di]

D为某一天的净值,i为某一天,j为i后的某一天,Di为第i天的产品净值,Dj则是Di后面某一天的净值

准备工作:

假设有4条数据(1号-4号),如图:

5c327f6196a1686ccefb312db487cd7c.png

我把数据绘制成坐标图(微软自带的画图工具画的,勿喷)

06bd430e66cb80e4f0278b53e865450e.png

思路:

①使用sys_connect_by_path对这4条数据进行排列组合

select sys_connect_by_path(value, '#') combo

from (select *

from tmp

where bizdate <= 20110104

order by bizdate asc) t

where level = 2

connect by prior bizdate < t.bizdate

and level <= 2

得到以下结果:

b89599629912b1ebf7fcce2037954406.png

②截取字符串:

select substr(s.combo, 2, instr(s.combo, '#', -1) - 2) as num1,

substr(s.combo, instr(s.combo, '#', -1) + 1) as num2

from (select sys_connect_by_path(value, '#') combo

from (select *

from tmp

where bizdate <= 20110104

order by bizdate asc) t

where level = 2

connect by prior bizdate < t.bizdate

and level <= 2) s

得到以下结果:

fd717bf2a2be1d2f88387b83bed15a28.png

③最终计算出最大回撤幅度:

select max((a.num1 - a.num2) / a.num1)

from (select substr(s.combo, 2, instr(s.combo, '#', -1) - 2) as num1,

substr(s.combo, instr(s.combo, '#', -1) + 1) as num2

from (select sys_connect_by_path(value, '#') combo

from (select *

from tmp

where bizdate <= 20110104

order by bizdate asc) t

where level = 2

connect by prior bizdate < t.bizdate

and level <= 2) s) a

得到最终结果:

db49577f03459f0efb81d2189b3b539f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值