配对交易策略熊猫根据价格更新头寸

时间:2020-06-30 21:36:10

标签: python pandas dataframe conditional-statements trading

我正在尝试运行交易对交易策略,并且无法根据条件更新列。 DataFrame看起来像:

import pandas as pd

df = pd.DataFrame({'Stock A Price': [5,6,7,8,10],
                   'Stock B Price': [7,7,7,6,4]})

我不会创建根据以下策略更新的新列:df['Stock A Position']df['Stock B Position']:如果股票A价格小于df['Stock A Position'] == 'LONG'df['Stock B Position'] == 'SHORT'股票B反之亦然(如果价格A> B,则卖空A,卖出B)。但是,在获得头寸之后,df['Stock A Position']df['Stock B Position']都应更新为'HOLD',直到再次满足策略条件(价格交叉)。

输出应如下所示:

df = pd.DataFrame({'Stock A Price': [5,6,7,8,10],
                   'Stock B Price': [7,7,7,6,4]
                   'Stock A Position': ['LONG', 'HOLD', 'HOLD', 'SHORT', 'HOLD']
                   'Stock B Position': ['SHORT', 'HOLD', 'HOLD', 'LONG', 'HOLD]'})

例如,由于股票A价格= 5 <股票B价格= 7,第一行的A头寸多而B头头寸空头。下一行A仍然便宜(6比7),因此两者均要持有。第三,它们是相同的,因此继续持有。第四,这是股票交叉的位置(因为现在A = 8> B = 6),所以现在更改头寸:空头A和多头B。第五,股票A仍然高于B,因此保持不变。

请让我知道如何有效地执行此操作,并能够处理大型DataFrame。感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以先根据条件比较两列(A PriceB Price),然后使用结果比较行对以发现价格发生了变化。创建一个变量以保存偏移量,该偏移量将保存该列的positions,然后将上一步中获得的值map保存到这些列中。

import pandas as pd

df = pd.DataFrame({'Stock A Price': [5, 6, 7, 8, 10],
                'Stock B Price': [7, 7, 7, 6, 4]})


stg = df.iloc[:, 0] <= df.iloc[:, 1]
# create offset for "HOLD" status
to_map = stg + stg.eq(stg.shift()) * 2
to_map = to_map.clip(0, 2)

df['Stock A Position'] = to_map.map(lambda r: ["SHORT", "LONG", "HOLD"][r])
df['Stock B Position'] = to_map.map(lambda r: ["LONG", "SHORT", "HOLD"][r])

print(df)

df

的输出
   Stock A Price  Stock B Price Stock A Position Stock B Position
0              5              7             LONG            SHORT
1              6              7             HOLD             HOLD
2              7              7             HOLD             HOLD
3              8              6            SHORT             LONG
4             10              4             HOLD             HOLD