Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.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_Pandas - Fatal编程技术网

Python-投资组合未平仓标志

Python-投资组合未平仓标志,python,pandas,Python,Pandas,我在下面有一个数据框: ticker date buy_fg sell_fg 50 ABC 2010-01-01 0.0 2.0 51 ABC 2010-01-08 0.0 2.0 52 ABC 2010-01-15 0.0 2.0 53 ABC 2010-01-22 0.0 2.0 1512 ABC 2010-01-29 1.0 0.0 54

我在下面有一个数据框:

 ticker       date  buy_fg  sell_fg
50      ABC 2010-01-01     0.0      2.0
51      ABC 2010-01-08     0.0      2.0
52      ABC 2010-01-15     0.0      2.0
53      ABC 2010-01-22     0.0      2.0
1512    ABC 2010-01-29     1.0      0.0
54      ABC 2010-02-05     0.0      2.0
55      ABC 2010-02-12     0.0      2.0
56      ABC 2010-02-19     0.0      2.0
57      ABC 2010-02-26     0.0      2.0
58      ABC 2010-03-05     0.0      2.0
59      ABC 2010-03-12     0.0      2.0
60      ABC 2010-03-19     0.0      2.0
61      ABC 2010-03-26     0.0      2.0
1417    ABC 2010-04-02     1.0      0.0
1409    ABC 2010-04-09     1.0      0.0
62      ABC 2010-04-23     0.0      2.0
63      ABC 2010-05-07     0.0      2.0
64      ABC 2010-05-14     0.0      2.0
65      ABC 2010-05-21     0.0      2.0
66      ABC 2010-05-28     0.0      2.0
我正试图开发一个专栏,提供我的脚本需要采取的行动的摘要。我曾尝试开发一种累积分数方法,但一直未能成功。我也尝试过lambda,但是逻辑不正确,因为它只是重复了
buy\u fg

# Initiate the global, default buy flag
hold_flag =  False
 
# Custom function to flick the global flag based on `buy_fg` column
def hold(value):
    global hold_flag 
    if value == 1:
        if hold_flag is False:
            hold_flag = True
            return '3'
        if hold_flag is True:
            hold_flag = False
            return '1'
    else:
        return '0'

new_report['hold_fg'] = new_report['buy_fg'].apply(hold)
这将创建
hold\u fg
列。但是现在我需要扩展这一点来考虑所有三个代码> *ffg< /Cord>列,以提供最终的动作。< /P>
      ticker       date  buy_fg  sell_fg  action hold_fg
50      ABC 2010-01-01     0.0      2.0       0       0
51      ABC 2010-01-08     0.0      2.0       0       0
52      ABC 2010-01-15     0.0      2.0       0       0
53      ABC 2010-01-22     0.0      2.0       0       0
1512    ABC 2010-01-29     1.0      0.0       0       1
54      ABC 2010-02-05     0.0      2.0       0       0
55      ABC 2010-02-12     0.0      2.0       0       0
56      ABC 2010-02-19     0.0      2.0       0       0
57      ABC 2010-02-26     0.0      2.0       0       0
58      ABC 2010-03-05     0.0      2.0       0       0
59      ABC 2010-03-12     0.0      2.0       0       0
60      ABC 2010-03-19     0.0      2.0       0       0
61      ABC 2010-03-26     0.0      2.0       0       0
1417    ABC 2010-04-02     1.0      0.0       0       1
1409    ABC 2010-04-09     1.0      0.0       0       3
62      ABC 2010-04-23     0.0      2.0       0       0
63      ABC 2010-05-07     0.0      2.0       0       0
64      ABC 2010-05-14     0.0      2.0       0       0
65      ABC 2010-05-21     0.0      2.0       0       0
66      ABC 2010-05-28     0.0      2.0       0       0
我尝试了以下方法,但无效:

new_report['action'] = 0

buy_flag = False

def action(value):
    global buy_flag
    if new_report['hold_fg'] == 1:
        buy_flag = True
        return 'BUY'
    if new_report['hold_fg'] == 3:
        buy_flag = True
        return 'HOLD'
    if new_report['sell_fg'] == 2:
        buy_flag = False
        return 'SELL'
    else:
        return '0'
有没有办法解决这个问题

更新的预期产出:

     ticker       date  buy_fg  sell_fg action hold_fg
50      ABC 2010-01-01     0.0      2.0    NIL       0
51      ABC 2010-01-08     0.0      2.0    NIL       0
52      ABC 2010-01-15     0.0      2.0    NIL       0
53      ABC 2010-01-22     0.0      2.0    NIL       0
1512    ABC 2010-01-29     1.0      0.0    BUY       1
54      ABC 2010-02-05     0.0      2.0   SELL       0
55      ABC 2010-02-12     0.0      2.0    NIL       0
56      ABC 2010-02-19     0.0      2.0    NIL       0
57      ABC 2010-02-26     0.0      2.0    NIL       0
58      ABC 2010-03-05     0.0      2.0    NIL       0
59      ABC 2010-03-12     0.0      2.0    NIL       0
60      ABC 2010-03-19     0.0      2.0    NIL       0
61      ABC 2010-03-26     0.0      2.0    NIL       0
1417    ABC 2010-04-02     1.0      0.0    BUY       1
1409    ABC 2010-04-09     1.0      0.0    HOLD      3
62      ABC 2010-04-23     0.0      2.0    SELL      0
63      ABC 2010-05-07     0.0      2.0    NIL       0
64      ABC 2010-05-14     0.0      2.0    NIL       0
65      ABC 2010-05-21     0.0      2.0    NIL       0
66      ABC 2010-05-28     0.0      2.0    NIL       0

