熊猫矢量化获利平仓

时间:2019-05-12 17:13:18

标签: python pandas quantitative-finance

我正在尝试找到一种快速的实现方式,在初始触发信号后N个获利平仓的情况下,我可以确定一种找到退出点的方法。

因此,为了清楚地定义一个有利可图的平仓,假设我们只是收到一个多头信号,告诉我们现在以100价格买入。退出策略是,如果有N = 2平仓,我们将平仓现有多头仓位(dosn (不必是顺序的),其中价格大于我们的入场价100。

signal = pd.DataFrame([0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0], columns=["signal"])
price = pd.DataFrame([100,99,100,99,98,101,99,99,98,90,102,90,103,20,110,120,130], columns=["price"])
data = pd.concat([signal,price],axis=1)

所以在上面我是一些示例数据。正确答案是在行索引10上退出。

我现在(错误地)这样做的方式是:

long_short = 1 # 1 equal going only only, -1 is going short
profit_n_exit = 2
sig_diffed = signal .diff().fillna(0.0).replace(-long_short,0)
sig_entry_px = (sig_diffed.replace(0,np.nan) * price ).fillna(method='pad')

# Profitable Closes Given Direction
exit_sig1 = ((np.sign(price  - sig_entry_px).fillna(0) == long_short) * 1)#.replace(0,np.nan)


# Cumulative Count of Profitable Closes
profit_close = (exit_sig1.groupby((exit_sig1 != exit_sig1.shift()).cumsum()).cumcount() + 1) * exit_sig1
profit_close = SignalFill(sig_diffed, sig_diffed.shift(profit_n_exit - 1)).replace(1,np.nan).replace(0,1) * profit_close
profit_close = ((profit_close >= profit_n_exit) * 1)

我的实现似乎只计算连续获利的连续收盘价。我还需要找到一种方法也可以计算非顺序的获利平仓。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

这是一个给出所需闭合的 values 值的解决方案,如果信号的闭合少于2个,则返回0:

def get_second(x):
    tmp = x[x.gt(x.iloc[0])]
    return 0 if len(tmp) < 2 else tmp.iloc[1]

data.groupby(data.signal.cumsum()).price.apply(get_second)

输出:

signal
0      0
1    102
Name: price, dtype: int64

如果要关闭的索引(行号):

def get_second_index(x):
    tmp = x[x.gt(x.iloc[0])]
    return -1 if len(tmp) < 2 else tmp.index[1]

(data.groupby(data.signal.cumsum())
     .price.apply(get_second_index))

给予

signal
0    -1
1    10
Name: price, dtype: int64

另一个测试用例:

signal = pd.DataFrame([0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1], columns=["signal"])
price = pd.DataFrame([100,99,100,99,98,101,99,99,98,90,102,90,103,20,110,120,130], columns=["price"])
data = pd.concat([signal,price],axis=1)
data

给予:

signal
0      0
1    102
2    120
3      0
Name: price, dtype: int64

signal
0    -1
1    10
2    15
3    -1
Name: price, dtype: int64