配对交易策略 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 Price
和 B 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
我正在尝试 运行 交易对交易策略,但我无法根据条件更新列。 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 Price
和 B 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