量化策略开发,高质量社群,交易思路分享等相关内容
趋势聚焦
微小价格变动是否只是噪音(OBV部分)
通过过滤掉微小的价格变动来突出趋势,交易可以得到改进吗?这里有两个测试案例可以帮助你弄清楚。
如果你忽略价格的微小变化,趋势会更准确吗?
S&P指数或任何股票上涨或下跌1点或1/10的百分点真的有关系吗?这些天数只是噪音,还是在我们计算移动平均系统或其他趋势交易系统时它们是重要的?
公平地说,移除这些微小的价格变动可能会改善一种方法而非另一种,因此我们将看看两种非常不同的趋势技术,看看是否有任何一致性。
平衡成交量
我们将从Joseph Granville在1963年引入的平衡成交量(OBV)开始。这似乎是该理念的自然应用。它使用价格变化来基于成交量创建趋势线。规则很简单:
如果今天的S&P价格收盘较高,则将今天的交易总量加到OBV上。如果S&P收盘较低,则从OBV中减去今天的总成交量。
当我首次研究OBV概念时,我并不确定OBV的累积值是否与价格的趋势有关系。毕竟,它只使用成交量。图1显示了将OBV(下图)应用于SPY时的波动性比价格要小,且具有相同的模式。
我在2000年到2022年10月期间测试了SPY的多头趋势移动平均线,并在SPY上基于OBV进行了测试。两者的最佳表现是80天的趋势,如图1所示。价格显示在顶部面板中,OBV显示在底部面板中。
图1:平衡成交量(OBV)。显示了一个价格图表,上面有一个SPY的80天移动平均线和OBV的80天移动平均线。OBV的波动性比价格小,但具有相同的模式。
应用优化的最低价格过滤器
我们仍然使用OBV,想知道最低价格过滤器是否能改善结果。我们创建了一个新的序列,去除低于阈值过滤器下的任何价格移动。我测试了0到1%的过滤器,应用于80天的移动平均线,结果显示在图2中,其中0.80的过滤器提供了最佳结果(非常大)。你需要使用一个百分比过滤器,这样它才能随着价格水平的变化而变化。
给定一个移动平均线(80天)和一个价格过滤器(80个基点,或“bp”),我们发现使用过滤器的结果要好得多(如图2所示)。但是,这只是一个优化的结果,还是这个概念本身就具有鲁棒性?
图2:OBV趋势交易系统带有和不带有过滤器的比较。将优化的过滤器(即将最小移动作为价格过滤器)应用于80天的移动平均线和价格过滤器(80个基点的最小移动)后,我们发现使用过滤器后的结果要好得多。
为了找出这是一个异常现象还是使用一个小过滤器确实改善了大多数情况下的结果,我们首先查看其他过滤器对80天移动平均线的影响(如图3所示),然后我们看看80个基点过滤器是否适用于所有的移动平均计算周期(如图4所示)。这并没有涵盖所有的组合,但增加了我们对该概念的信心。
图3:使用一个滤波器和一系列移动平均值。图2的结果稳健吗?为了找出答案,我们可以看看其他滤波器如何影响 80 天平均值。在这里,将 80个基点的滤波器应用于 OBV 的移动平均值范围。
图4:使用一系列价格过滤器和一个移动平均线。与图3形成对比的是,这里将一系列的价格过滤器应用到80天的OBV移动平均线中。
在图3和图4中,最小价格过滤器在大多数情况下提高了回报率,如在水平线上的收益所示。总的来说,使用最小价格过滤器似乎是有效的。
代码
Params
Numeric period(60); // 移动平均周期
Numeric minpricechange(0.01); // 最小价格变化百分比,
Bool longonly(true); // 仅做多,false为多空双向
Bool usefutures(true); // 使用期货,False为股票
Numeric Fund(20000); //投入保证金;
Vars
Numeric investment(0); // 当前投资金额
SeriesMAOBV(0); // OBV的移动平均
Numeric size(0); // 合约数量
SeriesOBVlocal(0); //本地OBV值
Seriescond;
Serieskcond;
Events
// Bar更新事件函数
OnBar(ArrayRefindexs)
{
// 计算本地OBV值
If(Close > Close[1] *(1+minpricechange))
{
OBVlocal = OBVlocal[1] + Vol;
}
Else If(Close < Close[1] *(1-minpricechange))
{
OBVlocal = OBVlocal[1] - Vol;
}
Else
{
OBVlocal = OBVlocal[1];
}
// 计算OBV的移动平均值
MAOBV = Average(OBVlocal, period);
cond=IIF(MAOBV > MAOBV[1] ,1,0);
kcond=IIF(MAOBV < MAOBV[1] ,1,0);
Commentary("OBVlocal"+text(OBVlocal));
Commentary("MAOBV"+text(MAOBV));
Commentary("MAOBV[1]"+text(MAOBV[1]));
Commentary("cond[1]"+text(cond[1]));
If(usefutures)
{
size = max(1,Round(Fund*0.01 / (AvgTrueRange(20) * BigPointValue*ContractUnit/rollover),0));
}
Else
{
// 否则,计算股票的合约数量
size = Fund / Close;
}
// 如果OBV的移动平均值上升并且当前没有多头头寸
If(cond[1]>0 and MarketPosition !=1)
{
// 开仓多头头寸
Buy(size, Open);
}
// 如果OBV的移动平均值下降并且当前没有空头头寸
If(kcond[1]>0 And MarketPosition !=-1)
{
// 平仓所有头寸
If(Not longonly)
{
// 开仓空头头寸
SellShort(size, Open);
}
// 如果允许做空,并且当前没有空头头寸
}
If(kcond[1]>0 and MarketPosition >0 ) //多平
{
Sell(0, Open);
}
If(cond[1]>0 and MarketPosition <0 ) //空平
{
BuyToCover(0, Open);
}
}
微小波动过滤研究
(下-均线部分)
应用最小价格过滤器到标准移动平均交易系统
并非许多交易者会选择OBV,因此我们将最小价格过滤器应用于一个标准的移动平均系统。
通过选择更快的移动平均线而不是一个特别好的移动平均线,我们可以看到一个小的过滤器如何与原来的思路一致。从图5中我们可以看到50天的计算期是盈利的,但并不是最好的。我们将应用一个小过滤器来忽略这些小的价格波动。
图5:在标准移动平均交易系统上应用最小价格过滤器。显示的是从2000年到2022年10月在SPY上的一系列回测的结果。80天移动平均线表现最佳。
图5:移动平均系统。显示的是从2000年到2022年10月在SPY上测试不同回溯期的移动平均线的结果。80天的移动平均线表现最佳。
然而,过滤器将交易数量减少到只有3次,而原始移动平均线有48次。
我们可以将最小价格移动与80天移动平均线结合使用,看看它是否改善了结果。最好的测试结果是95个基点,相当大。结果如图6所示。总利润要高得多,尽管风险也更高。真正的问题在于,使用过滤器后只有3笔交易,而原始移动平均线有48笔交易。对于大多数人来说,这是不可接受的。我们需要从不同的角度来看待这个问题。
图6:测试具有80天移动平均线的最小价格移动。比较了带有和不带有95个基点(1基点=0.0001)最小移动作为价格过滤器的80天移动平均线。带有过滤器的利润要高得多,尽管风险更高。然而,过滤器将交易数量减少到只有3次,而原始移动平均线有48次。
应用最小门槛到更快的移动平均线
通过选择更快的移动平均线而不是一个特别好的移动平均线,我们可以看到一个小的过滤器如何与原来的思路一致。从图5中我们可以看到50天的计算期是盈利的,但并不是最好的。我们将应用一个小过滤器来忽略这些小的价格波动。
图7:应用不同大小的价格过滤器来忽略小的价格变动。这里使用的趋势系统是SPY上的50天移动平均线。测试中应用的过滤器大小为5、10、和25个基点。图7显示了结果。在四个净资产值(NAV)中,没有最小价格过滤器的那个表现最差;具有最大价格过滤器的那个表现最佳。
在四个净资产值(NAV)中,没有应用任何最低价格过滤器的那个表现最差;而应用了最大过滤器的那个表现最好。图8中的统计数据表明,随着过滤器的增大,回报不仅有所提升,风险回报比也有所改善。我们还希望交易次数至少与没有过滤器的情况一样多,这一点也得到了满足。
图8:本例的统计结果。统计结果如图8所示,你可以看到,随着过滤器变大,回报不仅提高了,而且风险回报比也提高了。此外,交易数量现在至少和没有应用过滤器的情况一样多。
结论
这些有限的测试表明,移除小的价格波动改善了两个趋势系统的结果——OBV系统和标准移动平均系统。尽管这确实需要创建一个新的价格序列,将小的价格波动去除,但改进似乎是值得的。你可以使用本文中的代码来准备你的价格序列,以忽略小的价格波动。
代码
源码已经上传至俱乐部,小助理:viquant01 加入2024俱乐部下载