在 Python 中的库存数据上使用滑动 Window 进行目标标记

Target Labeling Using Sliding Window On Stock Data In Python

我正在尝试将 BUYSELLHOLD 值标记为根据我在一篇论文中找到的算法收盘股票价格。我不太清楚我遇到的错误。非常感谢你的帮助。谢谢。

算法:

[编辑]

我的实现:

window_size = 11
counter = 0
result = []

window_begin_idx=0; window_end_idx=0; window_middle_idx=0; min_idx=0; max_idx=0;

while counter < len(closing_price):
    if counter > window_size:

        window_begin_idx = counter - window_size
        window_end_idx = window_begin_idx + window_size - 1
        window_middle_idx = (window_begin_idx + window_end_idx)//2
        
        for i in range(window_begin_idx, window_end_idx+1):
            rng = closing_price[window_begin_idx:window_end_idx+1]
            number = closing_price[i]
            mins = rng.min()
            maxs = rng.max()
            if number < mins:
                mins=number
                min_idx = np.argmin(rng)
            if number > maxs:
                maxs=number
                max_idx = np.argmax(rng)

        if max_idx == window_middle_idx:
            result.append("SELL")
        elif min_idx == window_middle_idx:
            result.append("BUY")
        else:
            result.append("HOLD")
         
        mins = 0.0
        maxs = 10000.0
    counter+=1

根据作者的JAVA代码编辑后,我只得到HOLD标签。作者的实现是here.

您需要在主循环之前用适当的值初始化 mins, maxs, min_idx and max_idx

在你的情况下 if max_idx == 比任何 max_idx 赋值发生得早

请求更改后编辑:

似乎在 Python 中,您可以使用类似的行为替换整个 for 循环:

 rng = closing_price[window_begin_idx:window_end_idx+1]
 mins = rng.min()
 maxs = rng.max()
 min_idx = rng.index(mins)
 max_idx = rng.index(maxs)

通过阅读作者的实现并按照MBo提供的建议,我设法解决了这个问题。所以,现在 python 想要这个算法的人,下面是代码:

window_size = 11
counter = 0
result = []
 
window_begin_idx=0; window_end_idx=0; window_middle_idx=0; min_idx=0; max_idx=0; 
number=0.0; mins=10000.0; maxs=0.0

while counter < len(closing_price):
    if counter > window_size:
        window_begin_idx = counter - window_size
        window_end_idx = window_begin_idx + window_size - 1
        window_middle_idx = (window_begin_idx + window_end_idx)//2
        
        for i in range(window_begin_idx, window_end_idx+1):
            
            number = closing_price[i]
            
            if number < mins:
                mins=number
                min_idx = np.where(closing_price==mins)[0][0]
            if number > maxs:
                maxs=number
                max_idx = np.where(closing_price==maxs)[0][0]

        if max_idx == window_middle_idx:
            result.append("SELL")
        elif min_idx == window_middle_idx:
            result.append("BUY")
        else:
            result.append("HOLD")
        
        mins = 10000.0
        maxs = 0.0
        
    counter+=1