回撤率 python_【PYTHON量化分析】如何使用向量思维快速计算最大回撤——熊敛四爪...

最近量化研究员小白又碰到一个看似很简单的问题,最大回撤到底怎么算比较好?....

小白百度了一下最大回撤的数学定义:

max(1 - 策略当日价值 / 当日之前账户最高价值)。

根据定义,小白凭着大一时候学的C语言编程基础,捣鼓了半天写出了一个计算最大回撤的函数。只要输入为策略的每日净值,两次循环后,函数就返回最大回撤,似乎大功告成!

def maxdrawdown(arr):

drawdown_max=0

for i in range(len(arr)):

for j in range(i,len(arr)):

drawdown=(arr[i]-arr[j])/arr[i]

drawdown_max=max(drawdown_max,drawdown)

return drawdown_max

可是等到运行的时候,问题就来了。每运行一次这个函数居然要3到5分钟,时间就是生命啊!

小白仔细想想这个用时也是正常的,一个十年的样本约有2400天,双重循环意味着这个函数要跑2400*2400/2次循环。。。循环本来就不是PYTHON的强项,怪不得这么慢。。。

最大回撤要是最常用的函数之一,有什么方法能够算的更加快一点吗?这样以后一定能节约不少时间!

如何避免for循环的出现呢?小白灵光一闪,可以用向量思维来寻找最大回撤发生的起始点和终止点。

首先寻找最大回撤的终止点。numpy包自带的np.maximum.accumulate函数可以生成一列当日之前历史最高价值的序列。在当日价值与历史最高值的比例最小时,就是最大回撤结束的终止点。

找到最大回撤终点后,最大回撤的起始点就更加简单了。我们只需要寻找从策略第一天到最大回撤终点期间 最大净值发生的日期。一个argmax函数就可以搞定。

最后,根据最大回撤的起始点和终止点,计算最大回撤的大小即可。

小白根据以上思路,迅速改下写最大回撤的函数。

import numpy as np

def maxdrawdown(arr):

i = np.argmax((np.maximum.accumulate(arr) - arr)/np.maximum.accumulate(arr)) # end of the period

j = np.argmax(arr[:i]) # start of period

return (1-arr[i]/arr[j])

改写后代码更加简洁了,试用一下新方法,最大回撤在眨眼见就算了出来,而且结果和标准算法一样,任务顺利完成!

求赞,作者熊敛四爪会分享更多的量化小技巧!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python计算股票最大的方法可以通过使用rolling函数来实现。首先,需要计算选取周期内的最大净值,即窗口滚动值里的最大值。这可以通过使用rolling函数后加.max()来实现。具体代码如下: ```python data['roll_max'] = pd.DataFrame(data)['close'].rolling(window=window, min_periods=1).max() ``` 接下来,计算当天的比,即当天股价与股价峰值之间的比例。具体公式为(当天股价 - 股价峰值)/股价峰值,可以通过下面的代码实现: ```python data['daily_dd'] = data['close'] / data['roll_max'] - 1 ``` 最后,计算选取周期内的最大比,取最小值作为最大。这里将比当成负数处理。具体代码如下: ```python data['max_dd'] = data['daily_dd'].rolling(window=window, min_periods=1).min() ``` 这样就可以得到带最大值的新数据。以上是计算股票最大Python代码实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [股票python量化交易016-计算最大](https://blog.csdn.net/Johnny2004/article/details/124918005)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值