在 Python 中创建交易信号变量

问题描述 投票:0回答:1

我有一个包含价格系列和该价格系列的 z 分数的数据框。我想为具有以下条件的买入和卖出信号创建一个

signal
变量:

  • 如果标准化价格低于均值 -1.96 标准差,则买入信号 (=1),并在其低于均值时平仓买入头寸
  • 如果标准化价格高于均值 +1.96 标准差,则卖出信号 (=-1),并在其高于均值时平仓。

当标准化变量穿过上限和下限时,我可以使用

np.where
创建买入和卖出信号,但我试图保持仓位,直到它穿过均值。

代码如下:

# Create a DataFrame with the signal and position size in the pair
trades = pd.concat([zscore(df_kalman), df_kalman], axis=1)
trades.columns = ["signal", "position"]
trades['mean'] = trades['signal'].mean()
trades['upper'] = trades['mean'] + 1.96*trades['signal'].std()
trades['lower'] = trades['mean'] - 1.96*trades['signal'].std()

trades["side"] = 0.0
trades['side'] = np.where((trades['signal'] > trades['upper']), -1, 0)
trades['side'] = np.where(((trades['signal'] > trades['mean']) & (trades['side'].shift(1) == -1)), -1, trades['side'])
trades['side'] = np.where((trades['signal'] < trades['lower']), 1, trades['side'])
trades['side'] = np.where(((trades['signal'] < trades['mean']) & (trades['side'].shift(1) == 1)), 1, trades['side'])

下图:

python pandas numpy trading algorithmic-trading
1个回答
0
投票

您正在尝试根据 z 分数和某些条件创建交易信号。如果您想保持仓位直到其穿过均值,您可以调整您的逻辑。这是修改后的代码:

import numpy as np
import pandas as pd

np.random.seed(42)
price_data = np.random.randn(100)
df_kalman = pd.DataFrame({'price': price_data})

z_score = (df_kalman['price'] - df_kalman['price'].mean()) / df_kalman['price'].std()

trades = pd.DataFrame(index=df_kalman.index)
trades['z_score'] = z_score

trades['mean'] = trades['z_score'].mean()
trades['upper'] = trades['mean'] + 1.96 * trades['z_score'].std()
trades['lower'] = trades['mean'] - 1.96 * trades['z_score'].std()

trades['side'] = 0.0
trades.loc[trades['z_score'] < trades['lower'], 'side'] = 1
trades.loc[(trades['z_score'] > trades['mean']) & (trades['side'].shift(1) == 1), 'side'] = 0

trades.loc[trades['z_score'] > trades['upper'], 'side'] = -1
trades.loc[(trades['z_score'] < trades['mean']) & (trades['side'].shift(1) == -1), 'side'] = 0

trades['side'] = trades['side'].ffill()
print(trades)
© www.soinside.com 2019 - 2024. All rights reserved.