首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -在window中聚合时间最短的金融事务

Python -在window中聚合时间最短的金融事务
EN

Stack Overflow用户
提问于 2015-06-08 10:34:08
回答 2查看 183关注 0票数 0

假设我(在一个列表中)收集了n只股票在一段时间内(比如上午11点后的前5分钟)进行的所有交易(为了简单起见,我将使用n=2,稍后再进行调整)。假设我们有固定的AAA和固定的BBB (如果有帮助,liststock=‘AAA’,'BBB')。这个列表看起来像是这样:

代码语言:javascript
复制
    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]]

例如,2笔股票AAA交易和3笔股票BBB交易。选择每只股票的最后一笔交易会导致缺乏同步性问题。我们的想法是选择每只股票的最后一笔交易,并找到最早的('AAA','2011-01-03','11:04:20',21.55)。然后选择时间尽可能接近'11:04:20‘的所有其他股票的交易,这将导致我们选择'BBB','2011-01-03','11:04:19',32.01。输出应该是如下所示的列表:

代码语言:javascript
复制
    C=[['AAA', '2011-01-03', '11:04:20', 21.55],['BBB', '2011-01-03','11:04:19', 32.01]]

非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2015-06-08 10:55:01

如果你使用带有key参数的sorted,这并不难。

这是代码,如果你不想读,我会在后面解释:

代码语言:javascript
复制
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对象。它使用datetime.strptime类方法来实现这一点。然后,通过对交易进行排序,计算股票的流动性。该*others可推广到n股票。然后,它只过滤less_liquid交易,然后根据时间参数对它们进行排序。然后,它按名称more_liquid进行过滤,并按它与A交易之间的绝对差异进行排序。

所以你想要的对象是AB

票数 1
EN

Stack Overflow用户

发布于 2015-06-08 13:36:01

两只股票的解决方案是

代码语言:javascript
复制
    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)

(对于完全相同的答案,只需应用datetime.strftime(A1,“%Y-%m-%d%H:%M:%S”),拆分它并保存即可。

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

谢谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30700533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档