我正在尝试找到一种快速的实现方式,在初始触发信号后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)
我的实现似乎只计算连续获利的连续收盘价。我还需要找到一种方法也可以计算非顺序的获利平仓。有什么想法吗?
答案 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