Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何识别熊猫数据集中的特定序列(往返)?_Python_Algorithm_Pandas_Finance - Fatal编程技术网

Python 如何识别熊猫数据集中的特定序列(往返)?

Python 如何识别熊猫数据集中的特定序列(往返)?,python,algorithm,pandas,finance,Python,Algorithm,Pandas,Finance,我有一个简单但有挑战性的算法问题要解决 我有一个交易员-股票-日级别的数据集,我想确定数据中的往返。往返只是数据中的特定序列。也就是说,如果你在一段时间内累积单个i的股票s的持有头寸,那么一个往返过程以零净持有头寸开始和结束 例如: pd.DataFrame({'trader' : ['a','a','a','a','a','a','a'], 'stock' : ['a','a','a','a','a','a','b'], 'day' :[

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

我有一个交易员-股票-日级别的数据集,我想确定数据中的往返。往返只是数据中的特定序列。也就是说,如果你在一段时间内累积单个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
)<代码>增量对应于给定日期购买或出售的数量。因此,您可以看到,我们在
股票a
(-10+10=0)和(+15-10-5=0)上有两个完整的往返行程,在
股票a
上有两个未完成的往返行程(+5个,在
股票b

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

你知道如何有效地做到这一点吗? 非常感谢

编辑:

  • 卖空是可能的。例如,卖出10、买入25、卖出25和买入10将是一次往返
  • 可以在同一天执行往返:在这种情况下,增量将为零(事实上,您当天买卖的数量相同)。这意味着在数据中,多个每日往返可以相互跟踪。因此,往返行程的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填充剩余部分。

如何处理卖空?如果允许的话,一个在第二天买入10并卖出20的交易者的产出是多少?卖空将以负开始。假设你卖10,然后你买10。这是完全合法的,但是如果在同一天被划过呢?您是强制零并有重复的天数,还是只显示当天的净变化?谢谢,但我得到
值错误:当我运行您的代码时,替换的长度必须等于序列长度
我的错误。我选中了
groupby('trader')
,但没有选中
groupby(['trader','stock'])
。此编辑应适用于上述示例。这个错误来自于组大小为1(一个交易者对一个给定的证券执行一次交易)。嗨,Yakym,显然我仍然有同样的问题。请看我编辑的帖子。我想代码中有一些拼写错误:
df
而不是
\u df
。请看我编辑的帖子。