Python聚集最近时间的金融交易

2024-04-30 03:56:54 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我收集了(在一个列表中)某段时间内(比如上午11点后的前5分钟)发生的n只股票的所有交易(为了简单起见,我将n=2设为以后进行调整)。假设我们有公司AAA和公司BBB(如果有帮助,liststocks=['AAA','BBB'])。这个列表看起来像:

    trades=[['AAA', '2011-01-03', '11:03:51', 21.5],['BBB', '2011-01-03','11:03:57', 31.5],
['AAA', '2011-01-03', '11:04:20', 21.55],
['BBB', '2011-01-03','11:04:19', 32.01], ['BBB', '2011-01-03','11:04:52', 31.7]]

也就是说,股票AAA有2次交易,BBB股票有3次交易。挑选每只股票的最后一笔交易会导致缺乏同步性的问题。这样做的目的是挑选每只股票的最后一笔交易,找出最早的交易(['AAA','2011-01-03',11:04:20',21.55])。然后选择时间尽可能接近“11:04:20”的所有其他股票的交易,这将导致我们选择['BBB','2011-01-03','11:04:19',32.01]。输出应为如下列表:

^{pr2}$

非常感谢!在


Tags: 目的列表时间公司交易trades股票bbb
2条回答

如果您将sortedkey参数一起使用,这并不难。在

下面是代码如果你不想看,我会在下面解释:

from datetime import datetime

trades=[['AAA', '2011-01-03', '11:03:51', 21.5],['BBB', '2011-01-03','11:03:57', 31.5],
['AAA', '2011-01-03', '11:04:20', 21.55],
['BBB', '2011-01-03','11:04:19', 32.01], ['BBB', '2011-01-03','11:04:52', 31.7]]

trades=[[i[0], datetime.strptime(i[1]+" "+i[2], "%Y-%m-%d %H:%M:%S"), i[3]] for i in trades]

most_liquid, *others, least_liquid = sorted(set(i[0] for i in trades), key=trades.count)

A=sorted((i for i in trades if i[0]==least_liquid), key=lambda n: n[1])[-1]
B=sorted((i for i in trades if i[0]==most_liquid), key=lambda n: abs(n[1]-A[1]))[0]

它首先将每个交易从使用时间的字符串表示转换为日期时间对象。它使用datetime.strptime类方法来实现这一点。然后通过分类交易来计算股票的流动性。*others可推广到{}个股票。然后它只过滤less_liquid交易,然后根据time参数对它们进行排序。然后它按名称more_liquid进行过滤,并根据它与A交易之间的绝对差异进行排序。在

所以您想要的对象是AB。它们不完全是您指定的,因为它们将使用datetime而不是字符串,但是使用^{}函数应该很容易修复。在

2种股票的解决方案是

    from datetime import *
    trades=[['AAA', '2011-01-03', '11:03:51', 21.5],['BBB', '2011-01-03','11:03:57', 31.5],
['AAA', '2011-01-03', '11:04:20', 21.55],
['BBB', '2011-01-03','11:04:19', 32.01], ['BBB', '2011-01-03','11:04:52', 31.7]]

stocknames = ['AAA','BBB']
A=[]
lastofeach=[]
for stock in stocknames:
    for t in trades:
        if t[0]==stock:
            A.append(t)
    A.sort(key=lambda e:(e[1], e[2]))
    lastofeach.append(A[-1])
    A[:]=[]
lastofeach.sort(key=lambda e:e[2])  

lastofeach=[[i[0], datetime.strptime(i[1]+" "+i[2], "%Y-%m-%d %H:%M:%S"), i[3]] for i in lastofeach]
trades=[[i[0], datetime.strptime(i[1]+" "+i[2], "%Y-%m-%d %H:%M:%S"), i[3]] for i in trades]


A=lastofeach[0]
B=(sorted((i for i in trades if i[0]!=A[0]), key=lambda n: abs(n[1]-A[1]))[0])
C=[A,B]
print (C)

(同样的答案也适用日期时间.strftime(A[1],%Y-%m-%d%H:%m:%S”),将其拆分并保存。在

如能为n>;2提供解决方案,我们将不胜感激。任何大的O优化都是受欢迎的。在

谢谢

相关问题 更多 >