gpt4 book ai didi

python - 如何识别 Pandas 数据集中的特定序列(往返)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:00:43 28 4
gpt4 key购买 nike

我有一个简单但具有挑战性的算法问题要解决。

我有一个交易员 - 股票 - 日级别的数据集,我想识别数据中的往返行程。往返只是数据中的特定序列。也就是说,如果您随着时间的推移累积个人 i 的股票 s 持有头寸,则往返的开始和结束都为零净持有头寸。

一个例子:

pd.DataFrame({'trader' : ['a','a','a','a','a','a','a'],
'stock' : ['a','a','a','a','a','a','b'],
'day' :[0,1,2,4,5,10,1],
'delta':[10,-10,15,-10,-5,5,6],
'cumq' : [10,0,15,5,0,5,6] ,
'tag': [1,1,2,2,2,0,0]})

输出

 Out[15]: 
cumq day delta stock tag trader
0 10 0 10 a 1 a
1 0 1 -10 a 1 a
2 15 2 15 a 2 a
3 5 4 -10 a 2 a
4 0 5 -5 a 2 a
5 5 10 5 a 0 a
6 6 1 6 b 0 a

在这里,您可以看到交易员 a 购买了两只股票(ab)。 delta 对应于给定日期购买或销售的数量。所以你可以看到我们在 stock a (-10 +10 = 0 ) 和 (+15 - 10 -5 =0) 上有两个完整的往返和两个未完成的往返 (在 stock a 上 +5,在 stock b 上 +6)。

我希望能够创建一个变量 tag 来告诉我这一点。也就是说,每当往返未终止时变量为 0,并且在给定的股票交易者组合中标识的第一、第二、第三等往返取值 1、2、3 等。

知道如何以有效的方式做到这一点吗?非常感谢!

编辑:

  • 卖空是可能的。例如卖出 10,买入 25,卖出 25 和买入 10 将是一次往返。
  • 可以在同一天进行往返:在这种情况下,delta 将为零(实际上,您当天买卖的数量相同)。这意味着每天的几个往返行程可以在数据中相互跟随。所以往返的 0 边界包括在内。示例:您今天买入 10 并卖出 10(delta = 0),然后您明天买入 15 并卖出 15(再次 delta = 0)。这些对应于两个不同的连续往返

建议的解决方案 - 似乎可行 - 非常慢

import pandas as pd
import numpy as np

df = pd.DataFrame({'trader' : ['a','a','a','a','a','a','a'],'stock' : ['a','a','a','a','a','a','b'], 'day' :[0,1,2,4,5,10,1],'delta':[10,-10,15,-10,-5,5,0] ,'out': [1,1,2,2,2,0,1]})

def proc_trader(_df):
_df['tag'] = np.nan
# make every ending of a roundtrip with its index
_df['tag'][df.cumq == 0] = range(1, (_df.cumq == 0).sum() + 1)
# backfill the roundtrip index until previous roundtrip;
# then fill the rest with 0s (roundtrip incomplete for most recent trades)
_df['tag'] = _df['tag'].fillna(method = 'bfill').fillna(0)
return _df

df.sort_values(by=['trader', 'stock','day'], inplace=True)
df['cumq']=df.groupby(['trader', 'stock']).delta.transform('cumsum')
df = df.groupby(['trader', 'stock']).apply(proc_trader)

有什么想法吗?非常感谢!!!!

最佳答案

我会做这样的事情:

import pandas as pd
import numpy as np

df = pd.DataFrame({'trader' : ['a','a','a','a','a','a','a'],'stock' : ['a','a','a','a','a','a','b'], 'day' :[0,1,2,4,5,10,1],'delta':[10,-10,15,-10,-5,5,6], 'cumq' : [10,0,15,5,0,6,11] ,'tag': [1,1,2,2,2,0,0]})

def proc_trader(_df):
if _df.shape[0] == 1:
_df['tag'] = _df['delta'] == 0
return _df

_df['tag'] = np.nan
# make every ending of a roundtrip with its index
_df['tag'][df.cumq == 0] = range(1, (df.cumq == 0).sum() + 1)
# backfill the roundtrip index until previous roundtrip;
# then fill the rest with 0s (roundtrip incomplete for most recent trades)
_df['tag'] = _df['tag'].fillna(method = 'bfill').fillna(0)
return _df

df = df.groupby(['trader', 'stock']).apply(proc_trader)

这个想法是,每个交易者的记录都由一系列往返行程组成,但最后可能除外;这假设了一些关于应该如何计算零增量周期的事情。我们检测往返周期的所有结束,反向传播索引并用 0 填充其余部分。

关于python - 如何识别 Pandas 数据集中的特定序列(往返)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36000824/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com