我认为您需要跟踪状态,并在此基础上应用所需的逻辑。下面是一个使用自定义函数来实现这一点的示例。希望这有帮助

 # Initiate the global, default buy flag
 >>> buy_flag =  False
 
 # Custom function to flick the global flag based on `buy_fg` column
 >>> def sell_or_buy(value):
    global buy_flag 
    if value == 1:
        if buy_flag is False:
            buy_flag = True
            return 'BUY'
        if buy_flag is True:
            return 'HOLD'
    if value == 0:
        if buy_flag == 1:
            buy_flag = False
            return 'SELL'
        if buy_flag == 0:
            return 'NIL'

>>> df['action'] = df['buy_fg'].apply(sell_or_buy)

>>> df
    ticker            date  buy_fg  sell_fg action
0       50  ABC 2010-01-01     0.0      2.0    NIL
1       51  ABC 2010-01-08     0.0      2.0    NIL
2       52  ABC 2010-01-15     0.0      2.0    NIL
3       53  ABC 2010-01-22     0.0      2.0    NIL
4     1512  ABC 2010-01-29     1.0      0.0    BUY
5       54  ABC 2010-02-05     0.0      2.0   SELL
6       55  ABC 2010-02-12     0.0      2.0    NIL
7       56  ABC 2010-02-19     0.0      2.0    NIL
8       57  ABC 2010-02-26     0.0      2.0    NIL
9       58  ABC 2010-03-05     0.0      2.0    NIL
10      59  ABC 2010-03-12     0.0      2.0    NIL
11      60  ABC 2010-03-19     0.0      2.0    NIL
12      61  ABC 2010-03-26     0.0      2.0    NIL
13    1417  ABC 2010-04-02     1.0      0.0    BUY
14    1409  ABC 2010-04-09     1.0      0.0   HOLD
15      62  ABC 2010-04-23     0.0      2.0   SELL
16      63  ABC 2010-05-07     0.0      2.0    NIL
17      64  ABC 2010-05-14     0.0      2.0    NIL
18      65  ABC 2010-05-21     0.0      2.0    NIL
19      66  ABC 2010-05-28     0.0      2.0    NIL
编辑: 这是为了满足您的最新要求。由于您更新问题的方式现在有点混乱,我将修改我的答案以添加到上面的数据框中

>>> d={'NIL': 0, 'BUY': 1, 'SELL': 2, 'HOLD' : 3}
>>> df['hold_fg'] = df.action.map(d)
>>> df
    ticker            date  buy_fg  sell_fg action  hold_fg
0       50  ABC 2010-01-01     0.0      2.0    NIL        0
1       51  ABC 2010-01-08     0.0      2.0    NIL        0
2       52  ABC 2010-01-15     0.0      2.0    NIL        0
3       53  ABC 2010-01-22     0.0      2.0    NIL        0
4     1512  ABC 2010-01-29     1.0      0.0    BUY        1
5       54  ABC 2010-02-05     0.0      2.0   SELL        2
6       55  ABC 2010-02-12     0.0      2.0    NIL        0
7       56  ABC 2010-02-19     0.0      2.0    NIL        0
8       57  ABC 2010-02-26     0.0      2.0    NIL        0
9       58  ABC 2010-03-05     0.0      2.0    NIL        0
10      59  ABC 2010-03-12     0.0      2.0    NIL        0
11      60  ABC 2010-03-19     0.0      2.0    NIL        0
12      61  ABC 2010-03-26     0.0      2.0    NIL        0
13    1417  ABC 2010-04-02     1.0      0.0    BUY        1
14    1409  ABC 2010-04-09     1.0      0.0   HOLD        3
15      62  ABC 2010-04-23     0.0      2.0   SELL        2
16      63  ABC 2010-05-07     0.0      2.0    NIL        0
17      64  ABC 2010-05-14     0.0      2.0    NIL        0
18      65  ABC 2010-05-21     0.0      2.0    NIL        0
19      66  ABC 2010-05-28     0.0      2.0    NIL        0

根据你的
行动
专栏,你的思路是正确的,但我无法理解你的问题,你现在到底错过了什么?有点困惑。你能详细说明一下吗?
只有在“购买已注册”的情况下,才需要显示“卖出”
?您要查找的预期输出是什么?使用逻辑和预期输出进行了更新。既然您已经更新/更改了问题,您是否可以再次更新预期输出?更新-与您更新的解决方案的唯一区别是索引1417、1409和62谢谢,这让我更进一步,但是我已经用一些后续挑战更新了这个问题。嘿,不用担心,我会看一看,但是你不应该更新你的原始问题,因为它现在使我的答案完全无用,因为它做了你最初需要/要求的,并且基本上使我的答案无效(想象有人第一次读到这篇文章——我的答案对问题的内容完全无效)…我会看一看你的逻辑,但我会建议恢复你的问题并保留历史记录。这样,其他人可能会给你更好的整体解决方案。最好是每次保留一个问题。希望这有意义