在Python中使用百分位数生成交易信号
无论是风险管理还是策略制定,统计概念始终存在于交易中。百分位数是描述性统计的支柱之一,但是它们对交易有帮助吗?本文将讨论使用百分位数进行交易。
百分位数的概念
百分位只是一个阈值,其中一定百分比的值位于当前值之下。
这是一个更详细的示例:
如果您在CFA II级考试中的得分在第90个百分点左右,则意味着您的得分超过了90%。
如果相对于最近的10个价格柱,EURUSD的收盘价位于第100个百分位,则意味着收盘价是最近10个值中的最高价。
在统计中,通常将第25个百分位数称为四分位数,将第50个百分位数称为中位数,将第75个百分位数称为第三四分位数。
百分范围指示器
百分比范围指示器将围绕市场价格循环,并仅输出相对于选定回溯期的当前市场价格的百分比。例如,考虑以下三个最新值:
当我们从最小到最大重新排列它们时,我们得到下表:
我们发现我们的最新值1.42848位于中间。这相当于百分之五十。因此,我们也可以说1.42848是此三个值范围内的中位数。
该指标的想法是准确地执行上述操作,但是回溯期更长。这可以帮助我们在极端情况下生成信号。
要创建百分比范围指示器,我们需要一个带有额外的空列的OHLC数据数组。这可以通过使用以下代码来完成:
# Defining the function that adds a certain number of columnsdef adder(Data, times): for i in range(1, times + 1): z = np.zeros((len(Data), 1), dtype = float) Data = np.append(Data, z, axis = 1) return Data# Adding 1 extra columnmy_data = adder(my_data, 1)
接下来,我们应该导入必要的库:
import numpy as npfrom scipy import stats
最后,只需定义滚动计算百分位数的函数即可:
def percentile_range_indicator(Data, lookback, what, where):for i in range(len(Data)): Data[i, where] = stats.percentileofscore(Data[i - lookback + 1:i, what], Data[i, what]) return Data# Using the functionmy_data = percentile_range_indicator(my_data, 14, 3, 4)
第一个面板中的EURUSD在第二个面板中具有14周期百分比范围指示器。
即使我们不会对以下想法进行回测(相反,我们将对上述原始指标进行回测),但有趣的是,我们可以对指标应用3个周期的移动平均线以使其平滑并使用它进行自由交易。可以将移动平均线的代码记录为以下内容:
def ma(Data, lookback, what, where): for i in range(len(Data)): try: Data[i, where] = (Data[i - lookback + 1:i + 1, what].mean()) except IndexError: pass return Data
第一个面板中的EURUSD在第二个面板中带有14个周期的百分比范围指标以及其三个时期的移动平均线。
如果我们只想保持移动平均线,我们可以得到上面的平滑图:
第一个面板中的EURUSD具有14个周期百分比范围指标的3个周期移动平均值。
回测简单策略
与任何适当的研究方法一样,其目的是对指标进行回测,并能够自己查看是否值得将其作为我们先前存在的交易框架的补充。请注意,以下内容仅对过去10年中仅对10个货币对的一个时间范围进行回测。这可能不是该策略的最佳时限,但我们只是试图找到一种“一刀切”的“几乎适合所有人”的策略。
条件符合预期:
只要百分位数范围指示器达到0.00并且前两个值都大于0.00,就买多(买入)。保持该位置,直到收到新信号(该位置已关闭)。
每当百分位数范围指示器达到100并且先前的两个值均低于100时,做空(卖出)。保持该位置直到获得新的信号(该位置关闭)。
我们想在我们称为“ buy ”的列中输入1 ,在我们称为“ sell ”的列中输入-1 。稍后,您可以创建一个函数,该函数通过在这两列之间循环并采用市场价格差异来计算近似交易策略的收益和损失,从而计算收益和损失。然后,您可以使用使用止损单和获利单的风险管理功能。
下面是一个信号图的示例,其中绿色箭头表示买入触发,红色箭头表示卖空触发。
def signal(Data, what, buy, sell): for i in range(len(Data)): if Data[i, what] == lower_barrier and Data[i - 1, what] > lower_barrier and Data[i - 2, what] > lower_barrier : Data[i, buy] = 1 if Data[i, what] == upper_barrier and Data[i - 1, what] < upper_barrier and Data[i - 2, what] < upper_barrier : Data[i, sell] = -1
该策略遵循AUDCAD信号图。
不会将风险管理技术用于此回测。每轮交易的交易成本为0.5点。自2010年1月以来,每小时进行回测的数据。
效果摘要表。
遵循百分比范围策略的净值曲线。
结论
如果您经常阅读我的文章,您会发现我开发或优化的许多指标具有很高的命中率,并且平均而言是有利可图的。这主要是由于我使用的风险管理方法。但是,市场的随机性以及许多表现不佳的公司将失败归咎于技术分析的事实又如何呢?
首先,在启动之前和启动之后,我会不断在Twitter上发布交易日志以显示结果。这样可以确保透明度。我还每1-3个月在Twitter上发布一次跟踪记录。但是,我绝不保证任何回报或卓越的技能。至于我开发的指标,我经常在个人交易中使用它们。因此,我没有发表偏见研究的动机。我的目标是分享我从在线社区中学到的知识。
记住要经常做背部测试。即使我提供了指标的功能(而不只是吹牛说它是圣杯,并且它的功能是秘密),您也应该始终相信其他人是错误的。我的指标和交易风格对我有用,但可能并非对每个人都适用。我依靠以下规则:
市场价格在超过50%的时间内无法预测或很难预测。但是市场反应是可以预测的。
以上报价的意思是,我们可以在一个区域周围形成一个小区域,并可以确信地说市场价格将对该区域周围的区域产生反应。但是我们不能真正说它会从那里下跌4%,然后再次测试,然后第三次尝试跌至103.85美元。由于我们预测过度,因此误差项呈指数级增长。
在讨论此主题时,我应该指出一些有关回测和文章的内容:
我使用的点差基于小点子的机构报价。通常,零售贸易商每笔交易的点差高达1-2个点。这对他们来说是巨大而又不公平的。我使用0.2–0.5点差。但是,大多数使用小时时间框架的策略仍然可以以1个点差传播。对于使用M15或M5时间范围的货币,它们无法以1点的价差获利。
如果没有风险管理流程,我使用的持有期计算将接近尾声。
尽管我不建议仅根据一项指标进行交易,但数字并不真实。我要介绍的是考虑到低点差时可能发生的情况。
我提供的一些回测失败了,它们被发布以揭开交易神话的神秘面纱或提出有趣的功能以供读者编码。
最后,我坚决不给学习者喂汤。我是通过实践而不是通过复制来学习的。您应该了解策略的概念,功能,直觉,条件,然后自己详细阐述(甚至更好)一个策略,以便您回测它并改进它,然后再决定付诸实施或消除它。
微信扫描关注公众号,及时掌握新动向
2.本文版权归属原作所有,仅代表作者本人观点,不代表比特范的观点或立场
2.本文版权归属原作所有,仅代表作者本人观点,不代表比特范的观点或立场