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

Pairs Trading Strategy Pandas Update Position Based on Price

我正在尝试 运行 交易对交易策略,但我无法根据条件更新列。 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'],它们根据以下策略更新:df['Stock A Position'] == 'LONG'df['Stock B Position'] == 'SHORT' 如果股票 A 的价格是小于股票 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 头寸多头,B 头寸空头,因为股票 A 价格 = 5 < 股票 B 价格 = 7。下一行 A 仍然更便宜(6 比 7),所以两者都持有.第三,它们是一样的,所以继续持有。第四,这是股票交叉的地方(因为现在 A=8 > B=6)所以现在改变位置:做空 A 和做多 B。第五,股票 A 仍然高于 B,所以持有。

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

您可以先比较符合您条件的两列(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