5

我有一些基于每日收盘价的股票数据。我需要能够将这些值插入 python 列表并获得最后 30 次关闭的中值。有没有这样做的python库?

4

5 回答 5

10

在纯 Python 中,将数据放在 Python 列表中a,您可以这样做

median = sum(sorted(a[-30:])[14:16]) / 2.0

(这假设a至少有 30 个项目。)

使用 NumPy 包,您可以使用

median = numpy.median(a[-30:])
于 2011-03-30T12:29:49.010 回答
5

你考虑过熊猫吗?它基于numpy并且可以自动将时间戳与您的数据相关联,并丢弃任何未知日期,只要您使用numpy.nan. 它还通过 matplotlib 提供了一些相当强大的绘图功能。

基本上它是为python中的财务分析而设计的。

于 2011-03-30T12:32:22.860 回答
2

中位数不只是排序范围内的中间值吗?

所以,假设你的清单是stock_data

last_thirty = stock_data[-30:]
median = sorted(last_thirty)[15]

现在您只需要找到并修复一个错误并处理stock_data少于 30 个元素的情况......

让我们在这里尝试一下:

def rolling_median(data, window):
    if len(data) < window:
       subject = data[:]
    else:
       subject = data[-30:]
    return sorted(subject)[len(subject)/2]
于 2011-03-30T12:30:22.103 回答
1

#发现这很有帮助:

list=[10,20,30,40,50]

med=[]
j=0
for x in list:
    sub_set=list[0:j+1]
    median = np.median(sub_set)
    med.append(median)    
    j+=1
print(med)
于 2021-08-13T03:52:27.097 回答
0

这是一个更快的方法 w*|x| 空间复杂度。

def moving_median(x, w):
    shifted = np.zeros((len(x)+w-1, w))
    shifted[:,:] = np.nan
    for idx in range(w-1):
        shifted[idx:-w+idx+1, idx] = x
    shifted[idx+1:, idx+1] = x
    # print(shifted)
    medians = np.median(shifted, axis=1)
    for idx in range(w-1):
        medians[idx] = np.median(shifted[idx, :idx+1])
        medians[-idx-1] = np.median(shifted[-idx-1, -idx-1:])
    return medians[(w-1)//2:-(w-1)//2]

moving_median(np.arange(10), 4)
# Output
array([0.5, 1. , 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8. ])

输出与输入向量的长度相同。少于一个条目的行将被忽略,其中一半为 nans(仅适用于偶数窗口宽度),仅返回第一个选项。这是上面的 shift_matrix 和各自的中值:

[[ 0. nan nan nan] -> -
 [ 1.  0. nan nan] -> 0.5
 [ 2.  1.  0. nan] -> 1.0
 [ 3.  2.  1.  0.] -> 1.5
 [ 4.  3.  2.  1.] -> 2.5
 [ 5.  4.  3.  2.] -> 3.5
 [ 6.  5.  4.  3.] -> 4.5
 [ 7.  6.  5.  4.] -> 5.5
 [ 8.  7.  6.  5.] -> 6.5
 [ 9.  8.  7.  6.] -> 7.5
 [nan  9.  8.  7.] -> 8.0
 [nan nan  9.  8.] -> -
 [nan nan nan  9.]]-> -

可以通过调整最终切片来更改行为medians[(w-1)//2:-(w-1)//2]

基准:

%%timeit
moving_median(np.arange(1000), 4)
# 267 µs ± 759 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

替代方法:(结果将被转移)

def moving_median_list(x, w):
    medians = np.zeros(len(x))
    for j in range(len(x)):
        medians[j] = np.median(x[j:j+w])
    return medians

%%timeit
moving_median_list(np.arange(1000), 4)
# 15.7 ms ± 115 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Both algorithms have a linear time complexity. Therefore, the function moving_median will be the faster option.

于 2022-02-17T08:05:18.740 回答