我有一个简单但有挑战性的算法问题要解决。你知道吗
我有一个交易员-股票-日级别的数据集,我想确定数据中的往返行程。往返只是数据中的特定序列。也就是说,如果你累积了一段时间内个人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
购买了两支股票(a
和b
)。delta
对应于某一天购买或出售的数量。所以你可以看到我们在stock a
(-10+10=0)和(+15-10-5=0)上有两个完整的往返,在stock a
上有两个未完成的往返(+5,在stock b
上有+6)。你知道吗
我希望能够创建一个变量tag
,告诉我这一点。也就是说,一个变量,当一个往返未终止时为0,对于给定的股票交易者组合中标识的第一、第二、第三等往返,取值1、2、3。你知道吗
你知道如何有效地做到这一点吗? 非常感谢!你知道吗
编辑:
建议的解决方案-似乎奏效-非常缓慢
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)
有什么想法吗? 多谢!!!!你知道吗
我会这样做:
这个想法是,每个交易者的记录都由一系列的往返组成,除了最后可能出现的情况;这假设了应该如何计算零增量周期。我们检测往返周期的所有结束,反向支持索引并用0填充其余部分
相关问题 更多 >
编程相关推荐