【问题标题】:Pairs Trading Strategy Pandas Update Position Based on Price配对交易策略 Pandas 根据价格更新头寸
【发布时间】:2020-10-21 06:59:23
【问题描述】:

我正在尝试运行交易对交易策略,但无法根据条件更新列。 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如果价格 A>B,则做多 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=6)所以现在改变仓位:做空 A 和做多 B。第五,股票 A 仍然高于 B,所以持有。

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

【问题讨论】:

    标签: python pandas dataframe conditional-statements trading


    【解决方案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
    

    【讨论】:

    • 非常感谢!效果很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    相关资源
    最近更新 更多