Pandas矢量化可盈利CLO

2024-04-20 09:37:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到一个快速的实现,在那里我可以确定一种方法,找到出口点给定N个有利的关闭后,最初的触发信号

因此,为了明确定义一个有利可图的收盘价,假设我们刚刚收到一个多头信号,告诉我们现在以100的价格买入。退出策略是这样的:如果有N=2个收盘价(不一定是连续的),而价格高于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)

我的实现似乎只计算连续关闭。我需要找到一种方法来计算非连续盈利的收盘价。有什么想法吗


Tags: closesignalnpexitpricereplacelongpd
1条回答
网友
1楼 · 发布于 2024-04-20 09:37:28

下面的解决方案给出了所需关闭的,如果一个信号的关闭次数少于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

相关问题 更多 >