相关疑难解决方法(0)

计算*滚动*熊猫系列的最大缩编

编写一个计算时间序列最大值的函数非常容易.需要一点思考才能及时写出来O(n)而不是O(n^2)时间.但它并没有那么糟糕.这将有效:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

def max_dd(ser):
    max2here = pd.expanding_max(ser)
    dd2here = ser - max2here
    return dd2here.min()
Run Code Online (Sandbox Code Playgroud)

让我们设置一个简短的系列来试试吧:

np.random.seed(0)
n = 100
s = pd.Series(np.random.randn(n).cumsum())
s.plot()
plt.show()
Run Code Online (Sandbox Code Playgroud)

时间序列

正如预期的那样,max_dd(s)在-17.6附近显示出一些东西.好,很棒,很棒.现在说我有兴趣计算这个系列的滚动缩幅.即每个步骤,我想计算指定长度的前一个子系列的最大值.这很容易使用pd.rolling_apply.它的工作原理如下:

rolling_dd = pd.rolling_apply(s, 10, max_dd, min_periods=0)
df = pd.concat([s, rolling_dd], axis=1)
df.columns = ['s', 'rol_dd_10']
df.plot()
Run Code Online (Sandbox Code Playgroud)

滚动缩减

这非常有效.但感觉很慢.在pandas或其他工具包中是否有一个特别灵活的算法来快速完成这项工作?我开始写一些定制的东西:它跟踪各种中间数据(观察到的最大值的位置,先前发现的下降的位置),以减少许多冗余计算.它确实节省了一些时间,但不是很多,而且几乎没有尽可能多的时间.

我认为这是因为Python/Numpy/Pandas中的所有循环开销.但是我目前在Cython中还不够流利,真正知道如何从这个角度开始攻击它.我希望以前有人试过这个.或者,也许有人可能想看看我的"手工"代码,并愿意帮助我将其转换为Cython.


编辑:对于想要审查这里提到的所有功能(以及其他一些!)的人,请查看iPython笔记本:http://nbviewer.ipython.org/gist/8one6/8506455

它显示了这个问题的一些方法如何相关,检查它们是否给出相同的结果,并显示它们对各种大小的数据的运行时间.

如果有人有兴趣,我在帖子中提到的"定制"算法是rolling_dd_custom.我认为如果在Cython中实现,这可能是一个非常快速的解决方案.

python algorithm numpy pandas

22
推荐指数
1
解决办法
2万
查看次数

使用python中的矢量化解决方案计算最大下拉量

最大亏损是量化融资中常用的风险指标,用于评估经历的最大负回报.

最近,我对使用循环方法计算最大缩幅的时间变得不耐烦了.

def max_dd_loop(returns):
    """returns is assumed to be a pandas series"""
    max_so_far = None
    start, end = None, None
    r = returns.add(1).cumprod()
    for r_start in r.index:
        for r_end in r.index:
            if r_start < r_end:
                current = r.ix[r_end] / r.ix[r_start] - 1
                if (max_so_far is None) or (current < max_so_far):
                    max_so_far = current
                    start, end = r_start, r_end
    return max_so_far, start, end
Run Code Online (Sandbox Code Playgroud)

我很熟悉矢量化解决方案会更好的普遍看法.

问题是:

  • 我能把这个问题矢量化吗?
  • 这个解决方案是什么样的?
  • 它有多好处?

编辑

我将Alexander的答案修改为以下函数:

def max_dd(returns):
    """Assumes returns is a pandas Series"""
    r = …
Run Code Online (Sandbox Code Playgroud)

python numpy quantitative-finance pandas

13
推荐指数
1
解决办法
5111
查看次数

标签 统计

numpy ×2

pandas ×2

python ×2

algorithm ×1

quantitative-finance ×1