我正在尝试运行交易对交易策略,并且无法根据条件更新列。 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。感谢您的帮助。
答案 0 :(得分:1)
您可以先根据条件比较两列(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