精通金融模式识别-全-

精通金融模式识别(全)

原文:annas-archive.org/md5/4328078f8bab6733c95749acb5952053

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

发现模式是智慧的本质。

丹尼斯·普雷格

随着技术进步和金融信息的去中心化,编码和自动化研究已经成为交易世界中不可或缺的部分。掌握交易和编码艺术的人在市场上拥有巨大的优势。

交易技术是众多的,它们可以基于许多工具和概念。例如,基本分析交易员依赖经济和政治分析来获取不同资产的长期视角,而技术交易员则依赖更多的量化指标和少数心理概念来预测市场下一个可能的走势。

因此,我们可以说在高层次上存在两种类型的分析,基本分析和技术分析。本书将详细介绍技术分析中的一个领域,称为蜡烛图案识别

为什么这本书?

我整个职业生涯都在研究交易策略、模式以及与金融世界有关的任何事物。我对模式,特别是蜡烛图案,有了特别的热情,因为它们被广泛采用,但也因其有趣的表现结果。此外,多年来,我发现了一些蜡烛图案,我相信至少可以与经典模式媲美。这也是我写这本书的目的:我打算呈现所有蜡烛图案的完整性,包括我个人的图案,以及如何编写一个系统来跨多种市场对它们进行回测。

由于其客观性,机器可以比人类更好地执行模式识别和检测。因此,我已经把书的前几章专门用来创建蜡烛图案识别算法的结构,然后再深入研究后续章节中的模式和策略。这意味着您将学会的第一个技能是如何在 Python 中自动化数据导入过程。

有许多经典的蜡烛图形式,每个人都有责任测试它们以确定它们是否真的具有预测性。毕竟,如果我们用这些模式来预测市场,我们应该有客观的结果来证明它们确实是增值的。我们将获得这样的结果并解释它们,就像我多年来发现的蜡烛图案一样。我们还将看到每种模式的优势和局限性。

当我们找到能够帮助预测任务的好模式时,您应该将它们插入到整体交易框架中,其中包括其他工具和风险管理系统。您将学习如何编写技术指标并将它们与蜡烛图案结合以生成交易信号。最后,您将对这些信号进行回测,并能够优化参数,从而获得一个良好的全面模式识别策略。

因此,本书的实用性在于向您展示如何通过让您创建的算法评估不同的蜡烛图案来自动化您的研究。最后,您将学习如何确定您的策略,该策略将使用这些模式并与其他技术指标结合。

目标受众

本书适合有志于学习的学生、学者、好奇的头脑以及对蜡烛图案识别及其在金融中应用感兴趣的金融从业者。如果你不仅对使用 Python 感兴趣,还对开发策略和技术指标感兴趣,那么你将从本书中受益。

本书假设您在 Python 编程和金融交易方面具有基础知识(专业 Python 用户将发现代码非常直观)。我采用了一种清晰简单的方法,重点放在关键概念上,以便您理解每个想法的目的。

本书使用的约定

以下是本书使用的排版约定:

Italic

指示新术语、网址、电子邮件地址、文件名和文件扩展名。

Constant width

用于程序列表,以及段落内引用程序元素(如变量或函数名、数据库、数据类型、环境变量、语句和关键字)。

Constant width bold

显示用户应按照字面意义键入的命令或其他文本。

Constant width italic

显示应由用户提供的值或由上下文确定的值替换的文本。

提示

此元素表示提示或建议。

注意

此元素表示一般注释。

警告

此元素表示警告或注意事项。

使用代码示例

可以从https://github.com/sofienkaabar/mastering-financial-pattern-recognition下载补充材料(示例代码、练习等)。

如果您有技术问题或使用代码示例遇到问题,请发送电子邮件至bookquestions@oreilly.com

本书的目的是帮助你完成工作。一般情况下,如果本书提供示例代码,你可以在你的程序和文档中使用它。除非你复制了大部分代码,否则无需联系我们获取许可。例如,编写一个使用本书多个代码片段的程序不需要许可。销售或分发 O'Reilly 书籍中的示例代码需要许可。引用本书并引用示例代码来回答问题无需许可。将本书的大量示例代码整合到产品文档中需要许可。

我们感谢但通常不要求归因。归因通常包括标题、作者、出版商和 ISBN。例如:“掌握金融模式识别,索菲恩·卡巴尔(奥莱利)。版权所有 2023 年索菲恩·卡巴尔,978-1-098-12047-4。”

如果您认为您对代码示例的使用超出了合理使用或以上许可的范围,请随时通过permissions@oreilly.com与我们联系。

奥莱利在线学习

注意事项

40 多年来,奥莱利传媒提供技术和商业培训、知识和洞察力,帮助公司取得成功。

我们独特的专家和创新者网络通过图书、文章和我们的在线学习平台分享他们的知识和专业知识。奥莱利的在线学习平台为您提供按需访问直播培训课程、深入学习路径、交互式编码环境以及来自奥莱利和 200 多家其他出版商的广泛文本和视频。有关更多信息,请访问https://oreilly.com

如何联系我们

请将有关本书的评论和问题发送至出版商:

  • 奥莱利传媒公司

  • 北格拉文斯坦公路 1005 号

  • CA 95472,塞巴斯托波尔

  • 800-998-9938(美国或加拿大)

  • 707-829-0515(国际或本地)

  • 707-829-0104(传真)

我们为本书设有网页,列出勘误、示例和任何其他信息。您可以通过https://oreil.ly/mstrg-finan-pttrn-recog访问此页面。

发送电子邮件至bookquestions@oreilly.com发表评论或提出有关本书的技术问题。

欲获取有关我们的图书和课程的新闻和信息,请访问https://oreilly.com

在 LinkedIn 上找到我们:https://linkedin.com/company/oreilly-media

在 Twitter 上关注我们:https://twitter.com/oreillymedia

在 YouTube 上关注我们:https://youtube.com/oreillymedia

致谢

没有我父母的支持,一切都将不同,这也是我必须承认他们对本书直接和间接影响的原因。我还要提到,没有我妻子夏琳的耐心,我无法完成深夜写作。我对她的感激之情溢于言表。

我还要感谢编辑米歇尔·史密斯和科宾·柯林斯以及制作编辑伊丽莎白·费姆的持续支持和出色工作,也感谢他们的耐心。同样,我要感谢所有参与奥莱利传媒的每个人。

另外,我要特别感谢出色的技术审阅人员,宁王、蒂莫西·基普和库珊·沃拉,他们对这本书的巨大贡献不可估量。他们对使这本书易读、有用和简单的影响深远。我无法找到比他们更合适的人来审阅我的书。

最后,我深深感谢您,读者,您抽出宝贵的时间阅读我的作品并信任我的研究。希望您觉得它有用。

第一章:在 Python 中导入和处理金融数据

本章专门讨论通过编码分析金融数据所需的基础工作。这需要一些准备工作,如下载合适的软件和创建一个自动获取历史数据的算法。

到本章结束时,你应该知道如何使用 Python 自动导入历史金融数据,这个技能应该能为你节省时间。那么,让我们开始吧。

安装环境

第一步是准备环境和算法成功所需的其他一切。为此,你需要两个程序:

  • 你用来编写和执行代码的 Python 解释器

  • 你用作数据库的图表和金融软件

让我们从 Python 解释器开始。我使用一个名为 SPYDER 的软件。有些人可能更熟悉其他软件,如 Jupyter 和 PyCharm,但过程是相同的。你可以从官方网站下载 SPYDER,或者更好地,作为一个名为Anaconda的大包的一部分下载它,这样安装更方便并提供更多工具。注意它是开源、免费的软件。

SPYDER 的界面分为三个窗口,如你在图 1-1 中所见。左侧的窗口用于编写稍后执行的代码(告诉算法运行并应用代码)。通常,你会在那个区域看到多行代码。

右上角的窗口是变量资源管理器。每次存储变量时,你都可以在那里看到它。右下角的窗口是控制台,显示代码的结果,无论是错误还是输出。

图 1-1. SPYDER 的界面

你可以在代码中定义和使用的数据类型分为几类:

整数

这些是整数,可以是正数也可以是负数。例如 −8 和 745。然而,它们限制在 −2147483648 到 2147483647 之间。任何超出此范围的数字被认为是一个不同的数据类型,称为长整型。数据类型之间的区别与内存有关。整数的宽度为 32 位,而长整型为 64 位。

浮点数

这些是带有小数点的实数,例如 18.54 和 311.52。

字符串

这些是存储在变量中的单词。更科学地说,它们是一组结构化字符(文本)。在 Python 中,你可以用单引号或双引号之间写字符串。

在图 1-1 的代码第 1 行中,我定义了一个名为age的变量,并将其设置为 13。当你运行此代码时,你应该在变量资源管理器中看到age的创建,类型为int(整数),值为 13。在第 3 行,我执行了定义height变量并设置为 184.50 的代码(因此是浮点数数据类型)。

注意,变量定义旁边我写了in centimeters这个短语,前面加了井号。这叫做注释。在 Python 中,注释对于解释代码非常重要。因此,任何以#开头的内容都不会被执行。在变量资源管理器中,您可以看到height变量的float类型。第 5 行定义了一个字符串,在控制台中显示为str类型(字符串)。您可以看到代码已成功执行,因为没有显示为红色的错误。

准备环境的下一步是安装图表软件,以便您可以将历史数据导入到 SPYDER 中。在整本书中,我使用 MetaTrader 5,这是许多全球交易员使用的基准图表程序。按照以下步骤进行操作:

  1. 下载 SPYDER 并熟悉其工作方式。

  2. 下载 MetaTrader 5 软件。

  3. 使用 SPYDER 从 MetaTrader 5 导入历史价格。

官方网站下载并安装 MetaTrader 5。您需要创建一个演示账户,这只是一个带有虚拟货币的虚拟账户。单词demo不是指使用的时间有限,而是指它不使用真实货币。

要开设账户,请选择文件 > 打开账户,选择 MetaQuotes Software Corp,然后点击下一步。接下来,选择第一个选项以开设演示账户;这将让您交易虚拟货币。最后,输入一些基本信息,如姓名、电子邮件和账户类型。您将不会收到验证请求或任何类型的确认,因为演示应直接启动,允许您查看图表。

图 1-2 显示了平台的界面。默认情况下,MetaTrader 5 不显示其涵盖的所有市场,因此如果需要,您需要使其可访问以进行导入和可视化。单击查看,单击市场观察,然后右键单击新选项卡中显示的任何符号,并选择显示所有。这样,您可以看到扩展列表,其中包含更多市场。

图 1-2. MetaTrader 5 的界面。

创建导入算法。

能够自动调用任何时间段的历史数据是一种非常节省时间的方法,因为它使您能够专注于研究和分析,而不是浪费宝贵的时间获取和清理数据。让我们创建一组函数,几乎可以即时导入所选资产的历史数据。

在进行编码之前,您需要安装 MetaTrader 5 Python 集成库,以便稍后在 SPYDER 中使用它。这很简单,只需一步。打开 Anaconda 提示符并输入pip install Metatrader5,如图 1-3 所示。

图 1-3. Anaconda 提示显示安装 MetaTrader 5 库的命令。

安装是允许您在解释器中使用为 MetaTrader 5 设计的 Python 库的桥梁。

以下代码块使用了内置的import语句,调用了内部(自行创建的)或外部(第三方创建的)库。库是函数的存储库,因此,你需要导入与你想要做的事情相关的库。为了演示目的,导入以下模块、包和库:

import datetime
import pytz
import pandas as pd
import MetaTrader5 as mt5
import numpy as np 

datetime模块提供了操作日期和时间的工具,pytz库提供了跨平台的时区计算,这些对导入是必需的,而pandasnumpy库用于数据处理和分析。

注意

你主要使用numpy进行大多数计算和数据处理。

MetaTrader 5 库导入与软件模块相关的函数,是允许你导入金融历史数据的关键库。

注意,代码的最后三行包含as语句。这用于在你经常使用它并希望节省写作空间时,给库命名自定义名称。换句话说,从现在起,Python 将认识 MetaTrader 5 库为 mt5。

注意

模块是包含函数和变量的文件。是模块的集合;它需要一个init.py文件。库只是包的集合。

执行import语句意味着 Python 现在识别其中的函数,并允许你在未来的代码中使用它们(如果你决定调用它们)。你必须在每次打开新会话时运行它们,这就是为什么import语句通常位于代码的开头。

下一步是创建你将能够导入的时间框架的宇宙。即使我将向你展示如何分析和回测每小时数据,你可以定义一个更广泛的宇宙,如下面的代码片段所示:

frame_M15 = mt5.TIMEFRAME_M15 `# 15-minute time`
frameframe_M30 = mt5.TIMEFRAME_M30 `# 30-minute time frame`
frame_H1 = mt5.TIMEFRAME_H1 `# Hourly time frame`
frame_H4 = mt5.TIMEFRAME_H4 `# 4-hour time frame`
frame_D1 = mt5.TIMEFRAME_D1 `# Daily time frame`
frame_W1 = mt5.TIMEFRAME_W1 `# Weekly time frame`
frame_M1 = mt5.TIMEFRAME_MN1 `# Monthly time frame`

时间框架是你记录价格频率的频率。使用小时数据,你将每小时记录最后打印的价格。这意味着一天内,你可以有最多 24 个小时价格。这允许你看到价格的日内演变。然而,收盘价格只是你想要导入的事物之一。在一个时间段内(无论是每小时还是每日),你将看到以下内容:

  • 时间段的第一个价格,称为开盘价格

  • 打印在时间段内的最高价格,称为高价格

  • 打印在时间段内的最低价格,称为低价格

  • 在开始新的时间段之前所看到的最后价格,被称为收盘价格

总体而言,这些被称为 OHLC¹数据,通常按照写入的顺序排列。

以下代码定义了当前时间,这用于算法在导入数据时有一个参考点。基本上,你正在创建一个变量,用于存储当前的时间和日期:

now = datetime.datetime.now()

现在我们继续定义您要进行回测的资产范围。我涉及四种资产类别:货币、加密货币、大宗商品和股票指数:

  • 货币(也称为外汇,是外汇市场的缩写)是按日交易量计算的最大金融市场。货币以货币对的形式报价,这意味着您不能仅仅用美元购买美元;您必须使用另一种货币购买。因此,EURUSD 货币对指的是 1 欧元相当于多少美元。回测范围包括 EURUSD、USDCHF、GBPUSD 和 USDCAD。
注意

USD 是美元的缩写,EUR 是欧元货币的缩写,CHF 是瑞士法郎的缩写,GBP 是英镑的缩写,CAD 是加拿大元的缩写。

  • 加密货币(也称为加密货币)是一种新型、具有颠覆性的资产类别,其特点是严重的波动性。最知名的加密货币是比特币,其次是以太坊。请注意,两者都以美元计价;这就是为什么它们被标记为 BTCUSD 和 ETHUSD 的原因。
注意

请注意,比特币(BTC)和以太坊(ETH)是相对于美元报价的。它们通常被认为是最流动的加密货币对。

  • 大宗商品是金、银、铜等实物资产。它们被划分为许多类别,如能源(原油、布伦特原油等)和工业金属(铜、锌等)。在资产范围内,我只关注黄金和白银。

  • 股票指数是对一个国家股票精选篮子的加权计算。它们用于分析一个国家整体股票市场的健康状况。在这本书中,我涵盖了标普 500 指数,作为美国股票的代理,以及富时 100 指数,作为英国股票的代理:

assets = ['EURUSD', 'USDCHF', 'GBPUSD', 'USDCAD', 'BTCUSD', 
          'ETHUSD', 'XAUUSD', 'XAGUSD', 'SP500m', 'UK100']

现在您已经准备好了时间和资产变量,您所需的只是创建导入算法的结构。get_quotes()函数就是这样做的:

def get_quotes(time_frame, year = 2005, month = 1, day = 1, 
               asset = "EURUSD"):

    if not mt5.initialize():

        print("initialize() failed, error code =", mt5.last_error())

        quit()

    timezone = pytz.timezone("Europe/Paris")

    time_from = datetime.datetime(year, month, day, tzinfo = timezone)

    time_to = datetime.datetime.now(timezone) + datetime.timedelta(days=1)

    rates = mt5.copy_rates_range(asset, time_frame, time_from, time_to)

    rates_frame = pd.DataFrame(rates)

    return rates_frame

注意,在get_quotes()函数中,您最终使用了pytzpandas库。该函数首先通过定义奥尔森时区来开始,您可以自行设置。以下是一个简要的、不详尽的列表,根据您的时区可以输入的内容:

America/New_York
Europe/London
Europe/Paris
Asia/Tokyo
Australia/Sydney

之后,我定义了两个变量,分别称为time_fromtime_to

  • 变量time_from包含了指向导入日期开始的日期时间(例如,2020 年 01 月 01 日)。

  • 变量time_to包含了指向导入日期结束的日期时间(例如,2020 年 12 月 31 日)。

下一步是创建一个变量,使用您指定的时间段导入财务数据。这通过rates变量使用mt5.copy_rates_range()函数来完成。最后,使用pandas将数据转换为数据框。

注意

在整本书中,您将处理数组而不是数据框;不过,get_quotes()函数首先将值导入为数据框以保持兼容性,然后将其转换为数组。无论如何,数据框和数组之间的主要区别在于可以保存的数据类型及轴的结构。

导入过程所需的最终函数是mass_import()函数。它允许您使用变量选择时间框架,然后使用get_quotes()函数导入数据并格式化为数组。以下代码段定义了mass_import()函数:

def mass_import(asset, time_frame):

    if time_frame == 'H1':
        data = get_quotes(frame_H1, 2013, 1, 1, asset = assets[asset])
        data = data.iloc[:, 1:5].values
        data = data.round(decimals = 5)        

    if time_frame == 'D1':
        data = get_quotes(frame_D1, 2000, 1, 1, asset = assets[asset])
        data = data.iloc[:, 1:5].values
        data = data.round(decimals = 5)        

    return data 

mass_import()函数会自动将数据框转换为数组,因此在使用自动导入时不必担心转换问题。

注意

算法导入了由 MetaTrader 5 限制的大量历史数据。虽然该数量很大,但是随着时间的推移,您可能需要调整年份参数以获取数据。例如,如果使用mass_import()函数返回一个空数组,请尝试在get_quotes()函数中放入一个更新的年份(如前面示例中的“2014”而不是“2013”)。

尽管 MetaTrader 5 有 MAC 版本,但 Python 库仅适用于 Windows。在 Mac 上需要模拟器。对于 Mac 用户,您也可以尝试本章后面介绍的手动导入方法。

把一切放在一起

现在让我们看一个完整的数据导入示例。请记住,完整的导入代码可以在本书的 GitHub 仓库中找到。通常,本书中只处理每小时数据,因为交易者大量使用它,这会产生有趣的信号;不过,让我们尝试在定义了本章中所见函数之后应用几个导入示例:

  • 要导入每日 ETHUSD 数据,请输入以下代码:
my_data = mass_import(5, 'D1')
  • 要导入每小时 GBPUSD 数据,请输入以下代码:
my_data = mass_import(2, 'H1')

有许多方法可以将数据导入 Python;一些是自动的,一些是手动的。您刚刚看到了使用代码与图表平台通信并下载数据的第一种方式。手动方式是使用从第三方下载的包含 OHLC 数据的 Excel 文件。在这种情况下,您可以使用pandas库将其导入并转换为数组。

假设 Excel 文件名为my_data,并且文件存储在您的桌面上。您必须确保 SPYDER 目录与文件存放在同一位置。用通俗的话说,SPYDER 必须在桌面上搜索 Excel 文件。要选择正确的目录,您必须单击箭头旁边的文件夹按钮,如图 1-4 所示。

图 1-4. 目录选项卡

应该打开一个单独的窗口,您可以在其中选择桌面位置,然后验证选择。完成这些步骤后,选项卡应该看起来像图 1-5。

图 1-5. 目录选项卡

你必须使用read_excel()函数来获取 Excel 文件中的值。按照以下语法操作:

`# Importing the excel file into the Python interpreter`
my_data = pd.read_excel('my_data.xlsx')

此时,你有一个名为my_data的数据框,其中有四列,表示开盘价、最高价、最低价和收盘价。通常,在使用属于某个库的函数之前,你必须输入该库的名称;这就是为什么read_excel()之前要加上pd的原因。

注意

请记住,pd是用来引用pandas的快捷方式。同时,np是用来引用numpy的快捷方式。

下面的语法显示了如何将数据框中的结构化元素转换为数组,以便于操作。我使用的数组库称为numpy,这是本书中主要使用的库。

注意

我建议 Windows 用户使用自动方式,而 macOS 用户使用手动方式,因为兼容性问题。

在你使用numpy函数之前,你认为应该做什么?如果你的答案是导入库,那么你是正确的。以下代码片段导入numpy并将my_data转换为数组,以便进行分析:

`# Importing the library`
import numpy as np

`# Converting from data frame to array`
my_data = np.array(my_data)

或者,你可以通过在pd.​read_excel('my_data.xlsx')后添加.values,从而变为pd.read_excel('my_data.xlsx').​values,得到一个数组而不是数据框,这样就可以一行搞定所有操作。

摘要

研究和交易框架由四种不同的算法组成,这些算法将在下一章节详细讨论。它们可以总结如下:

导入算法

这是本章展示的算法,处理导入和准备历史 OHLC 数据以供分析或回测。我相信在这个阶段,你可以轻松地自动和手动完成这一操作。

信号算法

这个算法,你将在第二章中看到,将负责生成买入和卖出订单。本质上,它是一组条件,给出了绿灯,表明出现了某种模式,可以进行交易。

绘图算法

这是最简单的算法。你将用它来绘制价格图上的信号。其目的是在图表上视觉分析买入和卖出信号。你将在第二章中也学习到这一点。

性能算法

这个算法用于计算和分析从信号算法获取的结果。基本上,它计算了在符合条件的模式生成的信号上的性能指标。你也将在第二章中学习到这一点。

你必须知道如何自动导入和准备以后要分析的金融数据。Python 提供了强大而快速的工具来做到这一点;因此,请确保掌握这项技术,以便扩展你的研究能力。

¹ 开盘最高最低收盘的缩写。

第二章:算法思维与函数

算法是计算机根据特定条件的实现应用的一组规则。通常使用算法来解决特定问题或简单地遵循重复任务的序列。您还可以使用算法通过扫描设置的条件来查找模式。

本书的主要目的是向您展示如何扫描、发现和评估蜡烛图形和策略。使用算法而不是手动执行任务的主要好处如下:

速度

算法与人类相比能够以极快的速度运行。一个简单的算法可以在几秒钟内扫描数十万条数据,而人类可能需要数周甚至数月来完成同样的任务。

纪律

算法遵循一组明确的规则,并且不具备使它们偶尔忽略规则的情感或情绪。此外,算法不会陷入主观解释的陷阱。这对评估过程至关重要,因为您需要客观和清晰的衡量标准来评判您的交易系统。

错误百分比

当代码中没有错误时,算法通常是无误差的。人类由于不注意和疲劳可能会犯很多错误。

注意

交易系统由多个算法组成,如交易和风险管理算法。强大的交易系统依赖于明确和稳定的基于规则的算法来提供可靠的衡量标准。

本章分为四节。首先涵盖了原始函数,这些函数处理了本书中始终使用的基本数据操作。然后展示了如何对模式和策略的信号进行编码。接着介绍了如何在价格图表上可视化信号,以便您得到美观且易于解释的表现。最后,您将学习关键绩效评估指标及其编码方式。确保掌握本章的概念,因为它们对本书的其余部分至关重要;它们不仅有助于检测模式,还有助于创建策略。

编码原始函数

原始函数是一小组自定义函数,帮助您更好地操作数据数组。原始函数的概念始于我早年练习编码的一项练习,但随着时间的推移,它们成为我在研究中经常使用的常规代码片段。

分析和回测是重复性任务,需要一些函数在任何地方起作用。让我们从最基本的原始函数开始(记住,您将在整本书中使用numpy)。

向数组添加列的函数

有时,您需要添加列以填充它们,其中可以是指标或信号。例如,假设您有一个由四列组成的 OHLC 数组。您可以使用函数添加额外的列,您可以使用这些列来容纳以下内容:

  • 基于收盘价计算的指标,例如简单移动平均¹

  • 使用预定的二进制值(例如买入信号为 1,卖出信号为−1)作为买卖信号的代理

注意

数组中的行表示时间步骤。在本书中我使用小时时间框架,这意味着每行包含每小时的开盘、最高、最低、收盘价以及任何指标值或买卖代理。

因此,第一个原始函数是add_column(),如下面的代码片段所示:

def add_column(data, times):

    for i in range(1, times + 1):

        new = np.zeros((len(data), 1), dtype = float)

        data = np.append(data, new, axis = 1)

    return data

函数循环由变量times选择的预定次数,并且每次循环都会创建一个新的数组,其中包含与原始数据相同长度的零值,如len(data)所示。这个新数组由np.zeros()预建的numpy函数创建。

最后一步是使用np.append()将这个新创建的数组直接粘贴到原始四列旁边,从而得到一个有五列的数组。

随着循环的进行,列数逐渐增加。参数axis指定了行和列之间的二元选择。当它等于 0 时,它指的是行,当它等于 1 时,它指的是列。记住,变量times是您希望添加的列数,这在调用函数时指定。让我们看一个示例以使事情更清楚。

您有一个名为my_data的数组,由四列组成,您希望添加五列新列以更新原始数组,使其具有九列。假设您已经定义了add_column()函数,您会写什么来完成这个任务?答案如下:

`# Adding five columns to an existing array`
my_data = add_column(my_data, 5)

从数组中删除列的函数

当尝试计算复杂的指标时,可能会出现额外的列,因为您可能需要通过中间计算来填充它们,这些计算在指标准备好之后是不需要的。例如,使用一列来计算权重,然后使用下一列来计算基于权重的指标。您会保留指标列,但不保留权重列。

最后,您希望保留指标的最终结果,并删除先前的列,这样您就可以得到一个由 OHLC 数据组成的干净数组,其中下一列是指标的读数。

快速简便的方法是使用delete_column()函数。下面的代码片段显示了如何定义它:

def delete_column(data, index, times):

    for i in range(1, times + 1):

        data = np.delete(data, index, axis = 1)

    return data

注意

记住,在使用函数之前,必须先定义它。这意味着在编写函数的语法后,必须执行它,以便 Python 将其存储在内存中。

函数循环遍历指定范围,即您要从选定索引开始删除的列数。例如,函数删除从第 4 列开始的三列,包括第 4 列。

函数说明,新转换的数组使用内置的numpy函数np.delete()从变量index开始删除列。最后,变量times是要删除的列数,在调用函数时指定。以下是两个示例,以便更清晰地理解:

  • 你有一个包含 10 列的数组,并且想要从索引为 4 的列开始删除 4 列。下面是如何实现的:

    my_data = delete_column(my_data, 4, 4)
    
    
注意

请记住,索引为 4 的列不是第四列,而是第五列。这是因为 Python 从零开始索引。

  • 你有一个包含八列的数组,并且想要从索引为 1 的列开始删除两列。下面是如何实现的:

    my_data = delete_column(my_data, 1, 2)
    

你主要会在技术指标中使用delete_column(),而不是模式,因为后者是直接的规则,而不是像一些指标那样的顺序复杂计算。

向数组添加行的函数

有时候你想在数组末尾添加行,由于滞后或手动添加编码值。你可以使用以下函数向数组末尾添加空行:

def add_row(data, times):

    for i in range(1, times + 1):       

        columns = np.shape(data)[1]

        new = np.zeros((1, columns), dtype = float)

        data = np.append(data, new, axis = 0)

    return data

该函数循环遍历数据,并在每次循环中使用内置函数np.shape()找到数组的形状,该函数输出矩阵的行数和列数。由于你只关心列数,你会添加[1]来告诉算法你只想要第二个值,也就是列数。将列数存储在变量columns中后,算法继续执行下一行,并创建一个全由零组成的新数组,该数组只有一行,列数等于变量columns。最后,算法将这个新创建的带有一行的数组附加到原始数组的末尾,从而输出一个与其他行大小相同的新行。

从数组中删除行的函数

在计算指标时,一些计算可能需要过去最少数量的数据;否则,你会看到无效值,在 Python 中表现为 NaN²。以下函数从开头删除行:

def delete_row(data, number):

    data = data[number:, ]

    return data

这个简单的函数说明,实际数据从number索引开始,一直到数据的末尾。基本上,它忽略了从开头选择的若干行。

舍入数字的函数

为什么在这里讨论一个看起来不足以成为独立函数的简单概念?答案是除非你将 OHLC 数据的数字四舍五入,否则某些模式非常罕见。

让我们以欧元美元货币对为例。近年来,出于精确性原因,零售市场经销商开始对大多数货币对进行五位小数报价,而不是四位。尽管交易员习惯于的概念,即第四位小数(即 1.0964 中的 4),但现在他们有一个点分,即第五位小数(即 1.09645 中的 5)。

这种变化可能会让习惯于传统四位小数系统的市场参与者感到困惑,但这是必要的,并且有利于交易商报出更紧密的价差。价差是买入(询价)和卖出(出价)价格之间的差异。这是市场交易商承担风险的补偿。对交易者来说,它被视为交易成本,因为购买时稍微更贵,而出售时稍微更便宜。

让我们利用这个机会讨论一下货币对的工作原理,然后逐步详细解释为什么最终需要对数字进行四舍五入。

货币对由两种货币组成;左边的是基础货币,右边的是价格货币。当你看到 EURUSD 交易报价为 1.0500 时,意味着购买 1 欧元需要花费 1.0500 美元。

现在,假设你用 10500 美元购买了 10000 欧元,几周后发现 EURUSD 的报价为 1.0750。这到底意味着什么?这意味着相对于美元,欧元的价值上升了,因为现在你需要 10750 美元来购买 10000 欧元;因此,从理论上讲,你赚了 250 美元(你也可以称之为 250 点的收益,因为每 1 欧元的价值提高了 0.0250)。只有当你将你的欧元兑换成美元时才会实现这一点,这将使你获得 10750 美元,而不是 10500 美元。随着市场的发展和五位小数系统的引入,你现在可能会看到 EURUSD 的小数点后有五个数字(例如,EURUSD 为 1.07516)。

存在某些蜡烛图模式,需要接近开盘价的收盘价。这就是为什么我在后续章节中的某些模式中包含四舍五入的原因。货币对的最佳四舍五入数必须是四位小数——不多不少。以下代码块显示了四舍五入函数:

def rounding(data, how_far):

    data = data.round(decimals = how_far)

    return data

函数使用内置函数round()来简化过程。确保理解在搜索特定模式时需要对 OHLC 数据进行四舍五入的必要性,因为在后续章节中你会用到它。

在继续之前,让我们简要练习一下你在本节学到的新函数。假设你有一个 OHLC 数组,你想要:

  • 在数组中添加两列:

    my_data = add_column(my_data, 2)
    
  • 从第二列开始删除三列:

    my_data = delete_column(my_data, 1, 3)
    
  • 在数组末尾添加 11 行:

    my_data = add_row(my_data, 11)
    
  • 删除数组中的前四行:

    my_data = delete_row(my_data, 4)
    
  • 将数组中所有的值四舍五入到四位小数:

    my_data = rounding(my_data, 4)
    
    
注意

记住,变量data通常用于函数中,并引用你想引用的任何数据,而变量my_data是我导入的所有 OHLC 数组的默认名称。

编码信号

这标志着信号算法的开始。记住,本节的目的是看如何创建一组条件以寻找有效信号。到目前为止,你已经导入了一个资产或货币对的 OHLC 数组。

我还没有讨论任何蜡烛图案的情况下,我会创建一个假设的模式,然后编写其条件并创建信号算法。我们称这个假设的配置为 Alpha 模式:

  • 下一个开盘时会产生一个长期(买入)信号,只要当前的最低价低于 5 个周期前和 13 个周期前的最低价,但高于 21 个周期前的最低价。同时,当前条的收盘价必须高于 3 个周期前的收盘价。

  • 当前的高价高于 5 个周期前和 13 个周期前的高价,但低于 21 个周期前的高价时,下一个开盘会产生一个短期(卖出)信号。同时,当前条的收盘价必须低于 3 个周期前的收盘价。

注意

空头卖出位置是一种复杂的行为,您从第三方借入资产然后卖给买方以获利。最后,您将其买回并归还给原始所有者。如果价格下跌,您将会赚取差价;否则,您将以比您卖出时更高的价格买回它。

前面的要点提供了生成买入和卖出信号所需的一切,因此,您可以开始编写signal()函数。

signal()函数视为扫描每一行并在满足您设置的所有条件时留下痕迹的函数。这些痕迹是买入和卖出代理订单的代理。

您需要告诉算法的第一件事是拥有足够数量的列,您希望用买入和卖出订单填充。如前所述,您可以使用add_column()来完成这个操作。接下来的步骤是告诉算法在整个数据范围内进行循环,这可以通过for语句完成,它在预定义的范围内执行有限循环,而在您的情况下,是 OHLC 数据数组的长度。

当您在验证模式时,可以在接下来的开盘价格上启动仓位,您可以使用try()except()函数,它们仅仅是绕过由于在数组的最后一行出现信号并在下一个不存在的行上触发错误导致的错误。为了说明这个错误,想象有 500 行并在第 500 行得到一个买入信号。由于您在下一个开盘时购买,信号将出现在下一个不存在的行上。这将导致索引错误。

现在,您已经准备好编写 Alpha 模式的条件了。通常我先编写看涨条件。因此,在告诉算法添加两列并在忽略IndexError()问题的同时循环数据时,我会简单地使用if语句添加条件。

这些条件很直观:你只需知道变量i是当前循环中的行索引,因此i-5是当前行之前五行(时间步长)的变量。i变量与for循环一起使用,以便条件可以应用于每一行。

然而,有时候你可能需要在 OHLC 数据之后计算指标或波动率度量,这将推动买入和卖出列到下一个索引。这在“指标分析”中有所涵盖。以下代码片段定义了 Alpha 模式的函数:

def signal(data):

    data = add_column(data, 5)    

    for i in range(len(data)):    

       try:

          `# Bullish Alpha`
           if data[i, 2] < data[i - 5, 2] and data[i, 2] < data[i - 13, 2]
              and data[i, 2] > data[i - 21, 2] and \               data[i, 3] > data[i - 1, 3] and data[i, 4] == 0:

                    data[i + 1, 4] = 1 

           `# Bearish Alpha`
           elif data[i, 1] > data[i - 5, 1] and data[i, 1] > data[i - 13,
                ​1] and data[i, 1] < data[i - 21, 1] and \                 data[i, 3] < data[i - 1, 3] and data[i, 5] == 0:

                    data[i + 1, 5] = -1 

       except IndexError:

            pass

    return data

语句data[i, 4] == 0是要有买入信号,必须在上一行没有买入信号的条件。³ 这是为了避免在模式具有重复性质时出现连续信号。

长信号的代理是在索引为 4 的列中输入数字 1(因此是第五列)。我在验证模式后写data[i + 1, 4] = 1的原因是为了强制算法在完成当前收盘价后,在下一个开盘价上进行买入。相反,短信号的代理是在索引为 5 的列中输入数字-1(因此是第六列)。

这样,你就编写了根据行开盘创建信号所需的条件。你如何编写以下条件呢?

  • 当前收盘价高于两个周期前的收盘价时,下一个开盘价上生成一个长信号。

  • 当当前收盘价低于两个周期前的收盘价时,下一个开盘价上生成一个短信号。

答案在以下代码片段中:

def signal(data):

    data = add_column(data, 2)   

    for i in range(len(data)):   

        try:

            `# Bullish signal`
            if data[i, 3] > data[i - 2, 3]:

                data[i + 1, 4] = 1

  `# Bearish signal`
            elif data[i, 3] < data[i - 2, 3]:

                data[i + 1, 5] = -1

        except IndexError:

            pass

    return data

就是这样!你编写信号的方式是使用函数,然后调用它们。调用函数等同于应用它并看到它实现。

注意

要调用信号函数,请使用以下语法:

my_data = signal(my_data)

return语句强制你重新定义数组,使其成为你想要的(由信号函数定义)。这一义务来自于你正在添加列,因此你必须重新创建数组。

现在,让我们继续进行第三个算法:信号的可视化表示。看起来这是一个可选步骤,而且确实是,但是查看信号样本对你了解可以期待什么是有帮助的。你还必须视觉检查模式的信号,以确保算法正在检测到正确的配置。

创建信号图表

当你创建和应用长信号和短信号时,你的策略核心准备就绪,因此你需要以两种不同的方式进行评估:

主观地

目视检查多个信号图表,以检测可能提供算法错误提示的异常情况(例如,算法检测到的错误模式)。这也可以帮助你更好地理解信号的频率和连续性。这就是你将在本节中看到的内容。

客观地

目标评估是更重要的方法。这涉及计算诸如命中率之类的性能指标。随着我在下一节中深入讨论这些指标,您将看到并编写所需的所有指标。

图 2-1 中的简单图表可以帮助您了解当前所处位置。在导入历史数据和编写信号之后,可视化是框架中的第三个算法。

图 2-1. 算法图

第一章介绍了如何从 MetaTrader 5 平台导入历史 OHLC 数据,您还看到了如何在 MetaTrader 5 平台上没有包含数据的情况下加载您自己的数据。本章已经讨论了如何编写并应用从一组称为 Alpha 模式的条件生成的信号。让我们继续使用相同的例子。

这里是导致有效 Alpha 模式的交易条件的提醒:

  • 当前低点低于 5 个周期前和 13 个周期前的低点但高于 21 个周期前的低点时,下一个开盘产生长期信号。同时,当前柱的收盘价必须高于 3 个周期前的收盘价。

  • 当前高价高于 5 个周期前和 13 个周期前的高价但低于 21 个周期前的高价时,下一个开盘产生短期信号。同时,当前柱的收盘价必须低于 3 个周期前的收盘价。

下一步是使用简单的柱状图可视化这些信号。然后我在产生长期信号的地方应用朝上箭头,并在产生短期信号的地方应用朝下箭头。在本书后面,我将使用蜡烛图创建这些信号图,但由于我尚未介绍它们,我将使用简单柱状图,这是连接每个柱的高点和低点的黑色垂直线。图 2-2 展示了一个简单的柱状图。

图 2-2. 一个简单的高低杆

作为提醒,我还没有讨论技术分析,所以如果您感到信息过载,请不要担心,因为在下一章中一切都应该更清楚。

看一看图 2-3。这是一个简单的柱状图示例,其中在每个小时的高点和低点之间绘制了垂直线。

让我们将 Alpha 模式的信号应用于这些柱上,以便您了解交易相对于价格走势的位置。这使您可以看到每次获得 Alpha 信号时价格发生了什么变化。

图 2-3. USDCHF 上的简单柱状图

使用下面的函数,我称之为signal_chart()。在我定义信号图表之前,这是如何使用以下函数定义的ohlc_plot_bars()创建简单的柱状图的:

def ohlc_plot_bars(data, window):

    sample = data[-window:, ]

    for i in range(len(sample)):

        plt.vlines(x = i, ymin = sample[i, 2], ymax = sample[i, 1], 
        color = 'black', linewidth = 1)  

        if sample[i, 3] > sample[i, 0]:

            plt.vlines(x = i, ymin = sample[i, 0], ymax = sample[i, 3], 
            color = 'black', linewidth = 1)  

        if sample[i, 3] < sample[i, 0]:

            plt.vlines(x = i, ymin = sample[i, 3], ymax = sample[i, 0], 
            color = 'black', linewidth = 1)  

        if sample[i, 3] == sample[i, 0]:

            plt.vlines(x = i, ymin = sample[i, 3], ymax = sample[i, 0] + 
            0.00003, color = 'black', linewidth = 1.00)  

    plt.grid()

该函数允许你绘制简单的条形图。它首先通过定义回顾期(即最近观察到的数量)来开始,用于可视化的观察数量。回顾期的变量是window,因此,一个窗口大小为 500 将显示最近的 500 个观察结果。然后,它通过循环遍历在window变量内的观察结果,并使用plt.vlines()绘制垂直线,正如前面的代码所示。

要绘制最近的 500 个条形图,请使用以下语法:

ohlc_plot_bars(my_data, 500)

现在,让我们将由箭头表示的信号添加到简单的条形图中。看一下以下定义signal_chart()函数的代码块,并注意它如何使用我之前展示的函数:

def signal_chart(data, position, buy_column, sell_column, window = 500):

    sample = data[-window:, ]

    fig, ax = plt.subplots(figsize = (10, 5))

    ohlc_plot_bars(data, window)    

    for i in range(len(sample)):

        if sample[i, buy_column] == 1:

            x = i
            y = sample[i, position]

            ax.annotate(' ', xy = (x, y), 
                        arrowprops = dict(width = 9, headlength = 11, 
                        headwidth = 11, facecolor = 'green', color = 
                        'green'))

        elif sample[i, sell_column] == -1:

            x = i
            y = sample[i, position]

            ax.annotate(' ', xy = (x, y), 
                        arrowprops = dict(width = 9, headlength = -11, 
                        headwidth = -11, facecolor = 'red', color = 
                        'red'))  

变量position应设置为零,因为信号是指开盘价,这样箭头位置就合适了。因此,函数被这样调用:

signal_chart(my_data, 0, 4, 5, window = 250)

如果你将此函数应用于 OHLC 数组,其中已经应用了来自 Alpha 模式的信号,你将得到图 2-4 中的信号图表。请注意,向上箭头表示长信号的确切生成位置,而向下箭头表示短信号的生成位置。图 2-4 显示了 USDCHF 小时值上的信号图表。

图 2-4. USDCHF 上的信号图表

让我们回顾一下你迄今为止做过的事情。你首先定义和编码了信号,以便有你的买入和卖出订单的代理。然后,你编写了一个图表函数,显示这些信号叠加在价格图表上,这给出了你在过去买入和卖出的位置的概念。

请注意,即使简单的条形图只显示高点和低点,信号是放在开盘价处的,因为它考虑了 OHLC 数据的总体情况。

下面的代码显示了在 USDCHF 小时值上按时间顺序执行此过程的过程,如前面的图表所示:

`# Choosing the asset`
pair = 1

`# Time frame`
horizon = 'H1'

`# Importing the asset as an array`
my_data = mass_import(pair, horizon)

`# Creating the signal function`
def signal(data):

    data = add_column(data, 2)   

    for i in range(len(data)):   

        try:

        `# Bullish Alpha`
            if data[i, 2] < data[i - 5, 2] and data[i, 2] < 
               data[i - 13, 2] and data[i, 2] > data[i - 21, 2] and 
               data[i, 3] > data[i - 1, 3] and data[i, 4] == 0:

                     data[i + 1, 4] = 1

          `# Bearish Alpha`
            elif data[i, 1] > data[i - 5, 1] and data[i, 1] > 
                 data[i - 13, 1] and data[i, 1] < data[i - 21, 1] and 
                 data[i, 3] < data[i - 1, 3] and data[i, 5] == 0:

                     data[i + 1, 5] = -1

        except IndexError:

            pass

    return data

`# Calling the signal function`
my_data = signal(my_data)

`# Charting the latest 150 signals`
signal_chart(my_data, 0, 4, 5, window = 150)

图 2-5 展示了应用在 EURUSD 小时值上的相同过程。请注意,该模式是假设的,没有科学依据。

图 2-5. EURUSD 上的信号图表

编写绩效评估函数

可视化信号只是第一步。你需要客观数据来告诉你是否有一个赢利或亏损的交易系统。

为此,你需要绩效评估,这只是计算不同指标和比率的过程,这些指标和比率可以给你关于过去绩效的线索。之后,你的工作是解释这些指标,并尝试调整模式的使用以改善这些指标。

请记住,一个交易策略很容易是导致模式的几个条件;因此,即使本书讨论蜡烛图案的细节,我也将简要回顾交易策略。第十章和第十一章讨论了几个自然涉及蜡烛图案的策略。

注意

绩效评估还涉及到过去绩效预示未来绩效的期望。这种持续性可能性不大,但回测和评估过去绩效是验证和实施你的策略的最佳方法。

命中率

我们人类更喜欢正确而不是错误。通常情况下,我们为自己的成就感到自豪,为失败感到羞愧,这就是为什么当我们发现大多数决策导致预期和期望结果时,我们会感到安慰。大多数时候正确提供了一种每个人都欢迎的自我提升感。毕竟,谁不想被视为成功呢?

在交易行话中,命中率 是过去盈利交易数量除以总已实现过去交易数量。这意味着命中率衡量了你在预测未来方向时正确的百分比。70%的命中率意味着平均而言,你在每 100 次交易中有 70 次盈利,这并不差,但你必须绝对小心,因为这是一把双刃剑,稍后你会明白为什么。现在,让我们看一下命中率的数学表示:

Hit ratio = Numberofprofitabletrades Numberoftotaltrades

显然,总交易次数包括盈利交易和亏损交易的数量。命中率是接收者心理影响最观察和分析的绩效指标之一。确保你计算的比率是在已实现交易总数上,不包括未决交易。

收益率

当你投资 100 美元,一年后它变成 105 美元,你可以如何描述你的收益率呢?不要仅仅说你赚了 5 美元,而是可以将你的利润表述为相对于初始投资的回报,计算方法如下:

Rate of return = ( Newbalance Initialbalance ) - 1

这意味着你的收益率为 5%。用百分比来表达盈利能更好地反映投资组合的盈亏幅度。例如,看看以下两个假设情况:

  • A 组投资组合赚取了$125,000。

  • B 组投资组合回报率为 10%。

A 组投资组合似乎更令人印象深刻,但如果我告诉你两个投资组合的初始余额都是$2,000,000 呢?这确实使得 A 组的表现不佳,因为它只赚了 6.25%,而 B 组则赚了 10%($200,000)。

你还可以计算几种类型的回报率,即回报率和回报率。当然,你最应该关注的是后者,因为它扣除了费用。让我们看看以下例子中两者的区别:

  • 2021 年 01 月 01 日的初始余额为$1,000,000

  • 2021 年 12 月 31 日的最终总余额为$1,175,000。

  • 2021 年期间未支付的佣金和费用总计为$35,000。

  • 2021 年未支付的研究提供商费用为$10,000。

在这个例子中,毛收益率是不考虑支付给经纪人和其他第三方供应商的费用的收益率:

Gross rate of return = ( 1,175,000 1,000,000 ) - 1 = 17 . 5 %

净回报率更接近你实际获得的收益,通过以下计算得出:

Net rate of return = ( 1,175,000-35,000-10,000 1,000,000 ) - 1 = 13 %

警告

投资组合仍然盈利,但在扣除成本后受到了打击。有些投资组合在扣除成本后从赢家变成了输家,这就是选择一个有合理费率结构的经纪商的重要性,以免长期侵蚀你的利润。即使是佣金的小差异也会对积极交易者产生巨大影响。

盈利因子

盈利因子是一个快速衡量指标,用来看你每损失 1 个货币单位时赢得多少。它的计算方法是总毛利润与总毛亏损之间的比率,也就是将所有盈利交易的盈利总和除以所有亏损交易的亏损总和。在数学上,它表示如下:

Profit factor = Grosstotalprofit |Grosstotalloss|

将其除以总毛亏损的绝对值非常重要。让我们以 2020 年赚取了$127,398 和亏损了$88,318 的投资组合为例。在这种情况下,盈利比率将是多少?

答案是 1.44,这被解释为平均每损失$1.00 赢得$1.44。每当盈利性为正时,盈利因子大于 1,每当盈利性为负时,盈利因子小于 1。一些交易者喜欢通过调整策略来优化它们,直到找到最高的盈利因子。

风险-收益比

一个好的交易系统是通过获得奖励来衡量每承担一定风险量。当你冒着$1.00 的风险赢得$1.00 时,风险-收益比等于 1.00,你有 50%的机会赢得或输掉相同的金额,除非你有一个随时间推移使你比输赢更多的统计优势。

这个统计优势是命中率的概念。当你进入一笔交易并设置目标(盈利平仓的水平)和止损(为避免更糟结果而进行的亏损平仓水平)时,你实际上可以计算出你的理论(预期)风险-收益比。

这是一个简单的例子,基于购买加密货币 Cardano(ADA)相对于 USDT(代表 USD):

  • 以$1.00 购买 ADAUSDT。

  • 设置止损价为$0.95。

  • 设置目标为$1.10。

这笔交易的风险-收益比是多少,你如何解释它?简单来说,你冒着$0.05 的风险来赚取$0.10,这意味着你的奖励是风险的两倍;因此,风险-收益比为 2.00。

Risk reward ratio = |Entryprice-Targetprice| |Entryprice-Stopprice|

上述公式显示了如何计算理论或预期风险-收益比,这是在交易之前设定的。

提示

一个经验法则是通常尝试选择提供接近 2.00 的风险-收益比的策略,因为这为你提供了足够的可预测误差余地以保持盈利。假设交易数量相同,具有 2.00 风险-收益比,你只需 33.33%的命中率即可打平。

保本命中率是达到零利润和损失所需的最低命中率,不包括成本和费用。由于它仅仅是一个指示性的测量,保本命中率在绩效报告中很少呈现。然而,你可以通过风险-收益比轻松计算它,如下所示:

保本命中率 = 1 1+风险收益比

这导致命中率与风险-收益比之间存在负相关关系,因为你的风险越小、收益越大,实际上命中收益(目标)的可能性就越小,因为你距离风险(止损)更近。考虑以下例子:

  • 自 2021 年 1 月 1 日以来的命中率 = 43.67%

  • 自 2021 年 1 月 1 日以来实现的风险-收益比 = 2.11

在这种情况下,保本命中率会是多少?通过使用公式,你可以找到以下结果:

保本命中率 = 1 1+2.11 = 32 . 15 %

这意味着你拥有一个获胜的策略,因为你平均每 100 笔交易中有 43-44 笔盈利交易。此外,对于这些交易中的每一笔,你的平均盈利是你亏损的 2.11 倍,这就是区别所在。良好的风险管理是使交易系统盈利的关键。仅凭命中率的初步观察,会让人感觉不起眼,但通过看风险-收益比,会呈现出全新的画面。

实际上,有些交易可以在止损或目标价位之前关闭,这是由于各种原因,例如在同一方向上再次得到信号。因此,你有两个不同的风险-收益比:

理论上的风险-收益比

这通常是在交易之前设置的,是一个预测。

实现的风险-收益比

这是每笔交易的平均利润除以每笔交易的平均亏损,这给出了你与理论风险-收益比有多接近的一个想法。

让我们看另一个例子来解释这两个比率:

  • 在 2021 年 1 月 1 日设定的理论风险-收益比 = 2.00

  • 2021 年平均每笔交易的盈利 = $241,597

  • 2021 年平均每笔交易的亏损 = $127,222

因此,实现的风险-收益比为 1.90,略低于理论值。这是可以接受的,因为有时你在达到止损或目标水平之前会退出一些交易。本书中回测中呈现的比率是实现的比率。

交易次数

交易频率对于性能评估至关重要。需要记住的一个经验法则是至少要有 30 笔交易,以达到可靠性的最低阈值。当然,多年来,交易频率必须要高得多。有些模式非常罕见,不太可能提供多少信号,从而阻止你对其进行正确的评估。

不幸的是,有些模式可能非常罕见,但无论如何,这本书并不是关于美化和夸大它们的,因为其中一些实际上非常糟糕且不具预测性,但仍被许多零售交易者用来分析市场。这将我们带到书的第二个实用性:揭秘。现在是时候看看如何在 Python 中编写这些指标了。

创建一个性能评估函数。

你终于结束了关于性能指标的理论部分讨论。即使在现实中有更多深入细节的性能指标,你也不需要计算它们所有来快速了解什么有效什么无效。

例如,回报率在后面的回测中并不是很有用,因为它是仓位大小和交易成本的函数,所以它并不直接处理可预测性。这就是为什么我只使用其他四个指标:

  • 命中率给你一个关于模式或策略可预测性的初步概念。

  • 利润因子让你看到生成的利润是否大于生成的损失,而不论仓位大小。

  • 实现的风险回报比告诉你,相比于承担的风险,你能得到多少回报。

  • 信号的频率显示结果是否有意义,以及你是否期望频繁信号或罕见信号。

性能指标被捆绑到一个我称为performance()的 Python 函数中,如下面的代码块所示。我将在代码之后解释它是如何工作的及其输出:

def performance(data, 
                 open_price, 
                 buy_column, 
                 sell_column, 
                 long_result_col, 
                 short_result_col, 
                 total_result_col):

    `# Variable holding period`
    for i in range(len(data)):

        try:

            if data[i, buy_column] == 1:

                for a in range(i + 1, i + 1000):

                    if data[a, buy_column] == 1 or data[a, sell_column] \                                               == -1:

                        data[a, long_result_col] = data[a, open_price] - \                                                    data[i, open_price]

                        break

                    else:

                        continue                

            else:

                continue

        except IndexError:

            pass

    for i in range(len(data)):

        try:

            if data[i, sell_column] == -1:

                for a in range(i + 1, i + 1000):

                    if data[a, buy_column] == 1 or data[a, sell_column] \                                               == -1:

                        data[a, short_result_col] = data[i, open_price] -\                                                     data[a, open_price]

                        break   

                    else:

                        continue

            else:
                continue

        except IndexError:

            pass   

  `# Aggregating the long & short results into one column`
    data[:, total_result_col] = data[:, long_result_col] + \                                 data[:, short_result_col]  

    `# Profit factor   ` 
    total_net_profits = data[data[:, total_result_col] > 0, \                         total_result_col]
    total_net_losses  = data[data[:, total_result_col] < 0, \                         total_result_col] 
    total_net_losses  = abs(total_net_losses)
    profit_factor     = round(np.sum(total_net_profits) / \                         np.sum(total_net_losses), 2)

`# Hit ratio`   
    hit_ratio         = len(total_net_profits) / (len(total_net_losses) \                         + len(total_net_profits))
    hit_ratio         = hit_ratio * 100

    `# Risk-reward ratio`
    average_gain            = total_net_profits.mean()
    average_loss            = total_net_losses.mean()
    realized_risk_reward    = average_gain / average_loss

    `# Number of trades`
    trades = len(total_net_losses) + len(total_net_profits)

    print('Hit Ratio         = ', hit_ratio)
    print('Profit factor     = ', profit_factor) 
    print('Realized RR       = ', round(realized_risk_reward, 3))
    print('Number of trades  = ', trades)    

函数并不像看起来那么复杂。例如,它接受七个变量,这些变量指的是数组及其列索引。变量data表示包含历史数据和模式生成信号的 OHLC 数组。记住,信号以 1 的形式表示长触发,以−1 的形式表示短触发。变量open_price只是数组的第一列,表示每个时间步的开盘价格。在你的情况下,因为你使用的是每小时的时间框架。

不要忘记,在 Python 中,数组的第一列索引为零,因此变量open_price始终具有值 0。接下来的两个变量分别表示买入和卖出信号的位置。对于简单的模式,通常是 4 和 5,而对于更复杂的模式,则可能更多。long_result_colshort_result_col变量是从buy_columnsell_column中找到的结果的索引。

这意味着每当你退出一个多头头寸时,该头寸的结果就会存储在由变量long_result_col描述的列中。最后,total_result_col总是紧随short_result_col之后的下一列,因为它是两个结果列的总和。total_result_col列被创建以便于计算绩效指标。现在,要调用函数,请使用以下语法:

my_data = performance(my_data, 0, 4, 5, 6, 7, 8)

该语句调用了一个名为my_data的数组上的性能函数,你已经学会如何导入它,然后用必要的值替换变量。如果你不确定如何找到这些变量,请仔细重新阅读前面的段落。

一个假设的例子:评估绩效

在我结束本章之前,让我们看一个完整的例子并解释其结果。毕竟,回测是关于理解策略或模式提供了什么,以便改进它。以下是一个在 2017 年到 2021 年之间使用单一策略的投资组合的详细信息:

  • 总交易数 = 2,348

  • 盈利交易 = 1,236

  • 亏损交易 = 1,112

  • 理论风险-收益比 = 2.00

  • 交易总净收益 = $457,995

  • 交易总净损失 = $321,589

  • 每笔交易的平均盈利 = $370.54

  • 每笔交易的平均损失 = $289.19

2017 年到 2021 年期间的命中率是多少?

命中率简单地指的是盈利交易数与实现交易总数的比率。在这个例子中,它是 52.64%。

2017 年到 2021 年之间的净利润因子是多少?你会如何解释它?

利润因子是总利润除以总损失。在这个例子中,它是 1.42,远高于 1.00。该投资组合每损失 1.00 美元就能赚取 1.42 美元。

2017 年到 2021 年之间的实现的风险-收益比是多少?与理论风险-收益比相比如何?

实现的风险-收益比是每笔交易的平均收益与平均损失的比率。在这个例子中,它是 1.28。远低于理论风险-收益比 2.00,因此投资组合正在经历次优的风险管理,可能是由于过早关闭头寸。

我们应如何解释信号的频率?

在五年中进行了 2,348 笔交易,这个投资组合的交易活动相对较高,约每年 469 笔交易。对于如此多的交易量来说,交易成本是一个令人担忧的问题。从统计上讲,性能指标应适当描述投资组合的情况,因为有很多信号。

这是一个管理良好的投资组合吗?

尽管通过利润因子显示的盈利能力很高,管理者应考虑在保持命中率超过 50%的情况下改进实现的风险-回报比。这可以通过调整、优化甚至审查进出场技术来实现。管理者还应该研究对交易进行过滤,以减少经纪费用。然而,投资组合处于盈利状态,并且似乎有一种预测策略。

你现在已经完成了构建算法核心的工作,这些算法将用于分析和回测蜡烛图形态。在展示这些图形态之前,你还有一个必须理解的技术分析,这是蜡烛图形态识别所属的研究领域。

¹ 移动平均线 是在滚动窗口上计算的均值。通常用于理解市场的趋势。移动平均线在第 Chapter 3 中有更深入的讨论。

² NaN 的缩写。如果单元格有 NaN,则被视为无效,如果用于计算,将只产生其他 NaN。

³ 由于本书始终使用小时时间框架,上一行指的是前一个小时蜡烛图。

第三章:介绍技术分析

技术分析依赖于对价格行为历史的视觉解释,以确定市场可能的总体方向。它依赖于过去是未来最好的预测因素的想法。在技术分析这个广阔领域内有几种技术,特别是以下几种:

图表分析

这是你将主观的视觉解释技巧应用到图表上的地方。你通常会使用绘制支撑和阻力线以及回撤等方法来找到旨在确定下一步动向的拐点水平。

指标分析

这是你使用数学公式创建客观指标的地方,这些指标可以是趋势跟踪或逆向的。已知的指标包括移动平均线和相对强弱指数(RSI),这两者在本章中将更详细地讨论。

模式识别

这是你监视某些反复出现的配置并采取行动的地方。模式通常是偶尔出现并呈现特定理论或经验结果的事件。在金融领域,情况更加复杂,但已知的某些模式随时间积累价值,这可能部分是由于一种被称为自我实现预言的现象(一种初始预期导致其确认的过程)所致。已知的模式包括蜡烛图模式,这些模式是本书的主角。

让我们快速了解技术分析的历史,这样你就能更清楚地知道可以期待什么。技术分析依赖于三个原则:

历史会重演。

在趋势和范围内,你可能会看到簇集。此外,某些配置和模式大多数时候可能会产生相似的结果。¹

市场会消化一切。

假设一切(所有基本、技术和定量信息)都包含在当前价格中。

市场波动成浪。

由于不同的时间框架和需求,交易者以不同的频率买卖,因此形成趋势和波动,而不是一条直线。

不幸的是,技术分析被零售交易社区过分吹捧和滥用,这使得它在专业行业中的声誉略显不佳。每种分析方法都有其优点和缺点,有成功的基本分析、技术分析和定量分析投资者,但也有三个领域的失败投资者。

基本分析依赖于经济和金融数据,以长期投资视角对特定证券或货币进行判断,而量化分析更为灵活,更常应用于短期数据。它使用数学和统计概念进行预测。

在其他假设中,技术分析表明市场不高效,但这意味着什么呢?市场效率指的是信息已经嵌入到当前价格中,并且价格和价值是相同的。当你购买资产时,你希望它是被低估的(在基本分析术语中)或者被过度卖出(在技术分析术语中),这就是你相信价格应该上涨以达到价值的原因。因此,你假设价值大于价格。市场效率否认任何价格不等于价值的主张,因此建议任何α交易不应导致高于平均回报(α交易是指从事超过基准表现的投机操作,通常是指一个指数或加权指数)。

市场效率假说是技术分析师的最大敌人之一,因为其原则之一是在弱式市场效率中,你无法通过技术分析获得超额回报。因此,技术分析在一开始就被打倒,然后基本分析也受到了打击。

可以合理地假设,未来某个时刻,由于参与者的数量和获取信息的便利性,市场将不得不变得高效。然而,正如政治和异常事件所示,市场往往远非高效。

注意

俄罗斯入侵乌克兰是一个政治事件的例子,引发了市场的恐慌和非理性行为。类似地,中央银行意外加息是异常经济事件的例子。

Charting Analysis

在理解图表分析之前,你需要知道在打开图表时会看到什么,更具体地说是蜡烛图。

假设市场开盘价为$100。某些交易活动发生。让我们记录一下这一小时内的最高价($102)和最低价($98)。同时,记录这一小时的收盘价($101)。请记住,这四个数据分别被称为开盘价最高价最低价收盘价(OHLC)。它们代表了创建蜡烛图所必需的四个基本价格。

蜡烛图非常简单和直观。它们是沿时间线的盒状元素,包含 OHLC 数据。图 3-1 展示了蜡烛图的工作原理。

图 3-1。左侧是牛市蜡烛图;右侧是熊市蜡烛图

牛市蜡烛图的收盘价高于开盘价,而熊市蜡烛图的收盘价低于开盘价。

蜡烛图是分析金融时间序列的最著名方法之一。它们比简单的折线图包含更多信息,并且比条形图具有更强的视觉可解释性。Python 中许多库提供图表函数,但在我看来,自己动手做总是更好。让我们从折线图开始。

折线图 是通过按时间顺序连接收盘价创建的。这是绘制资产最简单的方法。它是三种图表类型中信息最少的,因为它只显示收盘价。

在 Python 中绘制基本线图非常简单,只需一行代码。您必须确保已导入一个名为matplotlib的库,该库会为您处理绘图。以下代码片段显示了如何绘制一个包含 EURUSD 小时时间框架中的收盘价的一维数组的折线图:

`# Importing the necessary charting library`
import matplotlib.pyplot as plt

`# The syntax to plot a line chart`
plt.plot(my_data, color = 'black', label = 'EURUSD')

`# The syntax to add the label created above`
plt.legend()

`# The syntax to add a grid`
plt.grid()

图 3-2 展示了 EURUSD 的折线图。该图仅提供收盘价和总体趋势方向的信息。

图 3-2. EURUSD 的折线图

现在让我们用蜡烛图将其提升到一个新的水平。

最简单的方法是考虑在每个时间步骤上画垂直线(就像第 2 章 中展示的简单条形图)。按照以下步骤操作:

  1. 为每行绘制表示最高和最低点的垂直线。例如,在 OHLC 数据上,您可以使用名为matplotlib的函数vlines(),它使用最小(低价)和最大(高价)值在图表上绘制垂直线。因此,此函数绘制了在每个高低之间延伸的条形图。图 3-3 显示了一个简单的条形图(类似于第 2 章 中的条形图),其中每根条形是 EURUSD 的高低范围。

  2. 重复第一步,只是这次在开盘和收盘价格上应用新的垂直线。这给你了一个垂直线里面的垂直线,但这是看不见的。如何解决?通过施加颜色条件和表示蜡烛图主体的更大宽度。

图 3-3. EURUSD 的简单条形图

图 3-4 显示了 EURUSD 的完整蜡烛图。您可以看到通过颜色编码和 OHLC 数据的可见性,您能够获取更多信息,如波动性和收盘价相对开盘价的总体趋势。这类信息在折线图中是不可用的。

图 3-4. EURUSD 的蜡烛图

实现这一点的完整代码如下:

def ohlc_plot_candles(data, window):

    sample = data[-window:, ]

    for i in range(len(sample)):

        plt.vlines(x = i, ymin = sample[i, 2], ymax = sample[i, 1], 
                   color = 'black', linewidth = 1)  

        if sample[i, 3] > sample[i, 0]:

            plt.vlines(x = i, ymin = sample[i, 0], ymax = sample[i, 3], 
                       color = 'green', linewidth = 3)  

        if sample[i, 3] < sample[i, 0]:

            plt.vlines(x = i, ymin = sample[i, 3], ymax = sample[i, 0], 
                       color = 'red', linewidth = 3)  

        if sample[i, 3] == sample[i, 0]:

            plt.vlines(x = i, ymin = sample[i, 3], ymax = sample[i, 0] + 
                       0.00003, color = 'black', linewidth = 1.00)  

    plt.grid()

要调用函数并显示最近的 100 根蜡烛图,请使用以下语法:

ohlc_plot_candles(my_data, window = 100)

有些人更喜欢用其他颜色绘制蜡烛图。为此,您必须调整color参数。例如,以下代码绘制了一个灰色(看涨)和黑色(看跌)的蜡烛图表:

def ohlc_plot_candles(data, window):

    sample = data[-window:, ]

    for i in range(len(sample)):

        plt.vlines(x = i, ymin = sample[i, 2], ymax = sample[i, 1],
                   color = 'black', linewidth = 1)  

        if sample[i, 3] > sample[i, 0]:

            plt.vlines(x = i, ymin = sample[i, 0], ymax = sample[i, 3],
                       color = 'grey', linewidth = 3)  

        if sample[i, 3] < sample[i, 0]:

            plt.vlines(x = i, ymin = sample[i, 3], ymax = sample[i, 0],
                       color = 'black', linewidth = 3)  

        if sample[i, 3] == sample[i, 0]:

            plt.vlines(x = i, ymin = sample[i, 3], ymax = sample[i, 0] +
                       0.00003, color = 'black', linewidth = 1.00)  

    plt.grid()

图表分析是通过主观绘制来寻找支撑和阻力线的任务。水平或对角线线条是找到预测市场反应水平的精髓:

  • 支持水平是市场应该反弹的水平,因为暗示周围的需求应该高于供应。

  • 阻力水平是市场应该退回的水平,因为暗示周围的供应应该高于需求。

资产在时间轴上的方向可以分为三种:上升趋势,价格创造更高高点,下降趋势,价格创造更低低点,以及横向(或盘整),价格在较长时间内围绕同一水平波动。

图 3-5 显示了在 EURUSD 接近 0.9850 附近的支持水平。通常情况下,当价格接近支持时,交易者开始考虑买入。这是因为预期应该会有向上的反应,因为力量平衡应该更向需求(积极)方向倾斜,交易者愿意支付更高的价格,因为他们预期将来会有更高的价格(记住之前讨论的价格对价值的论点)。这里的含义是大多数交易者看到的价格低于价值。

图 3-5. EURUSD 上显示 0.9850 支持的蜡烛图

图 3-6 显示在 EURUSD 接近 0.9960 附近的一个阻力水平。通常情况下,当市场接近阻力时,交易者开始考虑做空市场。这是因为预期应该会出现向下的反应,因为力量平衡应该更向供应方倾斜。这里的含义是大多数交易者看到的价格高于价值。

图 3-6. EURUSD 上显示 0.9960 阻力的蜡烛图

盘整(横向)市场使水平支撑和阻力线更有可能奏效。这是因为已经暗示了供需之间的一般平衡。因此,如果供应过剩,市场会迅速调整,因为需求应该足以稳定价格。

图 3-7 显示了一个被困在两个水平水平之间的盘整市场;这是 EURUSD 的情况。每当市场接近盘整市场中的阻力线时,您应该更有信心会发生下跌,而不像在上涨市场中那样,每当接近支持线时,您应该更有信心会发生反弹,而不像在下跌市场中那样。

此外,图表分析也适用于趋势市场。这体现在上升和下降通道形式上。它们与水平线具有相同的倾向,但有一个偏向(稍后讨论)。

图 3-7. EURUSD 上显示 0.9850 支持和 0.9960 阻力的蜡烛图

图 3-8 显示了一个上升通道,支撑和阻力点随时间上升,反映出因稳定上升的需求力量而产生的看涨压力。

图 3-8. AUDUSD 的蜡烛图显示了一个上升通道

见到这种情况的交易者会预期每当市场接近上升通道的下部时会有看涨反应,并且会预期每当市场接近通道的上部时会有看跌反应。

这并没有科学依据支持,因为没有什么规定市场必须平行运动,但自我实现的预言可能是为什么这样的通道被认为具有预测性质的原因。

图 3-9 展示了一个下降通道,支撑和阻力点随时间下降,反映出因稳定上升的供应力量而产生的看跌压力。一般来说,看跌通道往往更为激进,因为恐惧支配了贪婪,卖方比买方更为惊慌。

图 3-9. EURUSD 的蜡烛图显示了一个下降通道

我提到处理上升和下降通道时的一种偏见。我把这种偏见称为隐形之手。原因如下:

“趋势是你的朋友。” 这句话由马丁·兹威格创造,意味着在上升通道中,您需要更多关注每当市场回归支撑区域时的买入。这是因为您希望看涨压力的隐形之手能增加您获胜交易的概率。同样,在下降通道的情况下,更多地专注于在市场达到上限时进行卖空。兹威格定律的完整版本如下:“趋势是你的朋友,直到它弯曲的时候。” 这意味着在任何时候,市场都可能改变其走势,任何与趋势的友谊都将终止。总之,图表分析是主观的,并且更多依赖于交易者或分析师的经验。

值得一提的是,除了通过视觉估计来绘制它们以外,还有许多其他寻找支撑和阻力水平的方法:

斐波那契回撤

在这里,您可以使用斐波那契比率来确定反应性水平。通常会在上涨或下跌阶段计算斐波那契回撤,以便知道市场如果触及这些水平将会反转。这种方法的问题在于它非常主观,并且像任何其他技术一样,不是完美的。优点在于它提供了许多有趣的水平。

枢轴点

使用枢轴点可以利用简单的数学公式找到各个水平。基于昨天的交易活动,使用公式预测今天的未来支撑和阻力水平。然后,每当市场接近这些水平时,您尝试通过反向交易来抵消这一动向。

移动平均线

这些将在下一节中讨论。它们具有动态性质并跟随价格。您还可以使用它们来检测当前市场状态。

提示

找到支撑和阻力水平的最佳方法是尽可能多地结合技术,这样您就会对最初的想法更有信心。交易是一个数字游戏,尽可能多地增加胜算应该最终提高您的系统表现的机会。

指标分析

指标分析 是第二常用的技术分析工具。它通常伴随图表一起确认您的初始想法。您可以将指标视为助手。它们可以分为两种类型:

趋势跟随指标

用于检测并交易预期继续的趋势市场中的当前走势。因此,它们与走势持续性有关。

逆势指标

用于淡化行情走势,并且在横盘市场中最有效,因为它们通常标志着初始行情的结束。因此,它们与行情预期反转(因此与行情的反持续性)有关。

接下来的部分介绍技术分析的两个支柱,移动平均线(趋势跟随)和相对强弱指数(逆势)。

移动平均线

最著名的趋势跟随叠加指标是移动平均线。它的简单性使其无疑成为最受追捧的工具之一。移动平均线有助于确认和跟随趋势。您还可以使用它们来找到支撑和阻力水平、止损点和目标,以及理解潜在趋势。

有许多类型的移动平均线,但最常见的是简单移动平均线,其中您取最近收盘价的滚动均值,如下式所示:

Moving average i = Price i +Price i-1 +...+Price i-n n

这是你在统计学和生活中几乎任何其他部分使用的简单均值。它只是观察值的总和除以观察值的数量。²

图 3-10 显示了应用于美元/加元的 30 小时简单移动平均线。30 小时 表示我在每小时 K 线的情况下计算最近 30 个周期的移动平均值。

图 3-10. 美元/加元的蜡烛图与 30 小时简单移动平均线

移动平均线的经验法则包括以下内容:

  • 每当市场高于其移动平均线时,牛市动能正在进行中,并且最好寻找做多机会。

  • 每当市场低于其移动平均线时,熊市动能正在进行中,并且最好寻找做空机会。

  • 每当市场穿过其移动平均线时,可以说动能已经改变,市场可能正在进入新的状态(趋势)。

您还可以组合移动平均线,以便它们发出信号。例如,每当短期移动平均线穿过长期移动平均线时,将出现牛市交叉信号,市场可能会继续上涨。这也被称为金叉

相反,每当短期移动平均线穿过长期移动平均线下方时,就会出现熊市交叉,市场可能会继续下跌。这也被称为死亡交叉

图 3-11 显示了 USDCAD 的 10 小时(接近市场价格)和 30 小时移动平均线(远离市场价格)。您可以注意到,在开始阶段,出现了一个金叉信号,标志着一个牛市趋势的开始。

图 3-11. USDCAD 的蜡烛图与 30 小时和 10 小时简单移动平均线

要编写移动平均线,使用以下函数:

def ma(data, lookback, close, position): 

    data = add_column(data, 1)

    for i in range(len(data)):

            try:

                data[i, position] = (data[i - lookback + 1:i + 1, 
                                     close].mean())

            except IndexError:

                pass

    data = delete_row(data, lookback)

    return data

要计算收盘价格的 30 周期(或小时,取决于您的时间框架)移动平均线,您需要定义ma()函数,并按以下方式调用它:

`# Setting the lookback period`
lookback = 30

`# Setting the index of the close price column`
close_column = 3

`# Setting the index of the moving average column`
ma_column = 4

`# Calling the moving average function`
my_data = ma(my_data, lookback, close_column, ma_column)

相对强弱指数

现在让我们讨论反向指标。由 J. Welles Wilder Jr.首次引入,相对强弱指数(RSI)是最流行和多用途的有界指标之一。它主要用作反向指标,其中极端值信号表明可以利用的反应。

使用以下步骤来计算默认的 14 周期相对强弱指数(RSI):

  1. 计算前一个收盘价格的变动。

  2. 将正净变动与负净变动分开。

  3. 计算平滑后的正净变动和负净变动的绝对值的平均移动。

  4. 将平滑后的正变动除以平滑后的绝对负变动。将此计算称为相对强弱指数(RS)。

  5. 对每个时间步骤应用此归一化公式以获得 RSI:

R S I i = 100 - 100 1+RS i

注意

平滑移动平均线是 RSI 的创建者开发的一种特殊类型的移动平均线。它比简单移动平均线更平滑和稳定。

一般来说,RSI 默认使用 14 周期的回看期,尽管每位交易员可能有自己的偏好。以下是如何使用此指标:

  • 每当 RSI 显示 30 或更低的读数时,市场被认为是超卖状态,可能会发生向上的修正。

  • 每当 RSI 显示 70 或更高的读数时,市场被认为是超买状态,可能会发生向下的修正。

  • 每当 RSI 超过或突破 50 水平时,可能正在出现新的趋势,但这通常是一种较弱的假设,更多地是理论性质而非实践性质。

图 3-12 显示了 EURUSD 与其 14 周期 RSI 的对比情况,位于第二面板。指标应用于确认长期或短期偏向,并在市场状态的时机分析中非常有帮助。

图 3-12. 顶部面板显示的小时 EURUSD 值,底部面板显示的 14 期 RSI

要使用常规数组方法创建 RSI,首先定义平滑移动平均如下:

def smoothed_ma(data, alpha, lookback, close, position):

    lookback = (2 * lookback) - 1

    alpha = alpha / (lookback + 1.0)

    beta  = 1 - alpha

    data = ma(data, lookback, close, position)

    data[lookback + 1, position] = (data[lookback + 1, close] * alpha) + 
                                   (data[lookback, position] * beta)

    for i in range(lookback + 2, len(data)):

            try:

                data[i, position] = (data[i, close] * alpha) + 
                                    (data[i - 1, position] * beta)

            except IndexError:

                pass

    return data

现在,让我们使用以下函数编写 RSI:

def rsi(data, lookback, close, position):

    data = add_column(data, 5)

    for i in range(len(data)):

        data[i, position] = data[i, close] - data[i - 1, close]

    for i in range(len(data)):

        if data[i, position] > 0:

            data[i, position + 1] = data[i, position]

        elif data[i, position] < 0:

            data[i, position + 2] = abs(data[i, position])

    data = smoothed_ma(data, 2, lookback, position + 1, position + 3)
    data = smoothed_ma(data, 2, lookback, position + 2, position + 4)

    data[:, position + 5] = data[:, position + 3] / data[:, position + 4]

    data[:, position + 6] = (100 - (100 / (1 + data[:, position + 5])))

    data = delete_column(data, position, 6)
    data = delete_row(data, lookback)

    return data

总结一下,指标可以通过多种方式计算。最常用的两种是移动平均和 RSI。我稍后会在第十章和第十一章回到它们。目前,请确保掌握技术分析的概念。我们继续进行模式识别。

模式识别

模式是指反复出现的特定配置,显示随后移动的特定预测。模式可以分为以下类型:

经典价格模式

这些是众所周知的技术反转价格模式,由于难以在不考虑主观条件的情况下进行回测而被认为不可靠。然而,它们仍被许多交易员和分析师使用。

定时模式

基于时间和价格的组合。这些模式较少被人知晓,但在正确使用时可以强大且具有预测性。

蜡烛图案

这里使用 OHLC 数据来预测市场未来反应。蜡烛图是可视化图表的最佳方式之一,因为它们包含许多可能信号反转或确认移动的模式。后续章节将对其进行更深入的讨论。

经典价格模式是指理论配置,如双顶和矩形。它们通常是反转模式或续趋势模式:

续价格模式

这些是确认总体持续移动的配置。例如,矩形和三角形。

反转价格模式

这些是淡化总体持续移动的配置。例如,头肩顶和双底。

传统图表分析师熟悉双顶和双底,它们预示着反转并给出了反转的潜力。尽管简单,但它们是主观的,有些并不像其他那样明显可见。

这阻碍了了解它们是否增加了价值。图 3-13 展示了双顶的插图,验证模式后通常会给出一个看跌的倾向,这通常是打破两个顶部之间最低点连接线的验证。这条线称为颈线

图 3-13. 双顶插图

注意双顶中的三个重要元素:

领口线

这是连接两个峰值之间的最低点和模式开始/结束的线。它用于确定回撤水平,接下来我们将定义它。

回撤

打破颈线后,市场应该会试图朝向颈线做绝望的尝试,但由于卖方利用这一水平重新进场继续做空,市场未能继续上涨。因此,回撤水平是在确认双顶后的理论最佳卖出点。

潜力

这是双顶的目标。它被测量为模式顶部和向下投影的颈线之间的中点,从相同的颈线点开始。

双顶或双底可以有任何大小,但最好能够被大多数市场参与者看到,以便其影响更大。从心理学角度来说,这种模式的解释是,在第二个顶部或底部,市场未能推动价格超过第一个峰值,因此显示出弱势,这可能被卖方利用。

还有其他更客观的模式;即它们具有明确的检测和启动规则。这些模式都基于明确的客观条件,并不受分析师主观判断的影响。这有助于它们的反向测试和评估。

在结束这一入门章节之前,我想指出一些技术分析的误解和最佳实践,以便您能够正确开始。

技术分析的常见陷阱

尽管技术分析看起来很简单,但它可能会被误用,这不幸地加剧了有关其效用和相对基本分析位置的永恒争论。重要的是设定正确的期望,并保持在逻辑思维的范围内。本节讨论了技术分析的已知缺陷,您必须确保避免这些缺陷,以最大化您在金融丛林中的生存率。

渴望迅速致富

这个陷阱主要是心理上的,因为它涉及缺乏纪律和糟糕的管理。迫切想要尽快赚钱以取悦社会的需求,会促使交易者在交易和与交易相关的活动中做出情绪化和不良决策。

这也与需要赚钱的事实有关,你可能会不断改变自己的交易计划,因为你相信新计划是致富的更快途径。

当你对自己没有足够的信心,并认为其他人在赚钱方面比你更强时,你更有可能跟随他们,特别是因为他们提供了丰富的信息。除了你之外,没有人可以改变你的未来。

强迫模式

一种常见的心理缺陷,被称为确认偏见,阻止交易者看到与他们已经建立的观点相矛盾的信号。

有时,你对某些市场有初步看法,因此开始寻找任何符合这一观点的东西,这也可能迫使模式出现,尽管它们并无有效性。

警告

你必须在分析中始终保持中立,并谨慎对待各种元素,同时保持最大的客观性。当然,这说起来容易,做起来难,绝对中立的最佳替代方案是算法化的方法,虽然这要以牺牲人类智能因素为代价。

后见之明偏差,梦想粉碎者

技术分析在过去看起来很好。一切都显得显而易见,甚至使用非常基本的策略也很容易预测;然而,当你应用后者时,你会发现由于严酷的现实,你的大脑会欺骗你认为过去是完全可预测的。

这也是为什么回测结果几乎总是优于前向测试的原因。当你看过去的模式,并相信它们应该很容易被发现时,你表现出了“后见之明偏差”。要解决这个问题,你必须使用无偏算法进行回测。只有这样,你才能确定该模式是否具有价值。许多散户交易员陷入陷阱,只是简单地看待过去,来确定他们的策略的有效性,结果表现不佳。我在第十二章中更深入地讨论了这些偏见。

假设过去事件会有相同的未来结果

你一定听过这句话:“历史不会重演,但它确实经常押韵。” 这句话对理解市场如何运作至关重要。当你应用技术分析时,不要期望从过去的信号和模式中得到确切的结果。相反,你必须将它们作为指导和概率元素使用,这些元素表明市场可能会产生类似的反应,并且与过去的反应有相关性。

交易是一个数字游戏,你必须使赔率倾向于你的利益。当人们面对类似事件时,有时会表现出相似的行为方式。然而,随着不同的参与者不断进入和退出买卖活动,并且随着他们的动机不断变化,你可以肯定,在遇到类似于过去某种模式的市场反应之后,未来的反应不会完全相同,尽管它可能与过去“押韵”,意味着平均而言可能会有相关的反应。

话虽如此,不要期望每次看到明显的模式时都能完美地把握市场的时机。

把事情弄得比必要的更复杂

另一句话是“一切都应该尽可能简单,但不要太简单。” 这完美描述了你应该如何进行研究和交易。

金融市场是高度复杂的、半随机的环境,需要不简单的策略,但策略不能太复杂,以至于你陷入“过拟合”的陷阱,这是一个常见的问题,交易员完美预测过去,并假设未来会完全相同,从而导致过去的巨大纸面收益,但未来却遭受巨大的真实损失。

技术分析最佳实践

当你误用某物时,你倾向于避免责怪自己,而是安抚自己的自尊心,从而免除任何责任。让我们列出一些最佳实践,优化你技术上分析市场的方式。

发挥不同时间框架的力量

许多分析师和交易者仅通过短期视角来分析市场。一个例子是在小时图上寻找机会,而忽视了日图上的市场配置。有一条严格的规则要知道,长时间框架(周度和月度)始终比短时间框架更重要,这意味着如果在较高时间框架上有坚实的阻力,即使在较短时间框架上看到看涨配置,也不应该真的考虑在该水平附近买入。

你应该这样做的原因是尊重行星对齐原则,在这种情况下,它决定了确认彼此的元素越多,你对成功交易的概率的信心越大。一个良好的框架是至少在三个不同的时间框架内分析市场,从较长的时间视角开始向下分析。

使用多种策略或指标

一些分析师认为图表分析比指标或模式更有效,而其他人持相反意见。最好的解决方案是三者兼用,并创建结合各类分析的最佳形态的策略。既然可以选择多种方法,为何只用一种呢?记住,这是一个数字游戏,你需要尽可能多的观点。

选择适合当前市场条件的正确策略

如上所述,市场往往趋势或横向移动。两种主要类型的策略可以归类为反向或趋势跟随,前者依赖于均值回归的概念(消退总体移动),后者依赖于动量原则(跟随总体移动)。

在选择部署策略之前,你必须知道市场是处于趋势还是区间,这可以通过使用移动平均线或其他趋势识别技术来完成。

主要的一点是在强劲趋势市场中不要使用反向策略,在区间市场中不要使用趋势跟随策略。这说起来容易,但实际上非常困难,如果不是不可能的话,估计当前和下一个市场制度。

不要低估默认参数

默认参数实际上并没有像人们描绘的那么可怕,一个显而易见的原因是:它们对交易者和分析师的可见性最高。

举例来说,考虑相对强度指数。你可以说,使用 14 个周期作为回顾窗口的默认版本可能比使用 55 个周期的版本更可靠,假设采用相同的策略,这是因为更多的人关注默认版本并基于它做决策,而不是使用 55 个周期的版本。

交易中的关键点是确保其他参与者也能看到你看到的配置,这样你就能最大化赢利的机会。这并不意味着你必须完全使用其他人相同的技术,但有时不要对指标进行过多调整也是有帮助的。

¹ 这假设长期内显示出非随机概率,表现出确定性特征。

² 你也可以把均值看作是总和除以数量。

³ 参见 J. Welles Wilder Jr.(1978)的技术交易系统中的新概念,由 Trend Research 出版。

第四章:经典趋势跟随模式

趋势跟随,一个看似简单却又复杂的概念。或许放弃市场定时而只是顺势操作会更容易,但实际上,由于众多随机变量影响价格,这样做可能会面临挑战。一个稳步上升的市场可能会因一次经济或政治事件而动荡,但随后继续平稳前行,这会让在波动风暴中被止损的交易员感到困惑。

本章涵盖了经典的(在技术分析领域已广为人知和确立的)趋势跟随蜡烛图案。这些是简单和复杂的构型,自技术分析诞生以来就存在,并在许多初级和高级技术分析课程中教授。本章的目的是创建模式的客观条件并对其进行回测,以便您可以形成关于它们出现频率和可预测性的基本看法。有些模式可能经常出现,而其他模式可能极少出现,从而阻碍了对它们进行适当评估的能力。

如前所述,我回测图案的方法是假设在验证前一天收盘信号后,我会在下一个开盘时开启买入或卖出头寸。本书选择的回测时间框架是每小时。

光头蜡烛图案

第一个经典的趋势跟随模式是光头蜡烛。这个词源于日语,意为秃头或紧贴头皮,你很快就会明白为什么。

区分光头蜡烛图和普通蜡烛图相对较容易,因为光头蜡烛图没有任何影线。这意味着看涨的光头蜡烛图的开盘和最低价格相同,收盘和最高价格也相同。相反,看跌的光头蜡烛图的开盘和最高价格相同,收盘和最低价格也相同。图 4-1 展示了光头蜡烛图的这两个版本。

图 4-1. 左边是一个看涨的光头蜡烛图;右边是一个看跌的光头蜡烛图。

光头蜡烛图案通常出现在较短的时间框架内,因为蜡烛图的波动时间较短,难以超出它们的边界。这在分析 1 分钟和 5 分钟图表并将它们与日常图表进行比较时可以看出。

注意

当蜡烛图的开盘和收盘价格之间的时间较短时,蜡烛图更有可能形成光头蜡烛图案。

在使用任何模式之前,您必须理解其存在的原因。毕竟,模式不是随机发现的;它们必须有其背后的合理性。更重要的是,您需要知道在验证模式后为什么应该期望某种反应。

答案在市场心理学中,它无处不在,以至于专注和知识丰富的交易员可以捕捉到任何暗示并跟随(或反向操作)市场走势。

当市场处于强劲的上涨趋势时,很少会出现较低的新低点,并且由于对基础证券的需求强劲,通常会在接近高点处收盘。在一个蜡烛图中,需求的最大力量表现为不存在低点且收盘价位于高点,这正是独角兽阳线蜡烛图的核心。当资产以最高价位收盘时,你会得到买家渴望更多的信号,而当没有低点低于开盘价时,你应该更有信心地认为,没有人成功将价格推低到其开盘价以下。

同样地,当市场处于强劲的下跌趋势时,很少会出现较高的新高点,并且由于基础证券的供应压力巨大,通常会在接近低点处收盘。在一个蜡烛图中,供应的最大力量表现为不存在高点且收盘价位于低点,如熊市独角兽阴线蜡烛图所示。

注意

独角兽阳线蜡烛图(bullish Marubozu)是最强烈的牛市活动表现,而独角兽阴线蜡烛图(bearish Marubozu)则是最强烈的熊市活动表现。

在一些使用多个小数点的市场中,检测独角兽蜡烛图模式可能会有些棘手,这是由于其发生概率。例如,在货币市场上,如果使用五个小数点,你可能不会很快找到任何独角兽蜡烛图模式,但当你遵循通常的、不太精确的四个小数点惯例时(参见第二章),你会更频繁地看到这种模式。这对所有市场都适用;因此,为了能够分析这种模式,你需要对小数点进行一些微调。

图 4-2 显示了应用舍入函数后的 USDCHF 清晰图表:

my_data = rounding(my_data, 4)

图 4-2. USDCHF 的蜡烛图

下一步是编写信号功能的代码。

注意

信号功能是算法的核心,因为它负责找到模式并按时间顺序确定它们,因此根据特定条件输出买入和卖出信号。

在算法上,条件需如下:

  • 如果收盘价大于开盘价,则高价等于收盘价,低价等于开盘价,那么在买入信号列的下一行打印 1。

  • 如果收盘价低于开盘价,则高价等于开盘价,低价等于收盘价,然后在卖出信号列的下一行打印-1。

在 Python 语言中,使用以下语法编写独角兽蜡烛图信号功能:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish pattern`
           if data[i, close_column] > data[i, open_column] and 
              data[i, high_column] == data[i, close_column] and \               data[i, low_column] == data[i, open_column] and 
              data[i, buy_column] == 0:

                    data[i + 1, buy_column] = 1 

           `# Bearish pattern`
           elif data[i, close_column] < data[i, open_column] and 
                data[i, high_column] == data[i, open_column] and \                 data[i, low_column] == data[i, close_column] and 
                data[i, sell_column] == 0:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 4-3 显示了根据函数给出的信号在 EURUSD 上生成的交易。

图 4-3. EURUSD 上的信号图表

向上箭头表示看涨信号,而向下箭头表示看跌信号。图 4-4 展示了美元瑞士法郎信号的另一个示例。

图 4-4. 美元瑞士法郎信号图

现在让我们使用第二章讨论的性能评估指标回测该模式。

表格 4-1 展示了丸坐模式的表现摘要。交易条件如下:

  • 在确认当前收盘价格信号后,入场价格为下一个开盘价格。

  • 出场时,获取任一方向(看涨或看跌)的另一个信号。

  • 性能评估指标中未包含交易成本。

  • 没有使用风险管理系统。

使用风险管理系统意味着采用简单和复杂的订单管理技术,以规范最大损失和预期目标。

表格 4-1. 丸坐模式:表现摘要表格

资产 命中率 盈利因子 风险-收益比 信号数
欧元美元 47.14% 1.06 1.19 963
美元瑞士法郎 47.01% 0.95 1.07 1355
英镑美元 47.27% 0.79 0.89 605
美元加元 49.06% 0.99 1.03 958
比特币美元 47.81% 1.38 1.51 433
以太坊美元 39.76% 0.93 1.41 3687
黄金 43.33% 0.96 1.25 8443
标普 500 41.92% 0.66 0.91 260
富时 100 50.00% 1.09 1.09 90

回测的资产显示,丸坐模式相对罕见,并且似乎并未增加很大价值。如命中率所示,所有预测都是随机的。命中率约为 50%意味着你的对错概率相当。

同样,盈利因子显示你几乎只能获得足以抵消总亏损的总收益。在计算交易成本时,这一点被放大。接近 1.00 的盈利因子无关紧要,不太可能提供有关模式表现良好与否的更多信息。

如果分析交易该模式时承担的风险,会发现这证实了该策略的随机性。平均值约为 1.00,基本上你冒着 1 美元风险去赚 1 美元,结果可能两样。最后,信号并不是非常频繁,但超过 30 的阈值是进行任何统计解释所需的。

主要结论是,丸坐模式单独使用不太可能提供盈利策略。尽管如此,还请记住以下几点进行回测:

  • 仅基于一个模式进行持仓,未与其他确认指标结合。通常情况下,将模式与其他技术和指标结合使用效果更佳。

  • 回测的市场范围有限;因此,该模式在其他市场上的表现可能会有所不同。

  • 回测的时间范围有限,因为结果仅反映了小时时间框架。请记住,还有其他时间框架,如五分钟、每日和每周。

  • 退出技术是多变的,并取决于下一个信号,这可能要等很长时间。其他更合适的退出技术可能包括固定退出或依赖波动性的退出。

因此,即使回测给出了关于模式能力的一般近似想法,您也必须始终了解其局限性。

三根蜡烛模式

三根蜡烛 模式是一种趋势确认配置,其信号在打印出三根颜色相同、具有最小指定大小的蜡烛之后给出。一个看涨的三根蜡烛模式也被称为三白兵,其由三根大涨的蜡烛组成,每根的收盘价都高于前一根。相反,一个看跌的三根蜡烛模式被称为三黑鸦,其由三根大跌的蜡烛组成,每根的收盘价都低于前一根。

注意

三白兵和三黑鸦的名称来源于蜡烛图曾经以黑白色图示,前者代表着看跌蜡烛,后者代表着看涨蜡烛。

图 4-5 展示了三白兵。请注意,每个收盘价都高于前一个。

图 4-5. 三白兵模式

图 4-6 展示了三黑鸦。请注意,每个收盘价都低于前一个。

图 4-6. 三黑鸦模式

该模式的直觉非常简单。它源于一种称为羊群效应 的心理偏倚,即市场参与者因为他人的行为而跟随趋势。这并不意味着该模式基于人类的缺陷和努力不足;它只是指人类常见的一种行为,他们倾向于跟随整体趋势。

注意

人们追随最新的时尚潮流是因为它带来心理奖励。趋势追随交易者追随最新的趋势,因为他们相信这会带来财务回报,或者因为他们有一种错失机会的恐惧形式(FOMO)。

金融羊群效应可以定义为跟随多数人的行为,试图从当前持续的动向中获利尽可能多。因此,本质上,羊群效应实际上是趋势追随。当您看到同一方向内的三根大蜡烛时,通常会将其解释为一种充满动力、信念和继续朝同一方向发展的健康行动。将这三根大蜡烛与小蜡烛的羞怯行动进行比较,后者的类型在涨跌之间交替。

人们被信心和力量所吸引,更有可能追随它。三根健康蜡烛图案体现了力量和信心。

发现这种模式很容易,但必须有严格的算法规则,不仅仅是三根相同颜色的大蜡烛;否则,你将会有大量信号。从算法的角度看,条件需要如下:

  • 如果最近三个收盘价分别高于其前一个收盘价,并且每个蜡烛图符合最小实体大小,则在下一行的买入信号列中打印 1。

  • 如果最近三个收盘价分别低于其前一个收盘价,并且每个蜡烛图符合最小实体大小,则在下一行的卖出信号列中打印-1。

蜡烛的实体是收盘价和开盘价之间的差异的绝对值。因此,要找到实体,请按照以下数学公式操作:

Candlestick body i = | Close price i - Open price i |

def signal(data, open_column, close_column, buy_column, sell_column):

    data = add_column(data, 5)

    for i in range(len(data)):

       try:

           `# Bullish pattern`
           if data[i, close_column] - data[i, open_column] > body and \               data[i - 1, close_column] - data[i - 1, open_column] > \               body and data[i - 2, close_column] - \
              data[i - 2, open_column] > body and data[i, close_column] > \               data[i - 1, close_column] and data[i - 1, close_column] > \               data[i - 2, close_column] and data[i - 2, close_column] > \               data[i - 3, close_column] and data[i, buy_column] == 0:

                    data[i + 1, buy_column] = 1

           `# Bearish pattern`
           elif data[i, close_column] - data[i, open_column] > body and \                 data[i - 1, close_column] - data[i - 1, open_column] > \                 body and data[i - 2, close_column] - \                 data[i - 2, open_column] > body and data[i, close_column] \ 
                < data[i - 1, close_column] and data[i - 1, close_column] \
                < data[i - 2, close_column] and data[i - 2, close_column] \
                < data[i - 3, close_column] and data[i, sell_column] == 0:

                    data[i + 1, sell_column] = -1

       except IndexError:

            pass

此函数根据先前显示的条件生成买入和卖出信号。由于蜡烛的实体可能根据波动性而异,实际上可能会在某种程度上影响该模式的客观性。理论上,三根蜡烛图案仅指“大”蜡烛,并不指示应如何调整大小;因此,我根据资产和小时时间框架使用固定值。表 4-2 显示了总结。

表 4-2. 三根蜡烛图案:蜡烛大小选择

资产 Body 类型
EURUSD 0.0005 美元
USDCHF 0.0005 瑞士法郎
GBPUSD 0.0005 美元
USDCAD 0.0005 加拿大元
BTCUSD 50 美元
ETHUSD 10 美元
黄金 2 美元
S&P500 10 点数
FTSE100 10 点数

你也可以根据波动性调整变量body,但我将展示另一种适应波动性的模式。目前,我将保持经典模式的理论条件不变,并将创造力留给第五章和第七章中的现代模式。

图 4-7 显示了 EURUSD 上的信号图表。

图 4-7. EURUSD 上的信号图表

表 4-3 显示了三根蜡烛图案的性能总结。

表 4-3. 三根蜡烛图案:性能总结表

| 资产 | 命中率 | 盈利因子 | 风险-收益比 | 信号数 |
| --- | --- | --- |
| EURUSD | 61.45% | 1.05 | 0.66 | 2672 |
| USDCHF | 62.04% | 0.98 | 0.60 | 2005 |
| GBPUSD | 61.53% | 0.96 | 0.60 | 3611 |
| USDCAD | 60.97% | 0.97 | 0.62 | 2844 |
| BTCUSD | 62.30% | 1.00 | 0.61 | 1085 |
| ETHUSD | 61.22% | 0.96 | 0.61 | 392 |
| 黄金 | 61.11% | 1.04 | 0.66 | 828 |
| S&P500 | 65.99% | 1.10 | 0.57 | 741 |
| FTSE100 | 64.54% | 0.97 | 0.53 | 1018 |

尽管结果显示相对于丸坐模式具有较高的命中率,但您必须小心,因为单独作为指标的命中率是没有用的。您必须将其与风险-回报比并行分析,以了解其预测能力是否有盈利可能。

你首先注意到的是关键低风险-回报值,其范围在 0.53 到 0.66 之间。这是第一个警告信号,说明命中率并不令人印象深刻。实际上,这甚至可能不足以产生正面结果。

田士模式

田士模式是一种趋势确认配置,市场在未填补的缺口后发出继续信号。在继续之前,您需要了解什么是缺口。

缺口构成了价格行为的重要组成部分。它们在市场中的罕见程度因市场而异。例如,在货币市场中,它们通常发生在周末后的零售市场开盘或重大公告时。在股票市场中,缺口从一天到另一天是相当常见的。

缺口是由于低流动性而导致两个连续收盘价格之间的不连续或空隙。当市场在$100 交易,突然在未报出$101 的情况下交易到$102 时,就形成了一个看涨的缺口。在图表中可以看到烛台之间似乎有一个缺失的部分。图 4-8 展示了一个看涨缺口。请注意烛台之间的空白区域。

图 4-8. 一个看涨缺口

缺口可能是由于基本和技术原因而发生,但无论出现原因如何,您都应该有兴趣识别并进行交易。在货币市场上,周末出现的明显缺口是看得见的。图 4-9 展示了一个看跌缺口。

图 4-9. 一个看跌缺口

缺口有不同类型,当它们出现时,由于事后的偏见,对它们进行分类可能很困难(事后偏见是一种认知偏差,因为分析师已经知道结果,所以会高估技术的预测能力):

常见缺口

这些通常发生在横盘市场中。它们可能会被填充,因为市场的均值回归动态。

脱离缺口

这些通常类似于常见的缺口,但缺口出现在图形阻力的上方或图形支撑的下方。它们标志着新趋势的加速。

逃跑缺口

这些通常发生在趋势内部,但更加确认它;因此,这是一种继续模式。

耗尽缺口

这些通常发生在趋势结束时,接近支撑或阻力水平。这是一个反转模式。

在缺口出现的那一刻确定其类型并不是确定的方法,但这对于检测田士模式并不重要。该模式以一种用于固定日本和服的配饰命名,但其用途不明确。

一个牛市塔斯基模式由三根蜡烛图组成,第一根是看涨的蜡烛图,第二根是另一根看涨的蜡烛图,其间跳空高于第一根蜡烛图,第三根蜡烛图是熊市的,但不会收于第一根蜡烛图的收盘价以下。

图 4-10 展示了一个牛市塔斯基。

图 4-10. 一个牛市塔斯基

熊市塔斯基模式(见图 4-11)是牛市塔斯基的镜像。它由三根蜡烛图组成,第一根是熊市蜡烛图,第二根是另一根熊市蜡烛图,其间跳空低于第一根蜡烛图,第三根蜡烛图是看涨的,但不会收于第一根蜡烛图的收盘价以上。

图 4-11. 一个熊市塔斯基

这种模式的直觉与突破原理相关,即突破某个阈值,无论是支撑还是阻力,都应该在释放到初始方向之前对其产生重力作用。

每当看到市场跳空上涨,后面紧随一个不完全填补跳空的熊市蜡烛图时,这可能是卖方不足以领先的信号,显示出看涨的倾向。同样地,每当看到市场跳空下跌,后面紧随一个不完全填补跳空的看涨蜡烛图时,这可能是买方不足以领先的信号,显示出看跌的倾向。

算法上,条件需要如下:

  • 如果前两个周期的收盘价高于前两个周期的开盘价,上一个周期的开盘价高于前两个周期的收盘价,上一个周期的收盘价高于上一个周期的开盘价,并且当前的收盘价高于前两个周期的收盘价,则在买入信号列的下一行打印 1。

  • 如果前两个周期的收盘价低于前两个周期的开盘价,上一个周期的开盘价低于前两个周期的收盘价,上一个周期的收盘价低于上一个周期的开盘价,并且当前的收盘价低于前两个周期的收盘价,则在卖出信号列的下一行打印−1。

def signal(data, open_column, close_column, buy_column, sell_column):

    data = add_column(data, 5)

    for i in range(len(data)):

       try:

      `# Bullish pattern`
           if data[i, close_column] < data[i, open_column] and \               data[i, close_column] < data[i - 1, open_column] and \               data[i, close_column] > data[i - 2, close_column] and \               data[i - 1, close_column] > data[i - 1, open_column] and \               data[i - 1, open_column] > data[i - 2, close_column] and \               data[i - 2, close_column] > data[i - 2, open_column]:

                    data[i + 1, buy_column] = 1

           `# Bearish pattern`
           elif data[i, close_column] > data[i, open_column] and \                 data[i, close_column] > data[i - 1, open_column] and \                 data[i, close_column] < data[i - 2, close_column] and \                 data[i - 1, close_column] < data[i - 1, open_column] and \                 data[i - 1, open_column] < data[i - 2, close_column] and \                 data[i - 2, close_column] < data[i - 2, open_column]:

                    data[i + 1, sell_column] = -1

       except IndexError:

            pass

    return data

是时候讨论回测结果了(见表 4-4)。请记住,该模式非常罕见,你应该对结果保持一种统计上的怀疑态度。

表 4-4. 塔斯基模式:性能摘要表

资产 命中率 盈利因子 风险-收益比 信号数
EURUSD 58.06% 0.97 0.70 31
USDCHF 59.46% 1.92 1.31 37
GBPUSD 48.72% 0.93 0.98 39
USDCAD 40.00% 0.61 0.91 40
BTCUSD 53.57% 0.89 0.77 56
ETHUSD 50.00% 1.03 1.03 30
GOLD 51.49% 1.01 0.95 101
S&P500 36.36% 0.33 0.58 11
富时 100 50.00% 1.56 1.56 14

结果证实了最初的假设:这种模式非常罕见。在大约十年时间里,EURUSD 的小时值仅出现 31 次,这个数量极为有限。

罕见模式的问题在于不清楚它们是如何进入文献的,因为缺乏足够(现在也是如此)的数据来分析这些模式的结果和交易的可预测性。

结果大多是负面的,统计上的稳健性不高,因为交易次数较少。田口模式可能在逻辑上有其合理性,但缺乏硬数据支持。

三方法模式

三方法模式是一个复杂的配置,主要由五根蜡烛图组成。上升的三方法模式应该出现在牛市中,第一根蜡烛图是一个大阳线,接着是三根小阴线,通常都在第一根蜡烛图的范围内。要确认这一模式,最后一根大阳线必须收盘高于第一根蜡烛图的高点。这就像是一个小盘整的牛市突破。

图 4-12 描述了一个上升的三方法

图 4-12. 上升的三方法模式

下降的三方法模式应该出现在熊市中,第一根蜡烛图是一个大阴线,接着是三根小阳线,通常都在第一根蜡烛图的范围内。要确认这一模式,最后一根大阴线必须收盘低于第一根蜡烛图的低点。这就像是一个小盘整的熊市突破。图 4-13 描绘了一个下降的三方法

图 4-13. 下降的三方法模式

从心理学角度来看,这种模式涉及到超越或突破的概念,作为最初走势的确认。交易者通常会推高价格,直到他们开始获利了结并平仓。这种活动对价格有一种平滑作用,通过所谓的修正盘整阶段来稳定价格。

如果最初的交易者恢复他们的买入或卖出活动,并设法超越盘整的范围,你可以相当有信心认为这种走势会继续。

三方法蜡烛图模式的信号功能可以写成如下形式:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)

    for i in range(len(data)):

       try:

  `# Bullish pattern`
           if data[i, close_column] > data[i, open_column] and\               data[i, close_column] > data[i - 4, high_column] and\               data[i, low_column] < data[i - 1, low_column] and\               data[i - 1, close_column] < data[i - 4, close_column] and\               data[i - 1, low_column] > data[i - 4, low_column] and\               data[i - 2, close_column] < data[i - 4, close_column] and\               data[i - 2, low_column] > data[i - 4, low_column] and\               data[i - 3, close_column] < data[i - 4, close_column] and\               data[i - 3, low_column] > data[i - 4, low_column] and\               data[i - 4, close_column] > data[i - 4, open_column]:

                    data[i + 1, buy_column] = 1

  `# Bearish pattern`
           elif data[i, close_column] < data[i, open_column] and\                 data[i, close_column] < data[i - 4, low_column] and\                 data[i, high_column] > data[i - 1, high_column] and\                 data[i - 1, close_column] > data[i - 4, close_column] and\                 data[i - 1, high_column] < data[i - 4, high_column] and\                 data[i - 2, close_column] > data[i - 4, close_column] and\                 data[i - 2, high_column] < data[i - 4, high_column] and\                 data[i - 3, close_column] > data[i - 4, close_column] and\                 data[i - 3, high_column] < data[i - 4, high_column] and\                 data[i - 4, close_column] < data[i - 4, open_column]:

                    data[i + 1, sell_column] = -1

       except IndexError:

            pass

    return data

图 4-14 展示了美元加元的信号图。

图 4-14. 美元加元的信号图

这种模式极为罕见,本身并没有显示出太多附加值。即使在放宽条件后,回测结果显示出的信号也很少;因此,这种模式依然神秘。

根据您的数据提供商,一些历史值可能不完全相同,因此,您可以看到过去模式在来自某个提供商的数据上验证,但在来自另一个提供商的数据上未验证。这通常解释了在切换提供商和经纪人时进行反向测试结果略有不同的原因。

Hikkake 模式

Hikkake是一个日语动词,意思是“欺骗”或“陷阱”,而此模式指的是一种实际的陷阱。该模式较为复杂,由大约五根蜡烛图组成,取决于文献(一些研究表明它可能是多个蜡烛图的组合,但没有具体指定蜡烛图的数量)。

牛市 Hikkake(参见图 4-15)以一根牛市蜡烛图开头,后跟一根完全嵌入在第一根蜡烛内部的熊市蜡烛图。接下来,必须出现两根蜡烛图,其高点不超过第二根蜡烛的高点。最后,出现一根大的牛市蜡烛图,其收盘价超过第二根蜡烛的高点。这证实了图案的有效性和上涨确认。

熊市 Hikkake以一根熊市蜡烛图开始,后跟一根完全嵌入在第一根蜡烛内部的牛市蜡烛图。接下来,必须出现两根蜡烛图,其低点不低于第二根蜡烛的低点。最后,必须出现一根大的熊市蜡烛图,其收盘价跌破第二根蜡烛的低点。这证实了图案的有效性和下跌确认。

尽管模式的心理学具有主观性,但并不难理解。术语entrapment源自这样一个事实,即牛市 Hikkake 在历史上是对那些认为市场已经见顶并且应该继续下跌的交易员的熊市陷阱。因此,每当看到最后的蜡烛图突破高点并验证配置时,您可以有一定的信心,预示着更多的力量即将到来。这是因为止损被触发,并且交易员正在看着一个理论上强势的牛市信号超过其阻力位。

图 4-15. 一种牛市 Hikkake

一种熊市 Hikkake(参见图 4-16)可与那些认为市场已经见底并且现在应该反弹的交易员形成对比。因此,每当看到最后的蜡烛图跌破低点并验证配置时,您可以开始改变偏见。

图 4-16. 一种熊市 Hikkake

信号功能可以写成如下形式:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_signal, sell_signal):

    data = add_column(data, 5)    

    for i in range(len(data)):    

       try:

            `# Bullish pattern`
            if data[i, close_column] > data[i - 3, high_column] and \                data[i, close_column] > data[i - 4, close_column] and \                data[i - 1, low_column] < data[i, open_column] and \                data[i - 1, close_column] < data[i, close_column] and \                data[i - 1, high_column] <= data[i - 3, high_column] and \                data[i - 2, low_column] < data[i, open_column] and \                data[i - 2, close_column] < data[i, close_column] and \                data[i - 2, high_column] <= data[i - 3, high_column] and \                data[i - 3, high_column] < data[i - 4, high_column] and \                data[i - 3, low_column] > data[i - 4, low_column] and \                data[i - 4, close_column] > data[i - 4, open_column]: 

                   data[i + 1, buy_signal] = 1 

        `# Bearish pattern`
            elif data[i, close_column] < data[i - 3, low_column] and \                  data[i, close_column] < data[i - 4, close_column] and \                  data[i - 1, high_column] > data[i, open_column] and \                  data[i - 1, close_column] > data[i, close_column] and \                  data[i - 1, low_column] >= data[i - 3, low_column] and \                  data[i - 2, high_column] > data[i, open_column] and \                  data[i - 2, close_column] > data[i, close_column] and \                  data[i - 2, low_column] >= data[i - 3, low_column] and \                  data[i - 3, low_column] > data[i - 4, low_column] and \                  data[i - 3, high_column] < data[i - 4, high_column] and \                  data[i - 4, close_column] < data[i - 4, open_column]: 

                     data[i + 1, sell_signal] = -1

       except IndexError:

            pass

    return data

图 4-17 显示了 EURGBP 上的一个生成信号。显然,这种模式很少见,并且没有有意义的反向测试结果。

图 4-17. EURGBP 上的信号图表

由于该模式非常罕见,没有足够的数据进行正确评估。当然,可以放宽条件以增加信号出现的可能性,但理论上,如果这样做,你就必须给它起个别的名字。表格 4-5 总结了其表现。

表格 4-5. Hikkake 图案:绩效摘要表

资产 命中率 盈利因子 风险-收益比 信号数
EURUSD 44.83% 0.94 1.16 116
USDCHF 47.66% 0.74 0.81 107
GBPUSD 49.57% 1.55 1.57 115
USDCAD 55.14% 0.84 0.68 107
BTCUSD 56.96% 1.18 0.89 79
ETHUSD 60.00% 1.24 0.82 50
GOLD 51.81% 1.14 1.06 166
S&P500 83.33% 6.01 1.20 12
FTSE100 53.33% 2.06 1.80 15

结果显示随机表现,这很可能意味着该模式没有预测能力。在标准普尔 500 指数上的命中率为 83.33% 可能在统计学上不正确,因为算法在过去几年仅检测到 12 个信号。

¹ 记住,三根蜡烛图案由三根大蜡烛组成。因此,您需要编写条件代码,确保它们具有最小尺寸。

第五章:现代趋势跟踪模式

继续遵循趋势跟踪的概念,本章揭示了不属于经典模式的新模式。我将这些新模式称为现代模式,因为它们是我在分析中使用的个人发现。

目标仍然是相同的,即创建客观条件并对其进行回测,以形成对其频率和可预测性的看法。重要的是要记住,一个模式的可预测性在不同市场之间是相当随机的,这意味着在 GBPUSD 上有效的模式可能在 EURGBP 上无效,因为每个市场具有不同的统计和技术特性。

因此,我现在做出的主要假设是,现代模式既不比经典模式更好也不更差;它们只是一个让您在分析中获得更多确认的多样化工具。这意味着,如果您看到至少两三种(经典或现代)模式在同一时间出现,您应该更有信心进行交易。现在让我们开始学习这些新模式,并探索它们的直觉和代码。

五胞胎模式

五胞胎模式是一个多蜡烛配置,确认了潜在的趋势。该模式源于群体心理学和反应失败,¹这使其能够继续朝同一方向发展。其特点是有五个连续的相同类型的小蜡烛。该模式依赖于市场逐步上涨的事件,其中市场似乎被高估或超买,但仍然未受影响并继续上涨。

注意

这种类型的模式通常出现在市场上一个有影响的事件后,价格行动保持在低波动率环境中,但仍然能看到明显的趋势。例如,2021 年 12 月底的 USDTRY²。土耳其总统雷杰普·塔伊普·埃尔多安在通胀和利率方面的声明震动了市场,引起了巨大的波动,但随后出现了一种明显的无决定形式,USD 相对 TRY 稳步上涨。

图 5-1 展示了一个看多的五胞胎模式。

​​

图 5-1. 一个看多的五胞胎模式

当波动性放缓时,出现五连小阳蜡烛,这就是五胞胎模式的发生。图 5-2 展示了一个看空的五胞胎模式。

​​

图 5-2. 一个看空的五胞胎模式

讨论在 第四章 中讨论的三根蜡烛模式与五连小阳线模式的区别在于蜡烛图的数量和它们的大小。前者假设大幅移动后面跟随大幅移动,而后者假设缓慢渐进的移动也会后续有缓慢渐进的移动。(这与金融市场中的波动聚集事件一致。波动聚集 是指波动性通过时间的持续性,低波动率通常后跟低波动率,而高波动率则后跟高波动率。)

因此,这两种模式指向同一个方向,但处理不同的市场特性。

检测五连小阳线模式很容易,但该模式可能不常见,因为您需要满足许多条件。在算法上,条件需要如下:

  • 如果最新的五个收盘价都大于其开盘价,以及其前面的收盘价,并且每个蜡烛图都遵守最大蜡烛体大小,则在下一个买入行中打印 1。

  • 如果最新的五个收盘价都低于其开盘价,以及其前面的收盘价,并且每个蜡烛图都遵守最大蜡烛体大小,则在下一个卖出行中打印 −1。

注意

记住,五连小阳线模式由五个小蜡烛组成。因此,您需要编写它们必须具有最大大小的条件。

现在的任务是编写信号函数如下:

def signal(data, open_column, close_column, buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):    

       try:

      `# Bullish pattern`
           if data[i, close_column]>data[i, open_column] and\               data[i, close_column]>data[i - 1, close_column] and\               data[i, close_column]-data[i, open_column]<body and\               data[i-1, close_column]>data[i-1, open_column] and\               data[i-1, close_column]>data[i-2, close_column] and\               data[i-1, close_column]-data[i-1, open_column]<body and\               data[i-2, close_column]>data[i-2, open_column] and\               data[i-2, close_column]>data[i-3, close_column] and\               data[i-2, close_column]-data[i-2, open_column]<body and\               data[i-3, close_column]>data[i-3, open_column] and\               data[i-3, close_column]>data[i-4, close_column] and\               data[i-3, close_column]-data[i-3, open_column]<body and\               data[i-4, close_column]>data[i-4, open_column] and\               data[i-4, close_column]-data[i-4, open_column]<body and\               data[i, buy_column] == 0:

                    data[i + 1, 4] = 1 

           `# Bearish pattern`
           elif  data[i, close_column]<data[i, open_column] and\                  data[i, close_column]<data[i-1, close_column] and\                  data[i, open_column]-data[i, close_column]<body and\                  data[i-1, close_column]<data[i-1, open_column] and\                  data[i-1, close_column]<data[i-2, close_column] and\                  data[i-1, open_column]-data[i-1, close_column]<body and\                  data[i-2, close_column]<data[i-2, open_column] and\                  data[i-2, close_column]<data[i-3, close_column] and\                  data[i-2, open_column]-data[i-2, close_column]<body and\                  data[i-3, close_column]<data[i-3, open_column] and\                  data[i-3, close_column]<data[i-4, close_column] and\                  data[i-3, open_column]-data[i-3, close_column]<body and\                  data[i-4, close_column]<data[i-4, open_column] and\                  data[i-4, open_column]-data[i-4, close_column]<body and\                  data[i, sell_column] == 0:

                    data[i + 1, 5] = -1 

       except IndexError:

            pass

    return data

与三根蜡烛模式类似,表 5-1 显示了在使用小时时间框架时变量 body 的默认值。

表 5-1. 五连小阳线模式:蜡烛体大小选择

资产 蜡烛 类型
EURUSD 0.0005 Pip
USDCHF 0.0005 Pip
GBPUSD 0.0005 Pip
USDCAD 0.0005 Pip
BTCUSD 50 USD
ETHUSD 10 USD
GOLD 2 USD
S&P500 10 Points
FTSE100 10 Points

图 5-3 展示了根据函数给出的信号在 ETHUSD 上生成的交易。五连小阳线在收盘时验证,这就是为什么信号在下一个蜡烛图开盘时给出的原因。

图 5-3. ETHUSD 的信号图
注意

上箭头表示在蜡烛图开盘时产生的看涨信号,而下箭头表示同样在蜡烛图开盘时产生的看跌信号。

图 5-4 展示了银的信号图的另一个示例。您可以看到,只要条件保持有效,您可能会得到连续的五连小阳线,但这并不一定意味着对趋势延续的信心加强。

图 5-4. 银的信号图

表 5-2 总结了五连小阳线模式的表现。

表 5-2. 五连小阳线模式:绩效摘要表

资产 命中率 收益因子 风险-收益比 信号
欧元/美元 55.21% 0.93 0.76 2032
USDCHF 57.28% 0.98 0.73 2004
英镑/美元 58.08% 1.06 0.76 2052
美元/加元 59.04% 1.04 0.72 2146
BTCUSD 57.49% 1.09 0.81 854
ETHUSD 58.25% 0.93 0.67 800
黄金 57.93% 1.16 0.84 1883
S&P500 59.44% 1.12 0.77 217
富时 100 指数 58.96% 1.05 0.73 212

结果在多个市场上与实现的风险-回报比接近保本点。请记住来自“编码性能评估函数”,只有实现的风险-回报比才有意义,而命中率没有任何意义。这就是为什么在 USDCHF 上的 57.28%的命中率并不令人印象深刻,因为每笔交易您冒险$1 来赚取$0.76。这也可以通过小于 1.00 的利润因子来看出。

主要结论是五胞胎模式应与其他技术结合使用,同时优化进出场点,以获得更好的指标。

双重麻烦模式

双重麻烦模式使用外生变量进行验证,这意味着您从名为平均真实范围(ATR)的波动率指标中借用信息来验证模式信号。

让我们首先定义波动率的概念,并了解 ATR,然后介绍双重麻烦模式。

波动率是交易和投资中的关键概念之一,因为它直接与风险相关,间接与回报相关。波动的资产或变量是其回报在其平均值周围大幅波动的资产或变量。

图 5-5 显示了低波动率线(变动较小的线)和高波动率线(波动较大的线)。

图 5-5。高低波动性变量的比较

您可以使用以下代码片段自行编码:

`# Importing the necessary libraries`
import numpy as np
import matplotlib.pyplot as plt

`# Creating high volatility noise`
hv_noise = np.random.normal(0, 1, 250)

`# Creating low volatility noise`
lv_noise = np.random.normal(0, 0.1, 250)

`# Plotting`
plt.plot(hv_noise, color = 'red', label = 'High Volatility')
plt.plot(lv_noise, color = 'blue', label = 'Low Volatility')
plt.axhline(y = 0, color = 'black', linewidth = 1)
plt.grid()
plt.legend()

我使用了一个名为numpy的函数random.normal(),它从正态分布中输出随机样本。正态分布是一个具有均值的概率连续函数,将数据对称地分布在均值周围。接近均值的数据比远离均值的数据更频繁发生。从视觉上看,正态分布的数据呈现出中间值为均值的平滑钟形曲线。

不同类型的波动性可以总结如下:

历史波动率

这是一段特定时间内的实现波动率。尽管这是向后看的,历史波动率通常用作未来波动率的期望。历史测量的一个例子是标准差。

在继续之前,我想提到一种称为衍生品的金融工具。衍生品是交易者用于以特定方式交易市场的产品。例如,远期合约是一种衍生品合约,买方在后续时间锁定资产价格。远期合约是一种义务。另一种衍生品是期权。期权是以现在支付保费(期权的价格)的方式,在未来以特定价格购买某种资产的权利,买方在想购买标的股票时行使他们的期权;否则,他们可以让期权到期。

隐含波动率

在其最简单的定义中,隐含波动率是当输入到 Black-Scholes 方程中时,可以得出期权市场价格的度量。(Black-Scholes 方程是用于定价期权的数学公式。期权的价格是买方支付的保费,以购买期权,在某个特定到期日之前,以预定的价格购买某种资产。)它是预期未来的实际波动性。它有一个时间尺度:期权的到期日。

远期波动率

未来特定期间的波动性。

实际波动率

任何特定时间的波动量,也称为局部波动率。这个度量难以计算,没有时间尺度。

最基本的波动性类型是标准偏差。它是描述性统计的支柱之一。首先,我必须解释方差。

方差是作为离散度量计算的,计算方法是从均值计算的平方偏差。你取平方偏差,以强制距离均值为非负,然后取方差的平方根,从而将其转换为标准偏差,并使该度量具有与均值相同的单位。

注意

通过平方偏差,你可以避免负距离测量,通过取平方根,你可以将苹果(标准偏差)与苹果(平均值)进行比较。

因此,方差通过以下数学公式计算:

σ 2 = 1 n i=1 n (x i -χ) 2

根据这个逻辑,标准偏差因此如下所示:

σ = 1 n i=1 n (x i -χ) 2

通俗地说,标准偏差是在数据集中分析每个值时,平均距离离均值的期望距离。

在理解波动性的概念后,让我们来看看你必须使用的波动性指标,以找到双重麻烦模式,即 ATR。

注意

ATR 是衡量波动性的另一种方法。类似于标准偏差,ATR 考虑了其计算中的高点和低点,因此比标准偏差更完整。

ATR 用作历史波动率的测量标准。它由 Wilder Welles Jr.开发,他也是 RSI 的创造者,在第三章讨论的指标中提到。ATR 的第一个构建模块是真实范围。我们来看看如何计算真实范围。

假设您有一个 OHLC 数组。 对于每个小时,真实范围只是三个价格差中的最大值:

  • High − Low

  • High − Previous close

  • Previous close − Low

一旦您从中获得了最大收益,您只需对真实范围的特定回顾期进行平滑平均即可获得 ATR。

由于在恐慌和价格下跌期间,您会看到波动性上升,所以在这些时期 ATR 很可能会上升。 同样,在持续上涨或下跌的时期,ATR 往往会下降。 图 5-6 显示了 EURUSD 的一个示例,其中包含 10 期 ATR 测量值。 看一下图表,你能说什么?

图 5-6. EURUSD 与 10 期 ATR

很明显,市场及其 ATR 测量值之间存在负相关性。 这是相当普遍的,因为高波动性通常与恐惧(市场下跌)相关联,而低波动性通常与贪婪(市场上涨)相关联。 相关性并非完美,但从长期来看,它在统计上是负面的。

ATR 的代码可以在以下代码片段中找到。

注意

确保您已经在第三章中定义了smoothed_ma()函数。 ATR 是特定回顾期内真实范围的平滑平均值。 因此,它不是简单的平均值。

def atr(data, lookback, high_column, low_column, close_column, position):

    data = add_column(data, 1)

    for i in range(len(data)):

        try:

            data[i, position] = max(data[i, high_column] - \
                                data[i, low_column], abs(data[i, \
                                high_column] - data[i - 1, close_column]),\
                                abs(data[i, low_column]  - \
                                data[i - 1, close_column]))

        except ValueError:

            pass

    data[0, position] = 0   

    data = smoothed_ma(data, 2, lookback, position, position + 1)

    data = delete_column(data, position, 1)

    data = delete_row(data, lookback)

    return data

现在您已经准备好了解 Double Trouble 模式,这是一种两蜡烛的趋势跟随配置,通常表明总体方向的持续。

看涨的 Double Trouble 模式由两个看涨蜡烛组成,第一个收盘价低于第二个收盘价。 第二个蜡烛必须至少是前一个蜡烛的 10 期 ATR 的两倍大(从高到低)。

看涨的 Double Trouble 基于市场心理的狂喜。 另一种解释是,它可能是一种空头挤压形式,这可能进一步提高看涨退出的概率。

注意

空头挤压是市场上价格迅速上涨的异常情况。 在空头挤压之前,市场必须有大量的空头卖家。 迅速的价格上涨是由空头卖家的止损订单触发而放大的。

图 5-7 说明了一个看涨的 Double Trouble 模式。

图 5-7. 一个看涨的 Double Trouble 模式

看跌的 Double Trouble 模式由两个看跌蜡烛组成,第一个收盘价高于第二个收盘价。 第二个蜡烛必须至少是前一个蜡烛 10 期 ATR 的两倍大(从高到低)。

图 5-8 说明了一个看跌的 Double Trouble 模式。

图 5-8. 一个看跌的 Double Trouble 模式

现在清楚了,Double Trouble 模式高度依赖于波动性的出现。只有在当前高点和当前低点之间的距离是前一小时 10 周期 ATR 的两倍时,才能验证这种模式。

算法上说,Double Trouble 模式的代码如下:

def signal(data, open_column, high_column, low_column, close_column, 
           atr_column, buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

    `# Bullish pattern`
           if data[i, close_column] > data[i, open_column] and \               data[i, close_column] > data[i - 1, close_column] and \               data[i - 1, close_column] > data[i - 1, open_column] and \               data[i, high_column] - data[i, low_column] > (2 * data[i - \               1, atr_column]) and data[i, close_column] - data[i, \               open_column] > data[i - 1, close_column] - data[i - 1, \               open_column] and data[i, buy_column] == 0:

                    data[i + 1, buy_column] = 1 

           `# Bearish pattern`
           elif data[i, close_column] < data[i, open_column] and \               data[i, close_column] < data[i - 1, close_column] and \               data[i - 1, close_column] < data[i - 1, open_column] and \               data[i, high_column] - data[i, low_column] > (2 * data[i - \               1, atr_column]) and data[i, open_column] - data[i, \               close_column] > data[i - 1, open_column] - data[i - 1, \               close_column] and data[i, sell_column] == 0:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

信号函数使用abs()函数,该函数获取括号内数字的绝对值。这用于衡量蜡烛的大小。

注意

通过计算 ATR,您使用第五列(索引=4)。因此,Double Trouble 模式的买入和卖出信号必须在第六列和第七列(索引=5 和索引=6)中,与以前的模式不同,以前没有计算过中间指标。在调用函数之前,请确保转移列。

图 5-9 和 5-10 展示了富时 100 和 BTCUSD 的信号图表。

图 5-9. 富时 100 的信号图表

图 5-10. BTCUSD 的信号图表

表 5-3 总结了 Double Trouble 模式的表现。

表 5-3. Double Trouble 模式:绩效摘要表

资产 命中率 盈利因子 风险-回报比 信号数
EURUSD 51.54% 1.03 0.97 2103
USDCHF 50.47% 1.03 1.01 2106
GBPUSD 50.06% 0.98 0.98 2155
USDCAD 50.86% 1.00 0.96 1787
BTCUSD 53.59% 1.21 1.05 1056
ETHUSD 56.76% 1.30 0.99 953
GOLD 51.76% 1.10 1.02 2007
S&P500 54.00% 1.32 1.13 237
FTSE100 45.95% 0.62 0.73 198

您可以看到,Double Trouble 模式表现优于 Quintuplets 模式,因为它具有相对更好的盈利因子和风险-回报比。

这些结果表明,Double Trouble 模式可能比 Quintuplets 模式更具预测性。这也表明,考虑到波动性可以在模式识别领域提供新的见解和机会。

Bottle 模式

这是我发现的最简单和最直观的模式之一。它依赖于两根蜡烛来发出趋势延续的信号。我将其称为Bottle模式,因为第二根蜡烛看起来像一个瓶子。这种模式还标志着间隙的回归,因为这是验证牛市或熊市信号所需的条件之一。

看涨的 Bottle 模式由一根看涨蜡烛组成,后跟另一根看涨蜡烛,其低端无影线,但高端有影线。同时,第二根蜡烛必须在上一个蜡烛的收盘价下方开盘,这被认为是向下间隙(或内部间隙)。

该模式可用于确认上涨继续,因为其基础心理是市场在开盘后未能创新低,表明强劲的看涨压力。图 5-11 说明了看涨的 Bottle 模式。

图 5-11. 一个牛市 Bottle 模式

熊市 Bottle 模式由一根熊市蜡烛图组成,后跟另一根熊市蜡烛图,其上无上影线,但下面有一根下影线。同时,第二根蜡烛图的开盘必须高于最后一根蜡烛图的收盘,被视为向上间隙。图 5-12 展示了熊市 Bottle 模式。

图 5-12. 一个熊市 Bottle 模式

辨别配置相对容易,但您必须小心遵守所有条件,因为有时候可能不会出现间隙,从而使模式失效。

您可以用以下方式表达模式的信号功能:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

      `# Bullish pattern`
           if data[i, close_column] > data[i, open_column] and \               data[i, open_column] == data[i, low_column] and \               data[i - 1, close_column] > data[i - 1, open_column] and \               data[i, open_column] < data[i - 1, close_column] and \               data[i, buy_column] == 0:

                    data[i + 1, buy_column] = 1 

      `# Bearish pattern`
           elif data[i, close_column] < data[i, open_column] and \                 data[i, open_column] == data[i, high_column] and \                 data[i - 1, close_column] < data[i - 1, open_column] and \                 data[i, open_column] > data[i - 1, close_column] and \                 data[i, sell_column] == 0:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

此时,您应该理解条件是如何书写的,因此这些条件应该变得非常自然。此模式的简单性使代码基础。

看一下信号实际操作(图 5-13),然后再进行回测和解读结果。

图 5-13. USDCHF 上的信号图表

首先注意到,在过去的 100 小时内,USDCHF 只有两次熊市 Bottle 模式。这是正常的,有时会发生,特别是当条件要求平等时。图 5-14 显示了 AUDJPY,在过去的 100 个交易小时内也可以看到一个熊市信号。

图 5-14. AUDJPY 上的信号图表
注意

您可以使用四舍五入函数增加 Bottle 模式的信号频率。我选择不这样做,以保持模式的真实本质。

表 5-4 总结了 Bottle 模式的表现。

表 5-4. Bottle 模式:表现总结表

资产 命中率 盈利因子 风险-收益比 信号数
EURUSD 51.39% 0.99 0.94 395
USDCHF 52.85% 1.17 1.04 507
GBPUSD 50.75% 0.85 0.83 398
USDCAD 50.48% 1.14 1.11 513
BTCUSD 50.44% 0.98 0.96 337
ETHUSD 50.95% 0.83 0.80 365
GOLD 47.98% 0.82 0.89 471
S&P500 41.81% 0.72 1.01 55
FTSE100 53.91% 1.81 1.55 115

这种模式在 USDCHF 和 FTSE 100 上的表现似乎优于其他回测资产。重要的是要知道,无论是好的还是坏的模式,都不太可能在每个市场上起作用;因此,当您找到一个好的模式时,必须在正确的市场上交易。

最简单的例子是趋势市场上反转模式的表现不佳,以及区域市场上继续模式的表现不佳。请记住,您要寻找的是好的技术(模式或策略),而不是完美的技术

弹弓模式

此模式的名称来自于它处理确认新趋势的突破系统。因此,弹弓模式是一种四蜡烛线趋势检测系统,它在突破发生后使用回调方法。定义可能看起来很复杂,但实际上很简单。让我们从看涨弹弓的条件开始。

首先,该模式的特征是有一个首个看涨蜡烛线,随后是一个更高的蜡烛线,确认了看涨倾向,然后是另外两个蜡烛线,后者未突破前者的高点。最后,最后一个蜡烛线的低点必须等于或低于第一个蜡烛线的高点,且收盘价高于第二个蜡烛线的最高点。第二个和第三个蜡烛线的颜色没有严格的规则。图 5-15 显示了完美的看涨弹弓模式。

图 5-15. 看涨弹弓模式

看跌弹弓模式(图 5-16)的特点是有一个首个看跌蜡烛线,随后是一个较低的蜡烛线,确认了看跌倾向,然后是另外两个蜡烛线,后者未突破前者的低点。最后,最后一个蜡烛线的高点必须等于或高于第一个蜡烛线的低点,且收盘价低于第二个蜡烛线的最低点。

图 5-16. 看跌弹弓模式

检测弹弓模式有些复杂,因为条件和其罕见性,但可以通过算法简化,如下所示:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

    `# Bullish pattern`
           if data[i, close_column] > data[i - 1, high_column] and \               data[i, close_column] > data[i - 2, high_column] and \               data[i, low_column] <= data[i - 3, high_column] and \               data[i, close_column] > data[i, open_column] and \               data[i - 1, close_column] >= data[i - 3, high_column] and \               data[i - 2, low_column] >= data[i - 3, low_column] and \               data[i - 2, close_column] > data[i - 2, open_column] and \               data[i - 2, close_column] > data[i - 3, high_column] and \               data[i - 1, high_column] <= data[i - 2, high_column]: 

                    data[i + 1, buy_column] = 1 

           `# Bearish pattern`
           elif data[i, close_column] < data[i - 1, low_column] and \                 data[i, close_column] < data[i - 2, low_column] and \                 data[i, high_column] >= data[i - 3, low_column] and \                 data[i, close_column] < data[i, open_column] and \                 data[i - 1, high_column] <= data[i - 3, high_column] and \                 data[i - 2, close_column] <= data[i - 3, low_column] and \                 data[i - 2, close_column] < data[i - 2, open_column] and \                 data[i - 2, close_column] < data[i - 3, low_column] and \                 data[i - 1, low_column] >= data[i - 2, low_column]:   

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 5-17 显示了黄金商品的示例,突出了弹弓模式给出的信号。

图 5-17. 黄金信号图

该模式通常用于短期趋势延续走势;因此,目标不是在同一方向持续几天,而是至少形成边际新高点(看涨弹弓)或新低点(看跌弹弓)。

因此,退出策略可以极大地影响此模式的结果。尽管如此,我使用与其他模式相同的条件进行回测(在下一个信号出现时退出,无论是看涨还是看跌)。

实际上,您必须根据风险和回报偏好制定自己的入场和退出规则,以便优化预期结果。图 5-18 显示了 AUDNZD 的示例。

图 5-18. AUDNZD 信号图

表 5-5 总结了弹弓模式的结果。

表 5-5. 弹弓模式:绩效摘要表

资产 命中率 盈利因子 风险-回报比 信号
欧元美元 50.03% 0.98 0.98 1591
美元瑞郎 51.81% 0.96 0.90 1621
英镑美元 48.27% 1.01 1.08 1622
美元加元 48.61% 0.94 0.99 1728
BTC 美元 52.01% 0.88 0.82 721
以太坊美元 48.52% 1.01 1.07 577
黄金 47.90% 0.85 0.93 1332
S&P500 49.36% 1.01 1.04 158
FTSE100 57.14% 1.38 1.04 189

与其他蜡烛图案相比,弹弓模式的信号数量相对较多。然而,由于受到退出技术的影响(将在后续章节中介绍),除了富时 100 外,其可预测性相对较低。

H 模式

H模式是一种三根蜡烛的连续形态。看涨的 H 模式(图 5-19)由一个看涨的蜡烛后跟一个不确定的蜡烛组成³,其开盘价等于收盘价。接下来,第三根蜡烛必须是看涨的,其收盘价必须高于不确定蜡烛的收盘价。最后,第三根蜡烛的低点必须高于不确定蜡烛的低点。

图 5-19. 一个看涨的 H 模式

熊市 H 模式(图 5-20)由一个熊市蜡烛后跟一个不确定的蜡烛组成;接下来,第三根蜡烛必须是熊市的,其收盘价必须低于不确定蜡烛的收盘价。最后,第三根蜡烛的高点必须低于不确定蜡烛的高点。

图 5-20. 一个熊市 H 模式

下面的代码片段显示了如何扫描 H 模式:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish pattern`
           if data[i, close_column] > data[i, open_column] and \               data[i, close_column] > data[i - 1, close_column] and \               data[i, low_column] > data[i - 1, low_column] and \               data[i - 1, close_column] == data[i - 1, open_column] and \               data[i - 2, close_column] > data[i - 2, open_column] and \               data[i - 2, high_column] < data[i - 1, high_column]:

                    data[i + 1, buy_column] = 1 

           `# Bearish pattern`
           elif data[i, close_column] < data[i, open_column] and \                 data[i, close_column] < data[i - 1, close_column] and \                 data[i, low_column] < data[i - 1, low_column] and \                 data[i - 1, close_column] == data[i - 1, open_column] and \                 data[i - 2, close_column] < data[i - 2, open_column] and \                 data[i - 2, low_column] > data[i - 1, low_column]:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 5-21 展示了 S&P 500 生成信号的示例。显然,该模式在实际中可能较为罕见,这取决于市场的特性。理论上,趋势跟随模式在趋势市场上的平均表现比区间市场要好。

鉴于股票大多处于趋势状态,性能摘要表显示,H 模式在股票指数上表现优异。

图 5-21. S&P 500 上的信号图表

模式通常有所谓的潜在目标。到目前为止,你已经在假设在下一个信号时退出的情况下对它们进行了回测。这是可以接受的,因为你希望通过对比各种模式的结果来进行客观评估。

使用本书中介绍的 H 模式和其他现代蜡烛图案,我发现强行施加某种退出并没有真正增加价值,因为每个市场的表现都不同。因此,最好是根据自己的判断使用退出策略,或者如果仅仅依据图案交易,则在下一个信号时退出。

图 5-22 展示了 AUDNZD 货币对小时值上生成的信号。

图 5-22. AUDNZD 上的信号图表

现在让我们来看看回测结果,并看看如何解读它们(参见表 5-6)。

表 5-6. H 模式:性能摘要表

资产 命中率 盈利因子 风险-回报比 信号数
EURUSD 51.56% 0.89 0.84 128
美元/瑞郎 45.83% 0.77 0.91 144
英镑/美元 44.68% 0.93 1.15 94
美元/加元 57.49% 1.31 0.97 120
比特币/美元 61.53% 3.25 2.03 26
以太坊/美元 41.83% 0.55 0.77 98
黄金 65.38% 2.55 1.34 52
标准普尔 500 指数 59.64% 1.33 0.90 57
富时 100 指数 50.00% 1.35 1.35 36

这种模式似乎具有更强的预测力,但缺点在这里显而易见:信号的频率。你可以清楚地看到交易的缺乏。正如预期的那样,在标普 500 指数和富时 100 等趋势市场上,你会看到比在美元/加元和英镑/美元等区间市场上更好的结果。

¹ 当市场参与者预期由于极端条件而出现逆转,但市场继续保持初始状态时,就会发生这种事件。

² 美元/土耳其里拉是以 1 美元兑换土耳其里拉的价值。

³ 犹豫模式也被称为十字星。

第六章:经典反向模式

到目前为止,您应该已经熟悉趋势跟随的概念,即在预期其持续的情况下,骑着现有趋势前进的技术。现在是时候看看反向模式,这些模式信号可能发生逆转或至少是初始动作的修正。因此,反向模式建议的策略是与其骑趋势相反,而是逆市操作。

本章涵盖了经典的反向模式。请记住,所谓的经典是指在技术分析领域中已知和已建立的模式。本章的目的是创建反向模式的客观条件,并对其进行回测,以便您对其频率和可预测性形成自己的看法。

阴阳线图案

每当有人提到蜡烛图模式时,许多人会想到阴阳线图案,因为这是最为人熟知和直观的配置。日语中,“doji”的意思是“错误”,这是合理的,因为交易者将其标记为一种犹豫图案。

与光头光脚图案类似,阴阳线图案是一种开盘价等于收盘价的单根蜡烛配置。这就是为什么阴阳线是一种犹豫图案。

要区分牛市阴阳线和熊市阴阳线,你必须检查前一根蜡烛和其后一根蜡烛。图 6-1 展示了理论上的牛市阴阳线配置。在下跌市场中,出现像阴阳线这样的犹豫蜡烛可能是变向的第一个线索。它必须通过随后的牛市蜡烛确认。

图 6-1. 牛市阴阳线

相比之下,图 6-2 展示了理论上的熊市阴阳线配置。在上升市场中,出现阴阳线可能预示着当前方向可能发生变化。类似地,这必须通过随后的熊市蜡烛确认。

图 6-2. 熊市阴阳线

阴阳线图案的理论基础在于力量平衡的概念。当买方多于卖方时,力量平衡向上倾斜,因为需求大于供给;因此市场上升。

当需求开始失去动力并接近供给水平时,就会出现均衡,这表现为在塑造新高点的动力减弱。均衡出现在出现阴阳线图案时,收盘价等于开盘价,表明双方都未能成功将价格推向各自期望的方向。

相反,当供给相对于需求增加时,市场应开始下跌。阴阳线形成均衡点,市场从牛市转向预期的熊市制度。

有趣的是,还有其他类型的阴阳线图案,比如以下几种。

蜻蜓十字星

这种类型的十字星其高价等于收盘价和开盘价。这意味着它是一种只有低价与其他不同的十字星。它也是一个犹豫模式,根据之前的价格走势可以是看涨或看跌的。这种模式的问题在于你可以用两种方式来理解它:一种是市场没有形成更高的高点,因此未能继续上涨,形成看跌倾向;另一种是市场未能收盘低点并回升至原点,形成看涨倾向。无论如何,它必须像所有十字星模式一样被视为反转模式。

Figure 6-3 描述了一个蜻蜓十字星。

Figure 6-3. 蜻蜓十字星

墓碑十字星

这与蜻蜓十字星相反。它遵循相同的直觉,并具有相同的期望,这取决于之前的价格走势。在市场下跌的情况下,如果遇到墓碑十字星,则必须有一个看涨倾向。同样地,如果市场上涨并遇到墓碑十字星,则必须有一个看跌倾向。

Figure 6-4 描述了一个墓碑十字星。

Figure 6-4. 墓碑十字星

平十字星

这种模式通常出现在零售市场关闭或市场接近假期时。低流动性和低交易量是平十字星的主要特征,不太可能指示市场方向。然而,它仍然是一种市场犹豫的类型,其中四个价格相等。这就是为什么它看起来像一条水平线。

Figure 6-5 描述了一个平十字星。

Figure 6-5. 平十字星

双十字星

犹豫可能持续超过一个周期。有可能会看到多个连续的十字星模式。两个连续的十字星模式表示持续的犹豫,而逆势交易者仍在犹豫和努力推动市场朝他们的方向发展,这可能降低了反转的信心。一般来说,两个十字星模式不比一个十字星模式更有价值。

Figure 6-6 描述了一个双十字星。

Figure 6-6. 双十字星

三星十字星

这可能是所有其他十字星模式中最稀有的一种。它的特点是有三个十字星模式,中间的一个跳过其他两个。

Figure 6-7 描述了一个三星十字星。

Figure 6-7. 三星十字星
注意

十字星模式并不完美,因为它可能多次出现后市没有任何反应。这是因为开盘价和收盘价之间的平衡并不一定意味着预期的买卖活动达到了平衡。

算法上,条件并不复杂。你需要像前面展示的那样四舍五入数值,然后遵循以下直觉:

  • 如果当前收盘价格高于当前开盘价格,前一次收盘价格等于开盘价格,并且前一次收盘价格低于前一次开盘价格,则在下一行打印 1。

  • 如果当前收盘价格低于当前开盘价格,前一次收盘价格等于开盘价格,并且前一次收盘价格高于前一次开盘价格,则在下一行打印−1。

我之前提到道琼斯蜡烛图形是一种单蜡烛配置。这是因为道琼斯蜡烛图具有相同的开盘和收盘价格。然而,要确认该图案,以便算法预测下一个可能的方向,您必须施加前述条件。

您可以通过以下代码片段编写道琼斯蜡烛图案的信号函数:

def signal(data, open_column, close_column, buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish pattern`
           if data[i, close_column] > data[i, open_column] and \               data[i, close_column] > data[i - 1, close_column] and \               data[i - 1, close_column] == data[i - 1, open_column] and \               data[i - 2, close_column] < data[i - 2, open_column] and \               data[i - 2, close_column] < data[i - 2, open_column]:

                    data[i + 1, buy_column] = 1 

           `# Bearish pattern`
           elif data[i, close_column] < data[i, open_column] and \               data[i, close_column] < data[i - 1, close_column] and \               data[i - 1, close_column] == data[i - 1, open_column] and \               data[i - 2, close_column] > data[i - 2, open_column] and \               data[i - 2, close_column] > data[i - 2, open_column]:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 6-8 显示了美元/瑞士法郎的信号图表。

图 6-8. 美元/瑞士法郎信号图表

显然,道琼斯蜡烛图案并不罕见。图 6-9 展示了富时 100 的另一个信号图表。

图 6-9. 富时 100 信号图表

表 6-1 显示了道琼斯蜡烛图案的性能摘要。在检查结果之前,让我们回顾之前提到的交易条件:

  • 入场是在验证当前收盘价格信号后的下一个开盘价格上完成的。

  • 出局是在任一方向(牛市或熊市)获得另一个信号时完成的。

  • 交易成本在性能评估指标中被省略。

  • 没有风险管理系统。

表 6-1. 道琼斯蜡烛图案:性能摘要表

资产 命中率 盈利因子 风险-回报比 信号数
欧元/美元 45.86% 0.97 1.14 1537
美元/瑞士法郎 45.33% 0.83 1.00 1661
英镑/美元 49.78% 1.03 1.04 1177
美元/加元 48.06% 0.92 1.00 1315
比特币/美元 48.69% 0.93 0.98 345
以太坊/美元 45.69% 0.91 1.09 1254
黄金 46.17% 1.05 1.22 3166
标准普尔 500 指数 48.84% 1.11 1.16 303
富时 100 指数 50.27% 1.02 1.00 179

经过回测的资产显示,道琼斯蜡烛图案是一种常见的配置,但一般不具有预测性质。根据我的经验,在依赖道琼斯蜡烛图来预测未来反应之前,定义当前市场趋势是至关重要的。例如,在牛市趋势市场中,熊市道琼斯蜡烛图案不太可能提供高质量的信号,但在横盘市场中,效力增加(记住看不见的手)。

总结一下,道琼斯蜡烛图案由于其简单和配置的丰富性是技术图案识别的基础,但远非最具预测性的图案。

榄寡妇线形态

日语中与“怀孕”同义的旧词相符,Harami模式是一个经典的反向两根蜡烛结构,第二根蜡烛的实体被第一根蜡烛的实体包围。通常有严格版和灵活版两种 Harami 模式,本章将分别讨论。让我们从灵活版本开始。

牛市阴线显示第一根熊市蜡烛(母亲)后跟第二根牛市蜡烛(宝宝),它的收盘价低于第一根蜡烛的开盘价,并且开盘价高于第一根蜡烛的收盘价。在灵活版本中,两根蜡烛的高点和低点不相关,而在严格版本中讨论。图 6-10 展示了一个灵活的牛市阴线。

图 6-10. 一个牛市的灵活 Harami

熊市阴线显示第一根牛市蜡烛(母亲)后跟第二根熊市蜡烛(宝宝),它的开盘价低于第一根蜡烛的收盘价,并且收盘价高于第一根蜡烛的开盘价。图 6-11 展示了一个灵活的熊市 Harami。

图 6-11. 一个熊市的灵活 Harami

Harami模式的心理解释是,逐渐减小的蜡烛尺寸暗示初期趋势的犹豫,并且可能会有反转迹象。一般来说,对于经典模式,可能存在一种自我实现预言的情况,其中一定百分比的可预测性归因于该模式的声誉,而非直观的解释。

注意

一些模式可能没有有效的直觉,但仍然受到专业交易员的监视。这是因为许多其他交易员也在监视它们,形成了可能增加其可预测性的无限螺旋。

根据算法,条件应遵循以下直觉:

  • 如果当前的收盘价高于当前的开盘价和前一次的收盘价,并且当前的开盘价高于前一次的收盘价但低于前一次的开盘价,则在下一个买入行中打印 1。

  • 如果当前的收盘价低于当前的开盘价和前一次的收盘价,并且当前的开盘价低于前一次的收盘价但高于前一次的开盘价,则在下一个卖出行中打印-1。

灵活 Harami 模式的信号功能如下:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish pattern`
           if data[i, close_column] < data[i - 1, open_column] and \               data[i, open_column] > data[i - 1, close_column] and \               data[i, high_column] < data[i - 1, high_column] and \               data[i, low_column] > data[i - 1, low_column] and \               data[i, close_column] > data[i, open_column] and \               data[i - 1, close_column] < data[i - 1, open_column] and \               data[i - 2, close_column] < data[i - 2, open_column]:

                    data[i + 1, buy_column] = 1 

           `# Bearish pattern`
           elif data[i, close_column] > data[i - 1, open_column] and \                 data[i, open_column] < data[i - 1, close_column] and \                 data[i, high_column] < data[i - 1, high_column] and \                 data[i, low_column] > data[i - 1, low_column] and \                 data[i, close_column] < data[i, open_column] and \                 data[i - 1, close_column] > data[i - 1, open_column] and \                 data[i - 2, close_column] > data[i - 2, open_column]:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 6-12 显示了 ETHUSD 上的一个信号图表,其中在整体上涨趋势中的小幅熊市修正中出现了一个牛市的 Harami。

图 6-12. ETHUSD 的信号图表

表 6-2 总结了灵活 Harami 模式的表现。

表 6-2. 灵活 Harami 模式:性能总结表

资产 命中率 盈利因子 风险-收益比 信号
EURUSD 50.06% 1.15 1.15 759
USDCHF 53.14% 1.12 0.99 668
GBPUSD 49.81% 1.06 1.06 823
USDCAD 52.15% 1.06 0.97 696
BTCUSD 48.19% 0.96 1.04 554
ETHUSD 48.81% 0.63 0.66 379
GOLD 48.73% 0.77 0.82 870
S&P500 53.75% 1.12 0.96 80
FTSE100 57.44% 1.42 1.05 94

图 6-13 展示了 GBPUSD 上的一个熊背离信号图。

图 6-13. GBPUSD 上的信号图

现在让我们转向严格熊背离形态。看涨的熊背离显示第一个看跌蜡烛(母蜡烛),后跟第二个看涨蜡烛(子蜡烛),其高价低于第一个蜡烛的开盘价,低价高于第一个蜡烛的收盘价。图 6-14 说明了一个看涨的严格熊背离形态。

图 6-14. 一个看涨的严格熊背离形态

熊背离形态显示第一个看涨蜡烛(母蜡烛),后跟第二个看跌蜡烛(子蜡烛),其高价低于第一个蜡烛的收盘价,低价高于第一个蜡烛的开盘价。图 6-15 说明了一个严格熊背离形态。

图 6-15. 一个熊背离严格形态

从算法角度看,条件应按以下直觉进行:

  • 如果当前蜡烛图是看涨的,并完全包含在前一个看跌蜡烛图之内,则在下一个买入行中打印 1。

  • 如果当前蜡烛图是看跌的,并完全包含在前一个看涨蜡烛图之内,则在下一个卖出行中打印 -1。

严格熊背离形态的信号函数如下:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish pattern`
           if data[i, close_column] > data[i, open_column] and \               data[i, high_column] < data[i - 1, open_column] and \               data[i, low_column] > data[i - 1, close_column] and \               data[i - 1, close_column] < data[i - 1, open_column] and \               data[i - 2, close_column] < data[i - 2, open_column]:

                    data[i + 1, buy_column] = 1 

  `# Bearish pattern`
           elif data[i, close_column] < data[i, open_column] and \                 data[i, high_column] < data[i - 1, close_column] and \                 data[i, low_column] > data[i - 1, open_column] and \                 data[i - 1, close_column] > data[i - 1, open_column] and \                 data[i - 2, close_column] > data[i - 2, open_column]:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

由于严格熊背离形态的罕见性,回测结果并不是非常有信息性。数据分析需要大量输出;因此,少数信号不太可能得出任何健壮的结论。在实践中,你不应常见到严格熊背离形态,而更多是灵活版本。

总结一下,熊背离形态是一个由两根蜡烛图组成的配置,可以有两种变化形式:灵活和严格。前者版本最常用,因为有足够的数据来评估,而后者由于条件严格而极其罕见。

熊势颈线形态

熊势颈线形态是一个容易理解的两根蜡烛图组合。看涨的熊势颈线由第一个看跌蜡烛图和第二个看涨蜡烛图组成,后者开盘价低于前者,但收盘价与第一个蜡烛图相同。图 6-16 说明了一个看涨的熊势颈线形态。

图 6-16. 一个看涨的熊势颈线形态

熊势颈线形态由第一个看涨蜡烛图和第二个看跌蜡烛图组成,后者开盘价高于前者,但收盘价与第一个蜡烛图相同。图 6-17 展示了一个熊势颈线形态。

图 6-17. 一个熊势颈线形态

自然地,根据这些条件,你需要像我之前展示的那样四舍五入数值。这是为了增加信号频率而不放弃任何条件。

Bullish On Neck 模式的心理直觉源于尽管卖家控制了局面,但向下跳空未能进一步推动市场价格下跌,买家成功收盘于前次收盘价,从而掌控了局面。Bearish On Neck 模式有相同的直觉,但方向相反,最初由买家掌控,后来卖家填补了下跳空并显示了他们的存在。

Note

On Neck 的名称来源于第二个蜡烛图看起来像是抓住第一个蜡烛图的脖子。

算法上,条件应该遵循以下步骤:

  • 如果当前收盘价高于当前开盘价且等于前次收盘价,并且当前开盘价低于前次收盘价,则在下一个买入行中打印 1。

  • 如果当前收盘价低于当前开盘价且等于前次收盘价,并且当前开盘价高于前次收盘价,则在下一个卖出行中打印-1。

On Neck 模式的信号函数如下:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish pattern`
           if data[i, close_column] > data[i, open_column] and \               data[i, close_column] == data[i - 1, close_column] and \               data[i, open_column] < data[i - 1, close_column] and \               data[i - 1, close_column] < data[i - 1, open_column]:

                    data[i + 1, buy_column] = 1 

           `# Bearish pattern`
           elif data[i, close_column] < data[i, open_column] and \                 data[i, close_column] == data[i - 1, close_column] and \                 data[i, open_column] > data[i - 1, close_column] and \                 data[i - 1, close_column] > data[i - 1, open_column]:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

Figure 6-18 展示了 EURUSD 的信号图表。

Figure 6-18. Signal chart on EURUSD

Table 6-3 总结了该模式的表现。

Table 6-3. On Neck 模式:性能摘要表

Asset 命中率 盈利因子 风险-收益比 信号数
EURUSD 51.30% 1.14 1.08 191
USDCHF 46.36% 0.88 1.02 220
GBPUSD 54.63% 1.28 1.06 194
USDCAD 50.84% 1.00 0.97 177
BTCUSD 44.04% 0.42 0.53 84
ETHUSD 41.41% 0.56 0.79 99
GOLD 51.56% 1.27 1.19 128
S&P500 36.11% 0.35 0.61 36
FTSE100 57.50% 0.79 0.58 40

Figure 6-19 展示了金价信号图表。

Figure 6-19. Signal chart on gold

总结来说,On Neck 模式在市场中表现出混合的结果。此外,它可能相当罕见。

Tweezers Pattern

Tweezers 模式是一个由两个蜡烛图组成的反向配置。它是最简单和最直接的反向模式之一。Bullish Tweezers 模式由第一个看跌的蜡烛图和第二个与第一个蜡烛图低点相同的看涨蜡烛图组成。Figure 6-20 展示了一个 Bullish Tweezers 模式。

Figure 6-20. A bullish Tweezers

Bearish Tweezers 模式由第一个看涨的蜡烛图和第二个与第一个蜡烛图高点相同的看跌蜡烛图组成。Figure 6-21 展示了一个 Bearish Tweezers 模式。

Figure 6-21. A bearish Tweezers
Note

该模式被称为 镊子,因为等式条件类似于一对镊子。可以说,这种命名模式有些牵强。

看涨的镊子模式的心理直觉来自于市场未能形成新低,可能已找到支撑。看跌的镊子模式来自于市场未能形成新高,可能已找到阻力。

算法上来说,条件应该遵循这种直觉:

  • 如果当前的看涨蜡烛的最低价等于前一个看跌蜡烛的最低价,则在下一个买入行中打印 1。

  • 如果当前的看跌蜡烛的最高价等于前一个看涨蜡烛的最高价,则在下一个卖出行中打印-1。

镊子模式的信号函数如下:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish pattern`
           if data[i, close_column] > data[i, open_column] and \               data[i, low_column] == data[i - 1, low_column] and \               data[i, close_column] - data[i, open_column] < body and \               data[i - 1, close_column] - data[i - 1, open_column] < body 
              and data[i - 1, close_column] < data[i - 1, open_column] \               and data[i - 2, close_column] < data[i - 2, open_column]:

                    data[i + 1, buy_column] = 1 

           `# Bearish pattern`
           elif data[i, close_column] < data[i, open_column] and \                 data[i, high_column] == data[i - 1, high_column] and \                 data[i, close_column] - data[i, open_column] < body and \                 data[i - 1, close_column] - data[i - 1, open_column] < \                 body and data[i - 1, close_column] > data[i - 1, \                 open_column] and data[i - 2, close_column] > data[i - 2, \                 open_column]:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 6-22 展示了黄金的信号图表。你可以看到有时同一区域可能会有很多镊子形态。

图 6-22. 黄金的信号图表

表 6-4 总结了该模式的绩效。

表 6-4. 镊子模式:绩效摘要表

资产 命中率 盈利因子 风险-收益比 信号数
欧元美元 50.77% 1.20 1.17 1028
美元瑞郎 48.27% 1.12 1.20 1104
英镑美元 49.32% 0.89 0.91 667
美元加元 49.71% 0.87 0.88 883
比特币美元 46.61% 1.17 1.35 354
以太币美元 50.16% 0.82 0.81 911
黄金 50.57% 1.03 1.01 1038
标普 500 48.61% 0.96 1.01 253
富时 100 49.04% 1.09 1.14 157

总结一下,镊子模式是一个简单的构型,结果略带负面到混合。

图 6-23 显示了富时 100 的信号图表,可以在底部看到一个镊子模式。

图 6-23. 富时 100 的信号图表

Stick Sandwich 模式

Stick Sandwich 模式是一个由颜色交替的三根蜡烛组成的反向构型。看涨的 Stick Sandwich 包括首先是一根看跌蜡烛,接着是一根较小的看涨蜡烛,最后是一根比第二根蜡烛大的看跌蜡烛。图 6-24 展示了一个看涨的 Stick Sandwich 模式。

图 6-24. 一个看涨的棒形三明治

看跌的 Stick Sandwich 包括首先是一根看涨蜡烛,接着是一根较小的看跌蜡烛,最后是一根比第二根蜡烛大的看涨蜡烛。图 6-25 展示了一个看跌的 Stick Sandwich 模式。

图 6-25. 一个看跌的棒形三明治

一般来说,Stick Sandwich 模式出现在趋势中;因此,看涨的 Stick Sandwich 在看跌的价格行动之前,看跌的 Stick Sandwich 在看涨的价格行动之前出现。

棍子三明治模式的名称来源于其外部大蜡烛看起来像面包,中间蜡烛看起来像馅料的形状。

牛市棍子三明治的心理直觉来自于市场未能形成新低,可能已找到支撑(类似于镊子的直觉)。熊市棍子三明治模式来自于市场未能形成新高,可能已找到阻力。

棍子三明治的信号功能如下:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish pattern`
           if data[i, close_column] < data[i, open_column] and \               data[i, high_column] > data[i - 1, high_column] and \               data[i, low_column] < data[i - 1, low_column] and \               data[i - 1, close_column] > data[i - 1, open_column] and \               data[i - 2, close_column] < data[i - 2, open_column] and \               data[i - 2, high_column] > data[i - 1, high_column] and \               data[i - 2, low_column] < data[i - 1, low_column] and \               data[i - 2, close_column] < data[i - 3, close_column] and \               data[i - 3, close_column] < data[i - 3, open_column]:

                    data[i + 1, buy_column] = 1 

           `# Bearish pattern`
           elif data[i, close_column] > data[i, open_column] and \                 data[i, high_column] > data[i - 1, high_column] and \                 data[i, low_column] < data[i - 1, low_column] and \                 data[i - 1, close_column] < data[i - 1, open_column] and \                 data[i - 2, close_column] > data[i - 2, open_column] and \                 data[i - 2, high_column] > data[i - 1, high_column] and \                 data[i - 2, low_column] < data[i - 1, low_column] and \                 data[i - 2, close_column] > data[i - 3, close_column] and\                 data[i - 3, close_column] > data[i - 3, open_column]:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 6-26 展示了 GBPUSD 的信号图表。

图 6-26. GBPUSD 的信号图表

图 6-27 展示了 USDCAD 的信号图表。

图 6-27. USDCAD 的信号图表

表 6-5 总结了该模式的表现。

表 6-5. 棍子三明治模式:性能总结表

资产 命中率 盈利因子 风险-回报比 信号数
EURUSD 44.26% 0.73 0.92 253
USDCHF 47.53% 1.00 1.10 284
GBPUSD 49.37% 0.97 0.99 318
USDCAD 49.12% 1.01 1.05 285
BTCUSD 51.12% 1.88 1.80 178
ETHUSD 50.37% 1.56 1.54 135
GOLD 50.99% 0.96 0.92 251
S&P500 56.86% 1.19 0.90 51
FTSE100 53.84% 2.62 2.24 39

总结一下,棍子三明治模式在本章中表现略胜一筹。这使得它成为与技术指标和其他退出技术结合的有趣候选。

锤子模式

从技术上讲,锤子模式只是称为四种不同(但相似)蜡烛图形的一个名称,分别为流星,吊人,锤子和倒锤子。根据我的经验,只有锤子和倒锤子值得追求,因为它们在本节后面讨论的直觉是有效的。

牛市锤子是一个长低影线没有高影线的牛市蜡烛图。此外,它必须有一个相对较小的实体。图 6-28 说明了一个牛市锤子。

图 6-28. 一个牛市锤子

熊市锤子是一个长高影线没有短低影线的熊市蜡烛图。此外,它必须有一个相对较小的实体。图 6-29 说明了一个熊市锤子。

图 6-29. 一个熊市锤子

锤子模式的名称来自于长影线看起来像锤柄而蜡烛的实体看起来像锤头。

牛市锤子的直觉是,在时段内形成极端低点后,买家设法收高于开盘价。相反,熊市锤子的直觉是,在形成极端高点后,卖家设法收低于开盘价,从而掌控局势。

锤头模式的信号函数如下:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

            `# Bullish pattern`
            if data[i, close_column] > data[i, open_column] and \                abs(data[i - 1, close_column] - data[i - 1, open_column]) \                < body and min(data[i - 1, close_column], data[i - 1, \                open_column]) - data[i - 1, low_column] > 2 * wick and \                data[i - 1, close_column] == data[i - 1, high_column] and \                data[i - 2, close_column] < data[i - 2, open_column]:

                     data[i + 1, buy_column] = 1 

            `# Bearish pattern`
            elif data[i, close_column] < data[i, open_column] and \                  abs(data[i -1, close_column] - data[i - 1, open_column]) \                  < body and data[i - 1, high_column] - max(data[i - 1, \                  close_column], data[i - 1, open_column]) > 2 * wick and \                  data[i - 1, close_column] == data[i - 1, low_column] and \                  data[i - 2, close_column] > data[i - 2, open_column]:

                     data[i + 1, sell_column] = -1                      

       except IndexError:

            pass

    return data

图 6-30 展示了英镑/美元的信号图表。

图 6-30. 英镑/美元的信号图表

表 6-6 总结了该图案的表现。

表 6-6. 锤头模式:绩效总结表格

资产 命中率 盈利因子 风险-收益比 信号数
EURUSD 47.82% 1.24 1.36 23
USDCHF 61.11% 1.93 1.23 36
GBPUSD 47.61% 0.87 0.96 21
USDCAD 42.85% 0.7 0.94 28
BTCUSD 52.63% 2.39 2.14 19
ETHUSD 60.00% 1.08 0.72 20
GOLD 47.36% 1.09 1.22 38
S&P500 57.57% 2.22 1.63 33
FTSE100 55.00% 1.22 0.99 20

总结一下,锤头形态是一个简单直观的配置,但相当罕见,这使得其评估有偏差。

图 6-31 展示了美元/加元的信号图表。

图 6-31. 美元/加元的信号图表

星型图案

形态是一个包含间隙和颜色交替的三蜡烛反向配置,比其他模式更不常见。这是因为其特性使得其不太可能经常发生。

看涨的星型图案,也称为晨星,由一个看跌蜡烛后跟随一个小实体蜡烛组成,前者的间隙低于它,之后是第三个看涨蜡烛,其间隙高于中间蜡烛。图 6-32 展示了一个晨星图案。

图 6-32. 晨星

看跌的星型图案,也称为晚星,由一个看涨蜡烛后跟随一个小实体蜡烛组成,前者的间隙高于它,之后是第三个看跌蜡烛,其间隙低于中间蜡烛。图 6-33 展示了一个晚星图案。

图 6-33. 晚星

星型图案的名称来自于中间的蜡烛形成孤立,使其看起来像是遥远的星星。

晨星的直觉是市场已经完美地形成了一个 U 型转折,需求现在比之前更加健康,因为平衡的转移(由第三个看涨蜡烛确认)。晚星也适用相同的直觉。

星型图案的信号函数如下:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

        `# Bullish pattern`
            if data[i, close_column] > data[i, open_column] and \                max(data[i - 1, close_column], data[i - 1, open_column]) \                < data[i, open_column] and max(data[i - 1, close_column], \                data[i - 1, open_column]) < data[i - 2, close_column] and \                data[i - 2, close_column] < data[i - 2, open_column]:

                     data[i + 1, buy_column] = 1 

            `# Bearish pattern`
            elif data[i, close_column] < data[i, open_column] and \                  min(data[i - 1, close_column], data[i - 1, open_column]) \
                 > data[i, open_column] and min(data[i - 1, close_column],\                  data[i - 1, open_column]) > data[i - 2, close_column] \                  and data[i - 2, close_column] > data[i - 2, open_column]:

                     data[i + 1, sell_column] = -1                      

       except IndexError:

            pass

    return data

图 6-34 展示了标准普尔 500 的信号图表。

图 6-34. 标准普尔 500 的信号图表

由于图案的罕见性,回测被省略。

刺透图案

刺透 模式是技术图案识别领域中最著名的两蜡烛形态之一。看涨的刺透模式由一个看跌蜡烛后跟随一个看涨蜡烛组成,后者开盘比前一个蜡烛的收盘价低,并且收盘价高于前一个蜡烛的开盘价。图 6-35 展示了一个看涨的刺透模式。

图 6-35. 一个看涨的刺透形态

看跌刺透形态由一根看涨蜡烛后跟一根开盘高于前一蜡烛收盘价的看跌蜡烛组成。图 6-36 展示了一个看涨刺透形态。

图 6-36. 一个看跌的刺透形态
注:

刺透形态的名称来源于第二根蜡烛从外部穿透第一根蜡烛的事实。

看涨刺透形态的直觉是,尽管市场开盘时有较低的缺口,但前一收盘价仍被超越。该形态显示出购买者不愿意放弃购买活动,这些活动阻止了市场继续下跌。类似地,看跌刺透形态中的卖方拒绝让缺口保持未填补状态,并掌控了市场。

刺透形态的信号功能如下:

def signal(data, open_column, close_column, buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish pattern`
           if data[i, close_column] > data[i, open_column] and \               data[i, close_column] < data[i - 1, open_column] and \               data[i, close_column] > data[i - 1, close_column] and \               data[i, open_column] < data[i - 1, close_column] and \               data[i - 1, close_column] < data[i - 1, open_column] and \               data[i - 2, close_column] < data[i - 2, open_column]:    

                    data[i + 1, buy_column] = 1 

           `# Bearish pattern`
           elif data[i, close_column] < data[i, open_column] and \                 data[i, close_column] > data[i - 1, open_column] and \                 data[i, close_column] < data[i - 1, close_column] and \                 data[i, open_column] > data[i - 1, close_column] and \                 data[i - 1, close_column] > data[i - 1, open_column] and \                 data[i - 2, close_column] > data[i - 2, open_column]: 

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 6-37 展示了黄金的信号图表。

图 6-37. 黄金信号图表

图 6-38 展示了富时 100 的信号图表。

图 6-38. 富时 100 信号图表

表 6-7 总结了该形态的表现。

表 6-7. 刺透形态:表现总结表

资产 命中率 盈利因子 风险-回报比 信号
欧元兑美元 51.41% 0.95 0.90 1904
美元兑瑞士法郎 49.26% 0.93 0.95 1961
英镑兑美元 50.83% 0.84 0.81 1985
美元兑加拿大元 50.73% 0.93 0.90 1961
比特币兑美元 50.88% 0.87 0.84 1584
以太币兑美元 48.68% 0.91 0.96 1066
黄金 51.30% 0.96 0.92 2341
标准普尔 500 指数 49.46% 1.06 1.07 186
富时 100 指数 49.49% 0.96 0.98 295

刺透形态可能很常见,但其盈利能力与其他形态相比较低。

吞没形态

吞没形态,一个由两根蜡烛构成的反向模式,是 Harami 形态的镜像。有趣的是,它们都具有反向操作的特性。看涨吞没形态由第一根看跌蜡烛和随后完全包含它的看涨蜡烛组成。图 6-39 展示了一个看涨吞没形态。

图 6-39. 一个看涨吞没形态

看跌吞没形态由第一根看涨蜡烛和随后的完全包含它的看跌蜡烛组成。图 6-40 展示了一个看跌吞没形态。

图 6-40. 一个看跌吞没形态
注:

吞没形态的名称来源于第二根蜡烛完全覆盖(或吞没)第一根蜡烛的事实。

Engulfing 形态的直觉在于第二根蜡烛完全遮盖了第一根蜡烛。显然,当发生 Engulfing 时,会出现动态变化,由相反方向的更大蜡烛线表示。

Engulfing 形态的信号函数如下:

def signal(data, open_column, close_column, buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish pattern`
           if data[i, close_column] > data[i, open_column] and \               data[i, open_column] < data[i - 1, close_column] and \               data[i, close_column] > data[i - 1, open_column] and \               data[i - 1, close_column] < data[i - 1, open_column] and \               data[i - 2, close_column] < data[i - 2, open_column]:

                    data[i + 1, buy_column] = 1 

           `# Bearish pattern`
           elif data[i, close_column] < data[i, open_column] and \                 data[i, open_column] > data[i - 1, close_column] and \                 data[i, close_column] < data[i - 1, open_column] and \                 data[i - 1, close_column] > data[i - 1, open_column] and \                 data[i - 2, close_column] > data[i - 2, open_column]:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 6-41 显示了 EURUSD 的信号图表。

图 6-41. EURUSD 信号图表

表 6-8 总结了这种形态的表现。

表 6-8. Engulfing 形态:绩效汇总表

资产 命中率 盈利因子 风险-收益比 信号数
欧元/美元 46.73% 0.94 1.07 1881
美元/瑞士法郎 47.46% 0.95 1.05 1890
英镑/美元 49.87% 1.06 1.06 1989
美元/加拿大元 48.96% 1.00 1.04 1793
BTCUSD 47.88% 0.92 1.00 1251
ETHUSD 47.71% 1.03 1.13 876
黄金 47.08% 0.97 1.09 2130
标普 500 指数 50.25% 0.97 0.96 193
富时 100 指数 42.49% 0.64 0.87 313

图 6-42 显示了 BTCUSD 的信号图表。

图 6-42. BTCUSD 信号图表

总结一下,Engulfing 形态在可预测性上类似于穿透形态。这两种形态可能受益于交易条件的变化,如进出场点。

弃婴形态

这并不是一个真正可交易的形态,因为它极为罕见。我只是为了教育目的而介绍它,因为你不应指望在实践中经常看到它。弃婴形态 是一个由三根蜡烛线组成的形态,其中间的蜡烛线是十字星。看涨的弃婴形态由一个看跌的蜡烛线后跟一个向下跳空的十字星蜡烛线组成,其高点不接触第一个蜡烛线的低点。最后,有第三个看涨的蜡烛线,其低点也不接触中间蜡烛线的高点。图 6-43 展示了一个看涨的弃婴形态。

图 6-43. 一个看涨的弃婴形态

看跌的弃婴形态由一个看涨的蜡烛线后跟一个向上跳空的十字星蜡烛线组成,其低点不接触第一个蜡烛线的高点。最后,有第三个看跌的蜡烛线,其高点也不接触中间蜡烛线的低点。图 6-44 展示了一个看跌的弃婴形态。

图 6-44. 一个看跌的弃婴形态
注意

弃婴形态的名称源于中间的蜡烛线完全孤立,其上下影线不接触其他两个蜡烛线的影线。

这种形态在流动性较低的股票和其他资产中可能更常见。一般来说,流动性强和主要市场很少见到这种复杂的配置。

看涨的遗弃婴儿的直觉是,市场形成了一个 U 形转折,需求现在比之前更加健康,因为平衡已经转移。同样的直觉适用于看跌的遗弃婴儿。

遗弃婴儿模式的信号函数如下:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

            `# Bullish pattern`
            if data[i, close_column] > data[i, open_column] and \                data[i - 1, close_column] == data[i - 1, open_column] and \                data[i - 1, high_column] < data[i, low_column] and \                data[i - 1, high_column] < data[i - 2, low_column] and \                data[i - 2, close_column] < data[i - 2, open_column]:

                     data[i + 1, buy_column] = 1 

          `# Bearish pattern`
            elif data[i, close_column] < data[i, open_column] and \                  data[i - 1, close_column] == data[i - 1, open_column] and \                  data[i - 1, low_column] > data[i, high_column] and \                  data[i - 1, low_column] > data[i - 2, high_column] and \                  data[i - 2, close_column] > data[i - 2, open_column]:

                     data[i + 1, sell_column] = -1                      

       except IndexError:

            pass

    return data

我不会展示此模式的性能,因为没有足够的数据来得出任何结论。

总结来说,遗弃婴儿主要是一个在理论上看起来很好的模式,但实际上它非常罕见,因此你无法判断它的表现。此外,检测到的少数模式并没有显示出很强的预测潜力,这使得遗弃婴儿成为一个美丽的神话构型,但实际表现不及其名声。

陀螺模式

陀螺模式是一个由三根蜡烛组成的逆势结构,类似于十字星模式,但通常更常见,间接暗示波动率上升。看涨的陀螺模式由一个看跌蜡烛后跟一个具有长影线(高点和低点)的小实体蜡烛组成。最后,出现一个看涨蜡烛来确认预期的上涨动作。图 6-45 展示了一个看涨的陀螺模式。

图 6-45. 看涨的陀螺模式

看跌的陀螺模式由一个看涨蜡烛后跟一个具有长影线(高点和低点)的小实体蜡烛组成。最后,出现一个看跌蜡烛来确认预期的下跌动作。图 6-46 展示了一个看跌的陀螺模式。

图 6-46. 看跌的陀螺模式
注意

陀螺模式的名称显然与其类似陀螺的外形有关。

陀螺模式背后的直觉与十字星模式相同,尽管它的力量较小,因为收盘价并不完全等于开盘价。然而,长影线所显示的波动性表明买家和卖家之间的斗争,并可能预示着模式之后会出现明确的方向。

陀螺模式的信号函数如下:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

            `# Bullish pattern`
            if data[i, close_column] - data[i, open_column] > body and \                data[i - 1, high_column] - data[i - 1, close_column] >= wick \                and data[i - 1, open_column] - data[i - 1, low_column] >= \                wick and data[i - 1, close_column] - data[i - 1, \                open_column] < body and data[i - 1, close_column] > data[i \                - 1, open_column] and data[i - 2, close_column] < data[i - \                2, open_column] and data[i - 2, open_column] - data[i - 2, \                close_column] > body:

                     data[i + 1, buy_column] = 1 

            `# Bearish pattern`
            elif data[i, open_column] - data[i, close_column] > body and \                  data[i - 1, high_column] - data[i - 1, open_column] >= \                  wick and data[i - 1, close_column] - data[i - 1, \                  low_column] >= wick and data[i - 1, open_column] - \                  data[i - 1, close_column] < body and data[i - 1, \                  close_column] < data[i - 1, open_column] and data[i - 2, \                  close_column] > data[i - 2, open_column] and data[i - 2, \                  close_column] - data[i - 2, open_column] > body:

                     data[i + 1, sell_column] = -1                      

       except IndexError:

            pass

    return data

图 6-47 展示了富时 100 的信号图表。

图 6-47. 富时 100 的信号图表

表 6-9 总结了该模式的性能。

表格 6-9. 陀螺模式:性能摘要表

资产 命中率 盈利因子 风险-回报比 信号数
欧元/美元 51.02% 0.87 0.83 243
美元/瑞士法郎 49.69% 0.79 0.80 163
英镑/美元 48.79% 1.14 1.19 414
美元/加元 45.22% 0.79 0.96 272
比特币/美元 48.62% 0.77 0.81 401
ETHUSD 38.37% 0.66 1.06 185
黄金 41.22% 0.62 0.88 228
S&P500 50.00% 1.18 1.18 36
富时 100 42.34% 0.84 1.14 111

内部上/下模式

内部上涨/下跌 模式是一个由三根蜡烛组成的反向配置,通过两根确认蜡烛来信号初次移动的结束。内部上涨模式由一个熊市蜡烛后跟一个较小的阳线组成,其实体在第一个蜡烛的实体内。最后,必须出现一个阳线并超过第一个蜡烛的开盘价。图 6-48 展示了一个内部上涨模式。

图 6-48. 一个内部上涨

熊市内部下跌模式由一个牛市蜡烛后跟一个较小的阴线组成,其实体在第一个蜡烛的实体内。最后,必须出现一个阴线并打破第一个蜡烛的开盘价。图 6-49 展示了一个熊市内部下跌模式。

图 6-49. 熊市内部下跌
注意

蜡烛的实体是开盘和收盘价格之间的绝对差异,而蜡烛的范围是高点和低点价格之间的绝对差异。

内部上涨模式的直觉是在主导的熊市趋势之后,买家开始控制局势。第二根蜡烛显示了第一个力量平衡,第三根蜡烛通过超越第二根蜡烛的收盘价来确认这一新动向。第二根蜡烛的实体包含在第一根蜡烛的实体内,表明卖方无法将价格进一步推低,这表明他们开始感到困难。内部下跌模式的直觉是在主导的牛市趋势之后,卖家开始控制局势。第二根蜡烛的实体包含在第一根蜡烛的实体内,表明买家无法将价格进一步推高。

注意

注意,内部上涨/下跌模式类似于一个孕线形态,后跟一个确认新方向的大蜡烛。

内部上涨/下跌模式的信号功能如下:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish pattern`
           if data[i - 2, close_column] < data[i - 2, open_column] and \               abs(data[i - 2, open_column] - data[i - 2, close_column]) > \               body and data[i - 1, close_column] < data[i - 2, \               open_column] and data[i - 1, open_column] > data[i - 2, \               close_column] and data[i - 1, close_column] > data[i - 1, \               open_column] and data[i, close_column] > data[i - 2, \               open_column] and data[i, close_column] > data[i, \               open_column] and abs(data[i, open_column] - data[i, \               close_column]) > body:

                    data[i + 1, buy_column] = 1 

           `# Bearish pattern`
           elif data[i - 2, close_column] > data[i - 2, open_column] and \                 abs(data[i - 2, close_column] - data[i - 2, open_column]) \                 > body and data[i - 1, close_column] > data[i - 2, \                 open_column] and data[i - 1, open_column] < data[i - 2, \                 close_column] and data[i - 1, close_column] < data[i - 1, \                 open_column] and data[i, close_column] < data[i - 2, \                 open_column] and data[i, close_column] < data[i, \                 open_column] and abs(data[i, open_column] - data[i, \                 close_column]) > body:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 6-50 展示了美元/加元的信号图表。

图 6-50. 美元/加元信号图表

表 6-10 总结了该模式的表现。

表 6-10. 内部上涨/下跌模式:性能总结表

资产 命中率 盈利因子 风险-收益比 信号
欧元/美元 49.82% 0.94 0.95 572
美元/瑞士法郎 48.89% 0.98 1.02 452
英镑/美元 48.86% 1.15 1.20 659
美元/加元 50.93% 1.26 1.22 591
比特币/美元 51.40% 1.30 1.23 214
以太坊/美元 42.22% 0.73 1.00 90
黄金 46.73% 0.73 0.83 199
标普 500 50.00% 0.62 0.62 64
富时 100 54.13% 1.04 0.88 133

图 6-51 展示了以太坊/美元的信号图表。

图 6-51. 以太坊/美元信号图表

塔形态

Tower 模式是一个多蜡烛(通常为五根)的反向配置,预示着逐渐趋势的结束。看涨的 Tower Bottom 模式以一个看跌蜡烛图开始,接着是三根小实体蜡烛,其中中间的一根略低于另外两根。最后,一个正常大小的看涨蜡烛图出现来确认向上走势。图 6-52 展示了 Tower Bottom 模式。

图 6-52. 一个 Tower Bottom

熊市 Tower Top 模式始于一个看涨蜡烛图,接着是三根小实体蜡烛,其中中间的一根略高于另外两根。最后,一个正常大小的看跌蜡烛图出现来确认向下走势。图 6-53 展示了 Tower Top 模式。

图 6-53. 一个 Tower Top

Tower 模式是一种稳定配置,暗示初始趋势可能结束。

Tower Bottom 模式的直觉是在一个看跌行情后,小实体蜡烛暗示可能的稳定,最后的看涨蜡烛预示着预期的看涨反转。类似地,Tower Top 模式暗示可能在看跌蜡烛验证向下行情之前的整理。

多蜡烛模式有时由于其模糊的条件而难以编码。Tower 模式有许多版本,但我发现限制在最多五根蜡烛的条件比创建涉及更多蜡烛的条件更好。

Tower 模式的信号功能如下:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish pattern`
           if data[i, close_column] > data[i, open_column] and \               data[i, close_column] - data[i, open_column] > body and \               data[i - 2, low_column] < data[i - 1, low_column] and \               data[i - 2, low_column] < data[i - 3, low_column] and \               data[i - 4, close_column] < data[i - 4, open_column] and \               data[i - 4, open_column] - data[i, close_column] > body:

                    data[i + 1, buy_column] = 1 

           `# Bearish pattern`
           elif data[i, close_column] < data[i, open_column] and \                 data[i, open_column] - data[i, close_column] > body and \                 data[i - 2, high_column] > data[i - 1, high_column] and \                 data[i - 2, high_column] > data[i - 3, high_column] and \                 data[i - 4, close_column] > data[i - 4, open_column] and \                 data[i - 4, close_column] - data[i, open_column] > body:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 6-54 展示了美元加元的信号图表。

图 6-54. 美元加元信号图表

图 6-55 展示了英镑美元的信号图表。

图 6-55. 英镑美元信号图表

表 6-11 总结了该模式的绩效。

表 6-11. Tower 模式:绩效摘要表

资产 命中率 盈利因子 风险-收益比 信号
EURUSD 49.31% 1.01 1.04 878
USDCHF 50.47% 1.2 1.18 735
GBPUSD 46.30% 0.95 1.10 1203
USDCAD 50.44% 1.09 1.07 1013
BTCUSD 43.33% 1.06 1.38 503
ETHUSD 45.45% 0.88 1.05 231
GOLD 47.32% 0.73 0.81 336
S&P500 43.75% 0.85 1.09 16
FTSE100 50.00% 1.27 1.27 60

第七章:现代逆势模式

继续秉承逆势交易的精神,本章讨论了现代逆势模式,这些模式是我多年来注意到的蜡烛图形成,可以作为已知模式的补充。

本章的目的与往常一样,是描述模式的客观条件并对其进行回测,以便您对它们的频率和可预测性形成意见。

分身模式

在德语中,Doppelgänger一词意为“双重行走者”或“双重步行者”,通常用于指看起来完全相同但生物上无关的人。 Doppelgänger 蜡烛图形态是一个我喜欢用来确认中间逆转的三根蜡烛逆转配置。

图 7-1 说明了一个看涨的分身。该模式由一个看跌蜡烛后跟两根数值相似的蜡烛(相同的高低点,且它们的收盘价和开盘价必须相等,或者收盘价必须等于开盘价)组成,其类型(看涨或看跌)具有灵活性。

图 7-1。一个看涨的分身

相比之下,图 7-2 展示了理论上的看跌分身模式。该模式由一个看涨蜡烛后跟两根数值相似的蜡烛组成,其类型(看涨或看跌)具有灵活性。请注意,这些是理论条件;在现实生活中,可能会添加一些灵活性(正如您将在本章中看到的)。

图 7-2。一个看跌的分身

理想情况下,看涨逆转在下一根蜡烛超过相似高点时得到确认。同样,当下一根蜡烛突破相似低点时,看跌逆转得到确认。这是一个可选条件,可将该模式转变为四根蜡烛的配置。

分身模式的理论基础在于力量平衡的概念。具有相似蜡烛的情况下,当前总体方向周围存在犹豫,这可能导致完全的制度转变。此外,在看涨分身中低点的相等和看跌分身中高点的相等等价于支撑和阻力水平的概念,分别。

为增加信号的频率,您必须像在先前章节中看到的那样四舍五入值。对于外汇数据,您需要四位小数,对于其他回测资产,您需要零位小数。

从算法的角度看,实际条件如下:

  • 如果当前高点等于先前高点,当前低点等于先前低点,并且两期前的蜡烛是看涨的,则在下一行打印 1,表示开盘价的买入信号的代表。

  • 如果当前高点等于先前高点,当前低点等于先前低点,并且两期前的蜡烛是看跌的,则在下一行打印−1,表示开盘价的卖出信号的代表。

注意

尝试编写添加第四根蜡烛图的可选条件。提醒一下,这个条件旨在过滤虚假信号,但可能会过滤掉太多信号。

你可以通过以下代码片段为幻影模式编写信号函数:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)  

    data = rounding(data, 4) `# Put 0 instead of 4 as of pair 4`

    for i in range(len(data)):  

       try:

    `# Bullish pattern`
           if data[i - 2, close_column] < data[i - 2, open_column] and \               data[i - 1, close_column] < data[i - 2, open_column] and \               data[i, high_column] == data[i - 1, high_column] and \               data[i, low_column] == data[i - 1, low_column]: 

                    data[i + 1, buy_column] = 1 

           `# Bearish pattern`
           elif data[i - 2, close_column] > data[i - 2, open_column] and \                 data[i - 1, close_column] > data[i - 2, open_column] and \                 data[i, high_column] == data[i - 1, high_column] and \                 data[i, low_column] == data[i - 1, low_column]:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 7-3 展示了 GBPUSD 的信号图。

图 7-3. GBPUSD 的信号图

幻影模式并不常见。图 7-4 展示了另一个 USDCHF 的信号图。

图 7-4. USDCHF 的信号图

表 7-1 总结了幻影模式的表现。

表 7-1. 幻影模式:表现总结表

资产 命中率 盈利因子 风险收益比 信号数
EURUSD 46.42% 0.97 1.12 448
USDCHF 50.00% 0.89 0.89 558
GBPUSD 48.05% 1.07 1.16 283
USDCAD 45.52% 0.76 0.91 380
BTCUSD 45.45% 1.78 2.13 99
ETHUSD 50.87% 0.92 0.88 1201
GOLD 49.74% 0.85 0.85 2738
S&P500 50.90% 0.98 0.95 110
FTSE100 48.27% 1.27 1.36 29

总结一下,这种模式显示出跨资产类别的混合信号和混合频率。这可能是因为出场技术不适合这种模式,因为它主要关注中期逆转动作,但为了使书中所有模式的回测保持一致,出场条件是相同的。

提醒一下,出场条件是遇到看涨或看跌信号;否则,交易将继续进行。​

封锁模式

这种模式类似于市场发现支撑或阻力并显示出逆转迹象的概念。封锁 模式是一个由四根蜡烛图组成的配置,其中一些条件在视觉上难以检测。

图 7-5 描述了一个看涨的封锁。第一根蜡烛图必须是看跌的,并跟随着三根蜡烛图,其低价等于或高于第一根蜡烛图的低价,但低于其收盘价。最后,第四根蜡烛图必须是看涨的,并且其收盘价高于第一根蜡烛图的高价。这些条件验证了封锁模式并生成了一个看涨信号。

图 7-5. 一个看涨的封锁

图 7-6 描述了一个熊市封锁。第一根蜡烛图必须是看涨的,并跟随着三根蜡烛图,其高价等于或低于第一根蜡烛图的低价,但低于其收盘价。最后,第四根蜡烛图必须是看跌的,并且其收盘价低于第一根蜡烛图的低价。这些条件验证了封锁模式并生成了一个看跌信号。

图 7-6. 一个熊市封锁

块位模式的理论基础在于,围绕支撑或阻力区域的稳定阶段可能提供了通过第四根蜡烛确认的反转机会。

下面的代码片段展示了如何编写块位模式的信号函数:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

        `# Bullish pattern`
           if data[i - 3, close_column] < data[i - 3, open_column] and \               data[i - 2, close_column] < data[i - 3, open_column] and \               data[i - 2, low_column] >= data[i - 3, low_column] and \               data[i - 2, low_column] <= data[i - 3, close_column] and \               data[i - 1, low_column] >= data[i - 3, low_column] and \               data[i - 1, low_column] <= data[i - 3, close_column] and \               data[i, low_column] >= data[i - 3, low_column] and \               data[i, low_column] <= data[i - 3, close_column] and \               data[i, close_column] > data[i, open_column] and \               data[i, close_column] > data[i - 3, high_column]:        

                    data[i + 1, buy_column] = 1 

           `# Bearish pattern`
           elif data[i - 3, close_column] > data[i - 3, open_column] and \                 data[i - 2, close_column] > data[i - 3, open_column] and \                 data[i - 2, high_column] <= data[i - 3, high_column] and \                 data[i - 2, high_column] >= data[i - 3, close_column] and\                 data[i - 1, high_column] <= data[i - 3, high_column] and \                 data[i - 1, high_column] >= data[i - 3, close_column] and\                 data[i, high_column] <= data[i - 3, high_column] and \                 data[i, high_column] >= data[i - 3, close_column] and \                 data[i, close_column] < data[i, open_column] and \                 data[i, close_column] < data[i - 3, low_column]:  

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 7-7 展示了英镑/美元的信号图表。首先要注意的是由于算法强加的多重条件,信号的稀缺性。

图 7-7. 英镑/美元的信号图表

罕见的模式无处不在,无论是经典还是现代的,它们在结果上与普通模式并没有太大区别。重要的是用其他信号和指标确认模式。

图 7-8 展示了澳元/新西兰元的信号图表。注意,通常情况下,图案与其完美理论形式并不相同,因为那样会使它们极为罕见甚至不可能找到;因此,有时可以应用一定的灵活性。

图 7-8. 澳元/新西兰元的信号图表

例如,我在这里应用的灵活性措施是,对于牛市块位模式,我已经取消了要求低点完全相同的条件,而对于熊市块位模式,则取消了要求高点完全相同的条件。记住,目的是检测一些模式并对其进行回测,以便对其预测能力有所了解,这将融入更复杂的策略中。

表 7-2 总结了块位模式的性能。

表 7-2. 块位模式:性能总结表

资产 命中率 盈利因子 风险-回报比 信号数
EURUSD 40.77% 0.63 0.92 233
USDCHF 47.00% 1.1 1.24 234
GBPUSD 50.19% 1.06 1.06 263
USDCAD 46.15% 0.92 1.07 260
BTCUSD 51.64% 1.79 1.68 182
ETHUSD 45.40% 1.64 1.96 174
GOLD 51.25% 1.13 1.08 240
S&P500 46.66% 0.86 0.98 240
FTSE100 35.71% 1.1 1.98 28

总结来说,块位模式是一种在某些市场中可能稀有的复杂形态。它基于市场已找到支撑或阻力区域,并通过牛市或熊市蜡烛图表显示了反转意图的概念。

狂喜模式

乍一看,“狂喜”模式基本上与讨论的经典趋势跟随模式中的三根蜡烛模式相同。然而,我发现将一个条件添加到三根蜡烛模式中足以使其成为反向配置。当然,视觉上的冲突仍然相同,因为额外条件比交易员更容易通过算法检测到。

额外条件是每个蜡烛必须比前一个更大。这里的“更大”指的是实际范围,即书中早前提到的收盘价和开盘价的绝对差。

图 7-9 描绘了一个看涨的狂喜模式。该模式由三个连续的看跌蜡烛线组成,每个蜡烛线比前一个更大。

图 7-9. 一个看涨的狂喜模式

图 7-10 描绘了一个看跌的狂喜模式。该模式由三个连续的看涨蜡烛线组成,每个蜡烛线比前一个更大。

图 7-10. 一个看跌的狂喜模式
注意

三蜡烛模式和狂喜模式非常相似,但蜡烛线尺寸的增加是它们之间的区别。在原始文献中,三蜡烛模式没有尺寸限制,这可能会导致这两种模式之间的冲突。

直觉上,你必须跟随让你更舒适的模式,并且你还必须用其他技术和指标来确认,以帮助你决定市场是否会继续朝着相同的方向趋势(三蜡烛模式),还是会反转(狂喜模式)。

下面的代码片段展示了如何为狂喜模式编写信号函数。你还需要对数值进行四舍五入:

def signal(data, open_column, close_column, buy_column, sell_column):

    data = add_column(data, 5)  

    data = rounding(data, 4) # Put 0 instead of 4 as of pair 4

    for i in range(len(data)):  

       try:

  `# Bullish pattern`
           if data[i, open_column] > data[i, close_column] and \               data[i - 1, open_column] > data[i - 1, close_column] and \               data[i - 2, open_column] > data[i - 2, close_column] and \               data[i, close_column] < data[i - 1, close_column] and \               data[i - 1, close_column] < data[i - 2, close_column] and \               (data[i, open_column] - data[i, close_column]) > \               (data[i - 1, open_column] - data[i - 1, close_column]) and\               (data[i - 1, open_column] - data[i - 1, close_column]) > \               (data[i - 2, open_column] - data[i - 2, close_column]): 

                    data[i + 1, buy_column] = 1 

           `# Bearish pattern`
           elif data[i, open_column] < data[i, close_column] and \                 data[i - 1, open_column] < data[i - 1, close_column] and \                 data[i - 2, open_column] < data[i - 2, close_column] and \                 data[i, close_column] > data[i - 1, close_column] and \                 data[i - 1, close_column] > data[i - 2, close_column] and\                 (data[i, open_column] - data[i, close_column]) > \                 (data[i - 1, open_column] - data[i - 1, close_column]) and\                 (data[i - 1, open_column] - data[i - 1, close_column]) > \                 (data[i - 2, open_column] - data[i - 2, close_column]):

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 7-11 展示了美元加元的信号图表。从视觉上看,狂喜模式比封锁模式更丰富,可能会提供更多信号,但这并不能说明质量如何,这一点我通常在本节末尾的绩效总结表格中会详细展示。

图 7-11. 美元加元的信号图表

狂喜模式的风险在于它试图计时贪婪阶段的结束,这非常危险。然而,基于短期事件的短期走势,狂喜模式表现优于其平均表现。例如,在确立的牛市趋势期间,狂喜模式的命中率小于横盘市场期间的命中率。

图 7-12 展示了澳元纽元的信号图表。请注意,在拥挤期间,该模式较为常见且质量相对较好。

图 7-12. 澳元纽元的信号图表
注意

请确保区分狂喜模式和双重麻烦模式,后者使用了包括高点和低点的波动率测量来考虑持续移动。一些蜡烛图模式可能相互类似,但存在一些微妙的差异,这些差异可能会改变预期的反应甚至预期的目标。

表格 7-3 总结了狂喜模式的绩效。请注意,通常的退出条件并非狂喜模式的最佳退出技术。

表格 7-3. 狂喜模式:绩效总结表格

资产 命中率 盈利因子 风险-收益比 信号数
欧元美元 49.17% 1.17 1.21 1513
美元瑞士法郎 45.17% 0.99 1.21 1523
英镑美元 46.69% 1.08 1.24 1741
美元加元 46.96% 1.00 1.12 1584
BTCUSD 47.24% 1.12 1.24 1327
ETHUSD 45.71% 0.98 1.16 1155
GOLD 44.48% 0.94 1.17 2039
S&P500 46.17% 1.16 1.35 379
FTSE100 46.34% 1.05 1.21 369

总结来说,欢乐模式就像是市场参与者最初加速阶段的刹车,基于市场参与者的乐观情绪。基本上,更大的蜡烛意味着更大的风险,因为恐惧比贪婪更强大,交易者可能会在强劲的行情后开始减仓。

区分欢乐模式和第四章中讨论的三根蜡烛模式非常重要。

障碍模式

障碍模式非常基础且直观,可以被视为封锁模式的简化版本。它由三根蜡烛组成,同时借鉴了支撑和阻力水平的概念。该模式还利用了取整以稳定信号频率。

图 7-13 展示了一个看涨的障碍模式。前两根蜡烛必须是看跌的,而最后一根蜡烛必须是看涨的。同时,这三根蜡烛的最低点必须相同,这暗示着支撑区域。最后一根看涨蜡烛确认了看涨反转。

注意

一个看涨的蜡烛意味着需求大于供应,因此在熊市后可以作为确认因素。

图 7-13. 一个看涨的障碍

图 7-14 展示了一个看跌的障碍模式。前两根蜡烛必须是看涨的,而最后一根蜡烛必须是看跌的。同时,这三根蜡烛的最高点必须相同,这暗示着阻力区域。最后一根看跌蜡烛确认了看跌反转。

图 7-14. 一个看跌的障碍
注意

在可选情况下,还可以施加额外条件。在看涨的障碍模式中,最后一根看涨蜡烛的收盘价必须高于中间蜡烛的最高价。同样地,在看跌的障碍模式中,最后一根看跌蜡烛的收盘价必须低于中间蜡烛的最低价。

下面的代码片段展示了如何为障碍模式编写信号函数。请注意,我添加了rounding()函数来最大化信号的获取。例如,如果欧元/美元的报价是五位小数(例如 1.05623),那么找到三根具有相同最低/最高值的蜡烛比四位小数的报价(例如 1.0562)更难:

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)  

    data = rounding(data, 4) `# Put 0 instead of 4 as of pair 4`

    for i in range(len(data)):  

       try:

           `# Bullish pattern`
           if data[i, close_column] > data[i, open_column] and \               data[i - 1, close_column] < data[i - 1, open_column] and \               data[i - 2, close_column] < data[i - 2, open_column] and \               data[i, low_column] == data[i - 1, low_column] and \               data[i, low_column] == data[i - 2, low_column]:

                    data[i + 1, buy_column] = 1 

    `# Bearish pattern`
           elif data[i, close_column] < data[i, open_column] and \                 data[i - 1, close_column] > data[i - 1, open_column] and \                 data[i - 2, close_column] > data[i - 2, open_column] and \                 data[i, high_column] == data[i - 1, high_column] and \                 data[i, high_column] == data[i - 2, high_column]:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 7-15 展示了美元/瑞士法郎的信号图表。信号的频率似乎是可以接受的。这可以从性能汇总表中看出。

图 7-15. 美元/瑞士法郎的信号图表

图 7-16 展示了 AUDNZD 的信号图表。在某些市场中,信号可能比其他市场更少见。这是大多数蜡烛图模式所见的现象,了解信号频率使你能够知道在哪个市场使用哪些模式。

图 7-16. AUDNZD 的信号图表

表 7-4 总结了障碍模式的表现。

表 7-4. 障碍模式:表现摘要表

资产 命中率 盈利因子 风险-收益比 信号数
EURUSD 46.78% 1.05 1.19 109
USDCHF 54.67% 2.26 1.87 139
GBPUSD 43.24% 0.85 1.11 74
USDCAD 52.74% 1.13 1.01 91
BTCUSD 34.61% 0.59 1.12 26
ETHUSD 50.92% 1.11 1.07 163
GOLD 48.39% 1.06 1.13 405
S&P500 53.57% 0.9 0.78 28
FTSE100 37.50% 0.38 0.63 8

总结一下,障碍模式是一个简单的三蜡烛配置,通过舍入增加其信号频率,由于一种严峻条件,迫使低点或高点相等。

镜像模式

如其名,镜像 模式是过去价格行动的反映,具有灵活的条件。其理念是市场正在形成一个 U 形转弯,并且应该改变方向。

图 7-17 描绘了一个牛市镜像。第一个蜡烛必须是熊市的,后面跟着两个具有相同高低的蜡烛。最后,最后一个蜡烛必须是牛市的,并且其高价等于第一个蜡烛的高价。在编码部分,你会看到有一些灵活性,因为理论条件难以找到。

图 7-17. 一个牛市镜像
注意

之所以蜡烛图模式的理论与实际应用之间存在差异,是因为理论处理直觉,但不能保证检测到模式所需的最低频率。在现实生活中,你必须调整一些条件,同时保留模式的直觉。

图 7-18 描述了一个熊市镜像。第一个蜡烛必须是牛市的,后面跟着两个具有相同高低的蜡烛。最后,最后一个蜡烛必须是熊市的,并且其低价等于第一个蜡烛的低价。

图 7-18. 一个熊市镜像

下面的代码片段展示了如何为镜像模式编写信号函数的代码。代码假设对中间蜡烛的高低灵活,并创建了这样一个条件:相等的收盘价格足以验证该模式(如果两个中间蜡烛的收盘价格相等,则不会使该模式失效)。

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)  

    data = rounding(data, 0) # Put 0 instead of 4 as of pair 4

    for i in range(len(data)):  

       try:

           `# Bullish pattern`
           if data[i, close_column] > data[i, open_column] and \               data[i, high_column] == data[i - 3, high_column] and \               data[i, close_column] > data[i - 1, close_column] and \               data[i, close_column] > data[i - 2, close_column] and \               data[i, close_column] > data[i - 3, close_column] and \               data[i - 3, close_column] < data[i - 3, open_column] and \               data[i - 1, close_column] == data[i - 2, close_column]:

                    data[i + 1, buy_column] = 1 

      `# Bearish pattern`
           elif data[i, close_column] < data[i, open_column] and \                 data[i, low_column] == data[i - 3, low_column] and \                 data[i, close_column] < data[i - 1, close_column] and \                 data[i, close_column] < data[i - 2, close_column] and \                 data[i, close_column] < data[i - 3, close_column] and \                 data[i - 3, close_column] > data[i - 3, open_column] and \                 data[i - 1, close_column] == data[i - 2, close_column]:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 7-19 展示了 EURCHF 的信号图表。

图 7-19. EURCHF 的信号图表

图 7-20 展示了 USDCHF 的信号图。即使在灵活的条件下,找到镜像模式可能也会很困难。

图 7-20. USDCHF 的信号图

表 7-5 总结了镜像模式的表现。

表 7-5. 镜像模式:绩效汇总表

Asset 命中率 盈利因子 风险-收益比 信号数
EURUSD 45.23% 1.02 1.23 42
USDCHF 41.37% 0.69 0.98 58
GBPUSD 37.50% 0.78 1.3 32
USDCAD 34.21% 0.78 1.5 38
BTCUSD 70.00% 3.02 1.29 10
ETHUSD 44.30% 0.83 1.04 237
GOLD 49.00% 1.14 1.18 500
S&P500 80.00% 5.38 1.34 15

总结一下,镜像模式假设市场参与者逐渐改变方向,形成一个 U 形转折运动。这是一种罕见的模式,因为实现它的条件可能比较繁琐,但模式的直觉非常清晰。镜像模式也可以被视为“双胞胎”模式的延续。

收缩模式

收缩模式基于拥挤期后的突破概念。它是一个多蜡烛配置,最后一根蜡烛确认了这一动作。

图 7-21 展示了一个看涨的收缩模式。第一根蜡烛必须是看跌的,以反映看跌压力的代理,接下来的三根蜡烛可以是任何颜色,但每次必须缩小。最后(第五根)蜡烛必须是看涨的,并且必须超过第二根蜡烛的高点。

图 7-21. 一个看涨的收缩模式

图 7-22 展示了一个熊市的收缩模式。第一根蜡烛必须是看涨的,以反映看涨压力的代理,接下来的三根蜡烛可以是任何颜色,但每次必须缩小。最后(第五根)蜡烛必须是看跌的,并且必须突破第二根蜡烛的低点。

图 7-22. 一个熊市的收缩模式

下面的代码片段展示了如何编写收缩模式的信号函数。我添加了一些灵活性,省略了理论条件,假设三个中间蜡烛具有类似的低点(看涨配置)和类似的高点(看跌配置),如图 7-21 和 7-22 中的虚线水平线所示。

def signal(data, open_column, high_column, low_column, close_column, 
           buy_column, sell_column):

    data = add_column(data, 5)  

    data = rounding(data, 4)

    for i in range(len(data)):  

       try:

           `# Bullish pattern`
           if data[i - 4, close_column] < data[i - 4, open_column] and \               data[i, close_column] > data[i, open_column] and \               data[i, close_column] > data[i - 3, high_column] and \               abs(data[i - 3, close_column] - data[i - 3, open_column]) < \               abs(data[i - 4, close_column] - data[i - 4, open_column]) \               and abs(data[i - 2, close_column] - data[i - 2, open_column])\               < abs(data[i - 3, close_column] - data[i - 3, open_column]) \               and abs(data[i - 1, close_column] - data[i - 1, \               open_column]) < abs(data[i - 2, close_column] - data[i - 2, \               open_column]) and data[i - 1, high_column] < data[i - 2, \               high_column] and data[i - 2, high_column] < data[i - 3, \               high_column]:

                    data[i + 1, buy_column] = 1 

        `# Bearish pattern`
           elif data[i - 4, close_column] > data[i - 4, open_column] and \                 data[i, close_column] < data[i, open_column] and \                 data[i, close_column] < data[i - 3, low_column] and \                 abs(data[i - 3, close_column] - data[i - 3, open_column]) \                 < abs(data[i - 4, close_column] - data[i - 4, \                 open_column]) and abs(data[i - 2, close_column] - \                 data[i - 2, open_column]) < abs(data[i - 3, close_column] \                 - data[i - 3, open_column]) and abs(data[i - 1, \                 close_column] - data[i - 1, open_column]) < abs(data[i - \                 2, close_column] - data[i - 2, open_column]) and \                 data[i - 1, low_column] > data[i - 2, low_column] and \                 data[i - 2, low_column] > data[i - 3, low_column]:             

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 7-23 展示了 GBPAUD 的信号图。

图 7-23. GBPAUD 的信号图

表 7-6 总结了收缩模式的表现。

表 7-6. 收缩模式:绩效汇总表

Asset 命中率 盈利因子 风险-收益比 信号数
EURUSD 37.77% 0.52 0.86 45
USDCHF 37.14% 0.39 0.66 35
GBPUSD 41.37% 0.66 0.94 29
USDCAD 43.47% 1.44 1.87 46
比特币对美元 58.62% 1.24 0.88 29
以太坊对美元 55.55% 2.16 1.73 27
金价 61.53% 0.73 0.46 26

总结一下,收缩模式是直观的,并依赖于谨慎的概念,这通过在大蜡烛突破拥挤区之前的收缩蜡烛图形来体现,并确认了新的方向。

现在您已经学习完了不同蜡烛图形及其在 Python 中的编码方法。接下来的章节将讲解如何使用这些蜡烛图形,并将它们结合成更复杂的策略。

第八章:高级蜡烛图表系统

到目前为止,您已经对可能对您有用的许多不同类型的模式有了全面的了解,但蜡烛图表也可以是创造性的,不必止步于基本的构建方法。本章介绍了两种蜡烛图表系统,提供了对原始系统的多样替代。

虽然原始系统将 OHLC 数据呈现为实际数据,但本章涵盖的两个建议系统采用了不同的方法来理解数据,并尽可能多地从中获取信息。

第一个高级图表系统是平均趋势烛台,它通过转换 OHLC 数据来帮助趋势追随者获得一个不那么嘈杂的视角。第二个图表系统是 K 线图表,它们仅仅是 OHLC 数据的平滑版本,应用蜡烛图案以寻找更多信号,同时减少噪音。

本章的目的是将这两个强大的图表系统添加到您的交易框架中,以便您有一个不同的视角。理想情况下,当使用原始蜡烛图系统检查模式时,您还应该在这两种替代蜡烛图系统上检查相同的模式。

平均趋势烛台系统

平均趋势烛台系统也称为平均趋势烛台。术语heikin-ashi在日语中意为“平均条”,考虑到其计算方式,这是直观的。创建平均趋势烛台图表的主要目的是理解潜在趋势,并过滤由随机波动引起的噪音。

您可以将该系统视为一种消噪技术,为您留下平滑的蜡烛图表。平均趋势烛台获取开盘价、最高价、最低价和收盘价,并使用简单的公式进行转换,然后绘制结果。

注意

通过转换 OHLC 数据,平均趋势烛台图表不代表实际价值,而是平滑的价值。例如,熊市平均趋势烛台并不一定代表真正的熊市烛台,其收盘价也不一定等于真正的烛台收盘价。事实上,平均趋势烛台的收盘价很少是真实的收盘价。

要计算平均趋势烛台的开盘价,请使用以下公式:

Transformed open price i = Openprice i-1 +Closeprice i-1 2

要计算平均趋势烛台的高价,请使用以下公式:

转换 价格 i = m a x ( 价格 i , 转换 开盘 价格 i , 转换 收盘 价格 i )

要计算平均趋势烛台的低价,请使用以下公式:

转换后的 低价 价格 i = m i n ( 低价 价格 i , 转换后的 开盘价 价格 i , 转换后的 收盘价 价格 i )

要计算 Heikin-Ashi 收盘价,请使用以下公式:

Transformed close price i = Openprice i +Highprice i +Lowprice i +Closeprice i 4

Heikin-Ashi 图表的第一要点是,由于平滑效应,蜡烛图之间的颜色交替不像普通蜡烛图那样常见,这是一个可取的特性。图 8-1 展示了在 AUDNZD 上两种系统的差异。试着找出哪个是 Heikin-Ashi 图表。

图 8-1. 上方是 AUDNZD 的 Heikin-Ashi 图表;下方是 AUDNZD 的普通蜡烛图表

注意相对来说,解释 Heikin-Ashi 图表相对容易,因为绿色(多头)蜡烛图会聚集在一起,显示当前趋势为多头,红色(空头)蜡烛图会聚集在一起,显示当前趋势为空头。这是平滑效应的威力。

图 8-2 展示了在 GBPAUD 上两种系统的差异。

图 8-2. 上方是 GBPAUD 的 Heikin-Ashi 图表;下方是 GBPAUD 的普通蜡烛图表

Heikin-Ashi 图表有一些局限性:

  • OHLC 的 Heikin-Ashi 值不是真实价格,因为它们已经被转换过了。

  • 在平盘市场中,Heikin-Ashi 蜡烛图会在颜色上交替,这妨碍了它们发出信号的能力。

  • 颜色变化有时可能滞后,这可能意味着一部分行情已经发生在检测到之时。

创建 Heikin-Ashi 蜡烛图的方法是使用数组的四列 OHLC,应用转换,并将结果输出到数组的下一个四列。函数如下:

def heikin_ashi(data, open_column, high_column, low_column, close_column, 
                position):

    data = add_column(data, 4)

    `# Heikin-Ashi Open`
    try:
        for i in range(len(data)):
            data[i, position] = (data[i - 1, open_column] + 
                                data[i - 1, close_column]) / 2
    except:
        pass

    `# Heikin-Ashi High`
    for i in range(len(data)):    
        data[i, position + 1] = max(data[i, position], 
                                data[i, position + 3], 
                                data[i, high_column])

    `# Heikin-Ashi Low    `
    for i in range(len(data)):    
        data[i, position + 2] = min(data[i, position], 
                                data[i, position + 3], 
                                data[i, low_column])      

    `# Heikin-Ashi Close`
    for i in range(len(data)):
        data[i, position + 3] = (data[i, open_column] + 
                                data[i, high_column] + 
                                data[i, low_column] + 
                                data[i, close_column]) / 4

    return data

现在让我们看看如何在 Heikin-Ashi 图表上应用之前看到的一些蜡烛图,这应该产生多样化效果。

检测十字星模式

作为提醒,十字星模式是一种不确定性和反向配置,具有以下特征:

  • 如果当前的收盘价高于当前的开盘价,前一个收盘价等于开盘价,并且前一个收盘价低于前一个开盘价,则已经打印出了一个看涨的十字星。

  • 如果当前的收盘价低于当前的开盘价,前一个收盘价等于开盘价,并且前一个收盘价高于前一个开盘价,则已经打印出了一个看跌的十字星。

图 8-3 展示了一个信号图表,上面的信号在 Heikin-Ashi 图表(顶部)和正常蜡烛图表(底部)上叠加显示。

图 8-3. 顶部是 Heikin-Ashi 蜡烛图的信号(估计值);底部是真实蜡烛图上的相同信号。货币对是 USDCHF。
注意

图 8-3 的底部面板显示了真实信号相对于真实 OHLC 数据的位置。实际上,可以看到估计信号和真实信号的位置几乎没有差别。

图 8-4 展示了 USDCAD 的信号图表。不要忘记根据分析的资产对数值四舍五入。

图 8-4. 顶部是 Heikin-Ashi 蜡烛图的信号(估计值);底部是真实蜡烛图上的相同信号。资产是 USDCAD。

检查图案表现(见表 8-1)。重要的是使用真实的 OHLC 数据计算性能指标,而不是转换后的数值,以避免偏差系统。

表 8-1. Heikin-Ashi 图表与 Doji 图案:性能总结表

资产 命中率 盈利因子 风险-收益比 信号数
EURUSD 49,67% 1,07 1,08 2126
USDCHF 47,30% 1,07 1,19 2359
GBPUSD 48,73% 1,03 1,08 1660
USDCAD 48,18% 0,97 1,04 1982
BTCUSD 46,54% 0,84 0,97 434
ETHUSD 44,91% 0,81 0,99 1534
GOLD 44,93% 1,05 1,29 3394
S&P500 50,12% 0,85 0,84 401
FTSE100 52,10% 1,09 1,00 261

检测 Tasuki 图案

作为提醒,Tasuki 图案是一种趋势跟随配置,其特征条件包括:

  • 如果两期前的收盘价高于两期前的开盘价,一期前的开盘价高于两期前的收盘价,一期前的收盘价高于一期前的开盘价,并且当前的收盘价高于两期前的收盘价,则打印出了一个牛市 Tasuki 图案。

  • 如果两期前的收盘价低于两期前的开盘价,一期前的开盘价低于两期前的收盘价,一期前的收盘价低于一期前的开盘价,并且当前的收盘价低于两期前的收盘价,则打印出了一个熊市 Tasuki 图案。

图 8-5 展示了 GBPAUD 的信号图表。

图 8-5. 顶部是 Heikin-Ashi 蜡烛图的信号(估计值);底部是真实蜡烛图上的相同信号。货币对是 GBPAUD。

要创建双图信号图表,请使用以下代码:

def candlestick_double_plot(data, buy_column, sell_column, window = 250):

    fig, ax = plt.subplots(2, figsize = (10, 5))

    sample = data[-window:, ]

    for i in range(len(sample)):

        ax[0].vlines(x = i, ymin = sample[i, 6], ymax = sample[i, 5], 
                     color = 'black', linewidth = 1)  

        if sample[i, 7] > sample[i, 4]:

            ax[0].vlines(x = i, ymin = sample[i, 4], ymax = sample[i, 7], 
                         color = 'mediumseagreen', linewidth = 3)  

        if sample[i, 7] < sample[i, 4]:

            ax[0].vlines(x = i, ymin = sample[i, 7], ymax = sample[i, 4], 
                         color = 'maroon', linewidth = 3)  

        if sample[i, 7] == sample[i, 4]:

            ax[0].vlines(x = i, ymin = sample[i, 7], ymax = sample[i, 4] + 
                         0.00005, color = 'black', linewidth = 1.00)  

        if sample[i, buy_column] == 1:

            x = i
            y = sample[i, 0]

            ax[0].annotate(' ', xy = (x, y), 
                        arrowprops = dict(width = 9, headlength = 11, 
                                          headwidth = 11, facecolor = 
                                          'green', color = 'green'))

        elif sample[i, sell_column] == -1:

            x = i
            y = sample[i, 0]

            ax[0].annotate(' ', xy = (x, y), 
                        arrowprops = dict(width = 9, headlength = -11,
                                          headwidth = -11, facecolor = 
                                          'red', color = 'red'))  

    ax[0].grid()

    for i in range(len(sample)):

        ax[1].vlines(x = i, ymin = sample[i, 2], ymax = sample[i, 1],
                     color = 'black', linewidth = 1)  

        if sample[i, 3] > sample[i, 0]:

            ax[1].vlines(x = i, ymin = sample[i, 0], ymax = sample[i, 3],
                         color = 'mediumseagreen', linewidth = 3)  

        if sample[i, 3] < sample[i, 0]:

            ax[1].vlines(x = i, ymin = sample[i, 3], ymax = sample[i, 0],
                         color = 'maroon', linewidth = 3)  

        if sample[i, 3] == sample[i, 0]:

            ax[1].vlines(x = i, ymin = sample[i, 3], ymax = sample[i, 0] +
                         0.00005, color = 'black', linewidth = 1.00)  

        if sample[i, buy_column] == 1:

            x = i
            y = sample[i, 0]

            ax[1].annotate(' ', xy = (x, y), 
                        arrowprops = dict(width = 9, headlength = 11, 
                                          headwidth = 11, facecolor = 
                                          'green', color = 'green'))

        elif sample[i, sell_column] == -1:

            x = i
            y = sample[i, 0]

            ax[1].annotate(' ', xy = (x, y), 
                        arrowprops = dict(width = 9, headlength = -11, 
                                          headwidth = -11, facecolor = 
                                          'red', color = 'red'))  

    ax[1].grid()

图 8-6 展示了 EURCHF 的信号图表。

图 8-6. 顶部是平均烛台线估计的信号;底部是真实烛台线的相同信号。货币对为 EURCHF。

表 8-2 总结了一种算法在平均烛台线图上扫描和交易田边模式的性能指标。

表 8-2. 平均烛台线与田边模式:性能摘要表

资产 命中率 盈利因子 风险回报比 信号
EURUSD 51.04% 0.83 0.80 384
USDCHF 50.00% 0.91 0.91 468
GBPUSD 50.11% 0.98 0.97 441
USDCAD 50.90% 0.90 0.87 442
BTCUSD 50.00% 0.94 0.93 248
ETHUSD 52.14% 0.76 0.69 257
GOLD 47.04% 0.92 1.04 372
S&P500 55.76% 1.12 0.88 52
FTSE100 44.64% 1.20 1.49 56

检测亢奋模式

作为提醒,亢奋模式是一种反向配置,其特征包括以下条件:

  • 如果当前的空头烛台线实际尺寸大于前一个空头烛台线,并且前一个空头烛台线实际尺寸大于上一个空头烛台线,则打印出一个牛市的亢奋点。

  • 如果当前的多头烛台线实际尺寸大于前一个多头烛台线,并且前一个多头烛台线实际尺寸大于上一个多头烛台线,则打印出一个牛市的亢奋点。

图 8-7 展示了 AUDNZD 的信号图。

图 8-7. 顶部是平均烛台线估计的信号;底部是真实烛台线的相同信号。货币对为 AUDNZD。

使用 rounding() 函数与亢奋模式可以帮助筛选出一些信号,如果你希望减少频率。

图 8-8 展示了 EURGBP 的信号图。保持趋势始终在你这边总是有趣的。这是你会在处理策略的章节中看到的一种技巧。主要思想是,在牛市趋势期间,最好考虑到一个看涨反转模式,而不是在熊市趋势期间。这是因为隐形的趋势手会帮助推动价格朝向总体方向。

图 8-8. 顶部是平均烛台线估计的信号;底部是真实烛台线的相同信号。货币对为 EURGBP。

表 8-3 总结了一种算法在平均烛台线图上扫描和交易亢奋模式的性能指标。

表 8-3. 平均烛台线与亢奋模式:性能摘要表

资产 命中率 盈利因子 风险回报比 信号
EURUSD 47.74% 1.01 1.11 2572
USDCHF 45.64% 0.91 1.09 2583
GBPUSD 46.52% 1.00 1.15 2990
USDCAD 48.25% 1.08 1.16 2918
BTCUSD 48.61% 1.04 1.1 2055
ETHUSD 43.83% 0.8 1.02 933
黄金 49.17% 1.06 1.09 543
标准普尔 500 指数 46.28% 1.08 1.25 417
富时 100 指数 44.46% 0.94 1.17 497

检测“双重麻烦”模式

作为提醒,“双重麻烦”模式是一种趋势跟踪配置,具有以下条件:

  • 第二根看涨的蜡烛图必须至少是前一个蜡烛图的 10 周期 ATR 的两倍大小(从高到低)。

  • 第二根看跌的蜡烛图必须至少是前一个蜡烛图的 10 周期 ATR 的两倍大小(从高到低)。

图 8-9 展示了 USDCHF 上的信号图。

图 8-9. 顶部展示了平均柱状图(估计)上的信号;底部展示了相同信号在实际蜡烛图上的表现。货币对为 USDCHF。

图 8-10 展示了 USDJPY 上的信号图。

图 8-10. 顶部展示了平均柱状图(估计)上的信号;底部展示了相同信号在实际蜡烛图上的表现。资产为 USDJPY。

表格 8-4 总结了在平均柱状图上扫描和交易“双重麻烦”模式算法的表现指标。

表格 8-4. 带有“双重麻烦”模式的平均柱状图:绩效汇总表

资产 命中率 盈利因子 风险-收益比 信号数
欧元美元 57.62% 0.92 0.67 1135
美元瑞士法郎 56.49% 1.08 0.84 110
英镑美元 53.72% 0.89 0.77 1167
美元加元 56.14% 1.02 0.80 1058
比特币美元 62.84% 1.19 0.71 716
以太坊美元 61.00% 1.04 0.67 659
黄金 57.00% 0.96 0.73 1021
标准普尔 500 指数 57.40% 1.36 1.00 162
富时 100 指数 54.13% 0.95 0.80 133

K 的蜡烛图系统

K 的 蜡烛图旨在进一步平滑 OHLC 值,以更好地理解潜在趋势,同时保留四个基本数据。¹ 因此,K 的蜡烛图系统使用默认的回顾期三来计算 OHLC 数据的简单移动平均值。

三期代表小时图中的三小时,日线图中的三天。

要计算 K 的开盘价格,请使用以下公式:

K’s open price i = Openprice i +Openprice i-1 +Openprice i-2 3

要计算 K 的最高价格,请使用以下公式:

K’s high price i = Highprice i +Highprice i-1 +Highprice i-2 3

要计算 K 的最低价格,请使用以下公式:

K’s low price i = Lowprice i +Lowprice i-1 +Lowprice i-2 3

要计算 K 的收盘价格,请使用以下公式:

K’s close price i = Closeprice i +Closeprice i-1 +Closeprice i-2 3

图 8-11 展示了常规蜡烛图与 K 的蜡烛图之间的差异。

图 8-11. 顶部为 EURUSD 的 K 蜡烛图;底部为 EURUSD 的常规蜡烛图

注意,K 的蜡烛图比平均柱状图的走势更加平滑。这是因为 K 的蜡烛图使用的平滑期为 3,而平均柱状图的平滑期为 1。

图 8-12 展示了 AUDNZD 常规蜡烛图与 K 的蜡烛图在同一货币对上的差异。

图 8-12. 顶部为 AUDNZD 的 K 的蜡烛图;底部为 AUDNZD 的常规蜡烛图

K 的蜡烛图的限制如下:

  1. OHLC K 的蜡烛图的值不是真实价格,因为它们已经转换过了。

  2. 在平稳市场中,K 的蜡烛图会交替变色,这会妨碍它们生成信号的能力。

  3. 滞后效应甚至比 Heikin-Ashi 蜡烛图更大。但是,这并不足以完全抵消视图的好处。

您可以使用的代码 K 的蜡烛图的功能如下:

def k_candlesticks(data, open_column, high_column, low_column, 
                   close_column, lookback, position):

    data = add_column(data, 4)

    `# Averaging the open price`
    data = ma(data, lookback, open_column, position)

    `# Averaging the high price`
    data = ma(data, lookback, high_column, position + 1)

    `# Averaging the low price`
    data = ma(data, lookback, low_column, position + 2)

    `# Averaging the close price`
    data = ma(data, lookback, close_column, position + 3)

    return data 

现在让我们看看如何在 K 的蜡烛图上应用之前看到的一些蜡烛图。

检测十字星图案

十字星图案可能是使用 K 的蜡烛图最好的模式之一,因为它与许多形式的短期和长期逆转相关。图 8-13 展示了 GBPUSD 上的信号图表。

图 8-13. 顶部为 K 的蜡烛图上的信号(估计值);底部为实际蜡烛图上的相同信号。货币对为 GBPUSD。

图 8-14 展示了 USDCAD 上的信号图表。在震荡市场上,反转模式的效果相对更好。

图 8-14. 顶部为 K 的蜡烛图上的信号(估计值);底部为实际蜡烛图上的相同信号。货币对为 USDCAD。

表 8-5 总结了一个算法在 K 的蜡烛图上扫描和交易十字星图案的绩效指标。记住,提高绩效的关键之一是优化入场和出场技术。

表 8-5. K 的蜡烛图与十字星图案:绩效总结表

资产 命中率 盈利因子 风险-收益比 信号数
EURUSD 43.66% 0.81 1.05 2352
USDCHF 43.80% 0.90 1.15 2479
GBPUSD 46.19% 1.07 1.24 1840
USDCAD 45.07% 1.02 1.24 2143
BTCUSD 44.23% 0.90 1.13 486
ETHUSD 45.93% 1.20 1.41 1132
GOLD 45.60% 0.89 1.06 2445
S&P500 42.70% 0.89 1.19 384
FTSE100 46.44% 1.19 1.37 267

检测挂月线图案

图 8-15 展示了 AUDNZD 上的信号图表。

图 8-15. 顶部为 K 的蜡烛图上的信号(估计值);底部为实际蜡烛图上的相同信号。货币对为 AUDNZD。

表 8-6 总结了一个算法在 K 的蜡烛图上扫描和交易挂月线图案的绩效指标。

表 8-6. K 的蜡烛图与挂月线图案:绩效总结表

资产 命中率 盈利因子 风险-收益比 信号数
EURUSD 50.00% 1.11 1.11 50
USDCHF 51.68% 0.83 0.78 89
GBPUSD 56.66% 1.65 1.26 60
USDCAD 50.79% 1.19 1.15 63
BTCUSD 43.24% 0.78 1.02 74
ETHUSD 60.38% 0.81 0.53 53
GOLD 55.38% 1.01 0.81 130
S&P500 47.05% 0.77 0.86 17
FTSE100 50.00% 1.80 1.8 24

检测欢愉模式

图 8-16 展示了 AUDNZD 的信号图表。

图 8-16. 在顶部,K 的蜡烛图上的信号(估计值);在底部,实际蜡烛图上相同的信号。货币对为 AUDNZD。

图 8-17 展示了 AUDJPY 的信号图表。

图 8-17. 在顶部,K 的蜡烛图上的信号(估计值);在底部,实际蜡烛图上相同的信号。货币对为 AUDJPY。

表 8-7 总结了一个算法在 K 的蜡烛图上扫描和交易欢愉模式的性能指标。

图 8-7. K 的蜡烛图与欢愉模式:性能摘要表

资产 命中率 盈利因子 风险-收益比 信号数
EURUSD 46.29% 1.02 1.18 3916
USDCHF 44.73% 0.91 1.13 3798
GBPUSD 46.15% 1.00 1.16 4446
USDCAD 45.64% 0.99 1.18 4296
BTCUSD 46.71% 1.01 1.15 3303
ETHUSD 45.14% 0.98 1.19 1327
GOLD 47.40% 1.03 1.14 597
S&P500 48.08% 1.27 1.37 522
FTSE100 48.13% 1.11 1.2 698

检测双重麻烦模式

图 8-18 展示了 USDCHF 的信号图表。

图 8-18. 在顶部,K 的蜡烛图上的信号(估计值);在底部,实际蜡烛图上相同的信号。货币对为 USDCHF。

图 8-19 展示了 EURGBP 的信号图表。

图 8-19. 在顶部,K 的蜡烛图上的信号(估计值);在底部,实际蜡烛图上相同的信号。资产为 EURGBP。

表 8-8 总结了一个算法在 K 的蜡烛图上扫描和交易双重麻烦模式的性能指标。

图 8-8. K 的蜡烛图与双重麻烦模式:性能摘要表

资产 命中率 盈利因子 风险-收益比 信号数
EURUSD 50.35% 0.9 0.89 709
USDCHF 53.36% 1.06 0.93 624
GBPUSD 52.20% 0.98 0.9 793
USDCAD 50.15% 0.93 0.92 664
BTCUSD 54.67% 1.49 1.24 406
ETHUSD 61.37% 2.94 1.85 334
GOLD 51.68% 1.09 1.02 743
S&P500 55.35% 1.07 0.86 112
FTSE100 40.25% 0.42 0.62 77

总结来说,不同的图表系统在提供价格行动不同视角方面很有用。每个系统都有其优缺点。表 8-9 总结了关于图表系统的一些关键点。

图 8-9. 不同蜡烛图系统的比较

图表系统 优点 缺点
蜡烛图表 真实价格和易于解读 嘈杂
平均趋势图 由于平滑处理,趋势解释更佳 延迟小且价格不真实
K 线图 由于额外平滑处理,趋势解释更佳 延迟更大且价格不真实

¹ OHLC 数据。

第九章:蜡烛图模式退出技术

每当出现蜡烛图模式时,你必须考虑三种技术(事件):

入场技术

该技术控制在验证模式后使用的买入或卖出价格。换句话说,你会在模式出现后的下一个开盘价买入吗,还是会使用其他价格?

目标技术

该技术控制在何处盈利性地清算头寸。它可以被称为模式的潜在目标或其预期反应区间

止损技术

该技术控制在何处亏损清算头寸。它可以被称为模式的失效点止损点

本章讨论了两种退出技术,即目标技术和止损技术。

注意

注意入场技术假设在验证模式的蜡烛图开盘价上进行交易(做多或做空)。

对称退出技术

该技术根据模式内关键蜡烛图的大小设定了任何蜡烛图模式的简易目标。对称退出取决于关键蜡烛图的高低差,并从一个极端点进行投影(取决于是看涨还是看跌模式)。

注意

关键蜡烛图是用来确定对称目标的蜡烛图。一般来说,它是确认或定义模式的蜡烛图。例如,Doji 模式的关键蜡烛图是中间的那根蜡烛图,类似加号,而 Euphoria 模式的关键蜡烛图是第三根(最大的)蜡烛图。

图 9-1 展示了从关键蜡烛图(第一根)计算的看涨目标的例子。该示例展示了一个假设的模式。两个箭头的大小相同。

图 9-1. 使用对称退出技术计算看涨目标

考虑一个具有以下特征的看涨吞没形态模式:

  • 蜡烛图吞没形态的开盘价:$100

  • 蜡烛图吞没形态的最高价:$105

  • 蜡烛图吞没形态的最低价:$95

  • 蜡烛图吞没形态的收盘价:$102

你应该瞄准的理论上的看涨目标是 ($105 – $95) + $105 = $115。

图 9-2 展示了使用该技术计算看涨吞没形态潜力的例子。

图 9-2. 使用对称退出技术计算蜡烛图吞没形态看涨目标

图 9-3 展示了从关键蜡烛图计算看跌目标的例子。该示例展示了一个假设的模式。

图 9-3. 使用对称退出技术计算看跌目标

考虑一个带有以下特征的看跌穿透(暗云)模式:

  • 穿透蜡烛图的开盘价:$50

  • 穿透蜡烛图的最高价:$55

  • 吞没蜡烛的最低价:$45

  • 吞没蜡烛的收盘价:$52

你应该瞄准的理论熊市目标是$55 - ($55 - $45) = $45。

图 9-4 展示了使用这种技术的牛市吞没模式的潜力。

图 9-4. 使用对称退出技术计算吞没模式的熊市目标

对称退出技术的优点在于其易用性和简单直觉,即仅仅通过投影高低点之间的距离,这本身就是一个以波动性加权的目标度量。

注意

记住,吞没和穿透模式是我在第六章中讨论的经典反向模式。

固定持有期退出技术

固定持有期假设,当你遇到另一个模式时,你必须退出一个模式。这是一个相对不灵活的技术,并且假设反应必须在一定的时间内发生。

主要思想是,在验证蜡烛图模式后开仓,一个计时器开始并运行直到退出,无论市场价格相对于进场价格如何。

例如,牛市吊顶模式验证完成,并开仓。在固定的持有期 5 个时期之后,必须在五个时间段后退出该持仓。固定的持有期技术假设了一个时间相关的模式,这对于预定的窗口是有效的。

可变持有期退出技术

可变的持有期假设,当你遇到另一个模式时,你必须退出一个模式。这是一个相对不灵活的技术。

主要思想是,在验证蜡烛图模式后开仓,只有当你遇到另一个模式时,无论是牛市还是熊市,你才会退出。这意味着只要市场向你展示否则,该模式就有效。

例如,验证了熊市孕线模式,并开仓。在变动的持有期之后,仅当遇到另一个模式时才退出该持仓。

对于罕见模式,这种技术可能会很危险,因为持仓可能会保持开放很长时间,从而使交易变得过时和无意义。

注意

此技术假设,只有在遇到相同类型的模式或任何其他类型的模式(牛市或熊市)时,你才会退出。值得一提的是,这是本书中呈现的回测中使用的技术。

混合退出技术

混合退出技术可能是讨论的退出技术中最好的选择,因为它结合了三种退出技术的属性,以限制风险。混合退出技术使用先到先服务的方法来确定蜡烛图模式的退出,使用以下规则:

  • 对称投影是计算并赋予特定权重(1%至 99%之间)的。

  • 变动持有期会监控每根蜡烛图,并赋予一定的权重,即给定权重的剩余部分。

  • 固定持有期用于在最大持续时间场景中框定整个交易。

前述要点的含义是,你将在两个情况下退出模式,以先达到的条件为准(对称投影或出现另一模式)。当你退出一个位置时,例如 50%的权重,这意味着你将在验证对称投影或出现另一模式时退出 50%的仓位。

如果在预定时间窗口到期之前不符合这两个条件,将关闭仓位(进入固定持有期)。

让我们举个例子。假设市场在 EURUSD 上验证了一个看涨的镜像模式,并给出以下交易细节:

  • 在$1.0000 处发起买单。

  • 对称投影的计算给出目标价位为$1.0100。

  • 权重设定为 50%。

  • 固定持有期设定为五个周期。

下面是一个假设的时间轴,展示了如果交易者采用混合方法,交易可能的进展:

  • H-1: 市场达到$1.0110 的高点;因模式达到其对称投影,关闭一半仓位。

  • H-2: 市场交易并收盘于$1.0000。

  • H-3: 市场交易并收盘于$0.9995。

  • H-4: 市场交易并收盘于$1.0150。

  • H-5: 市场收盘价为$1.0120,五个周期内未出现任何模式。剩余仓位清算。

每个市场可能有适合它的独特退出策略。总体而言,混合技术试图通过整合多种退出技术来兼顾各方面的利益。表 9-1 展示了所讨论退出技术之间的主要区别。

表 9-1. 退出技术汇总

退出技术 持续时间 依赖性
对称退出技术 中长期 价格
固定持有期 取决于用户 时间
变动持有期 中长期 价格
混合退出技术 中长期 价格和时间

模式作废

总会有这样的时刻,模式未能产生预期的反应,正如您可能从回测结果中看到的那样,这并不少见。在这种情况下,您必须准备好限制损失,通过创建作废规则来实现。这些规则可以是客观的,也可以是主观的,具体取决于交易者。

模式可以通过风险管理技术来作废,例如由交易者自己设定的止损或者像之前在第五章中讨论的 ATR 等波动率措施。

注意,模式无效化与退出技术类似,不同之处在于它涉及到损失退出。然而,固定持有期技术既可以视为目标技术,也可以视为无效化技术,因为它是一种风险限制方法(在一定时间后退出),也是一种目标方法(在相信模式可能引起反应的有限时间后退出)。

模式无效化可以是双重的:

固定止损位

此无效化方法通过设定一个固定水平来限制风险,如果市场达到该水平,则清算头寸。随着市场波动性的不断变化,不建议采用此方法。

基于 ATR 的止损位

此无效化方法通过基于 ATR 的值设定限制水平来限制风险。建议根据波动性调整风险权重。

例如,交易者可以始终将 20 个点用作他们 EURUSD 短期交易的止损位。这意味着如果出现模式并且买入订单在$1.0000 启动,每当市场触及或突破$0.9980 时,该头寸将自动以亏损清算。相比之下,如果同一交易者使用基于 ATR 的技术来无效化模式,他们将在市场突破初始时的开盘价减去 ATR 读数乘以 2 之类的常数后退出。

更明确地说,假设 ATR 值为 20。那么,止损位将在$0.9960(20 × 2 = 40)。

第十章:基于蜡烛图的趋势跟踪策略

模式识别只是方程式的一部分。当您发现一种模式时,您最有可能将其用于更广泛的交易框架中,因为仅依赖于蜡烛图形态的交易系统不太可能产生一致且稳定的正回报。

本章讨论了一些示例策略,您可以使用这些策略来使用特定技术规则来过滤趋势跟踪时的模式。每个市场都有其特点,必须具有优化的策略参数,这就是为什么我建议您专注于理解主要思想和概念,而不是记住本章中提出的策略的确切参数。

理想情况下,这些策略应该帮助您理解如何将不同的蜡烛图形态(经典和现代)与一些技术指标结合起来。本章还讨论了这些指标,以便您了解它们的机制和局限性。

注意

过滤 是指选择那些可能提供正回报概率更高的信号的概念。

结合 Double Trouble 模式和 RSI

作为提醒,Double Trouble 模式是一种现代趋势跟踪蜡烛图形态,其特征包括波动性(使用 ATR 指标计算)。正如在本书中前面讨论的那样,RSI 是一种指标,重新解释市场动量为 0 到 100 之间的值,以更好地理解当前的动态。

尽管 RSI 是一种反向指标,我将向您展示如何在趋势跟踪框架内使用它的技术。

此策略使用 RSI 作为检测到的 Double Trouble 模式的过滤器。这意味着每当发现一种模式时,都会通过 RSI 过滤器来验证信号。

注意

RSI 也可以作为动量计。因此,高于 50 的值表示看涨动量(上涨趋势),而低于 50 的值表示看跌动量(下跌趋势)。这是使用 RSI 作为趋势跟踪指标的一种方式。

策略的交易条件如下:

  • 每当 14 周期 RSI 高于 50 时,出现看涨的 Double Trouble 模式时会生成一个长信号。

  • 每当 14 周期 RSI 低于 50 时,出现看跌的 Double Trouble 模式时会生成一个短信号。

因此,过滤器是相对于 50 的 RSI 值。这是用来通过隐形手机制提高交易命中率的。¹ 策略的基本直觉是在牛市中仅采取看涨信号,在熊市中仅采取看跌信号。

下面的代码片段展示了如何编写策略的信号函数:

def signal(data, open_column, high_column, low_column, close_column, 
           atr_column, rsi_column, buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish setup`
           if data[i, close_column] > data[i, open_column] and \               data[i, close_column] > data[i - 1, close_column] and \               data[i - 1, close_column] > data[i - 1, open_column] and \               data[i, high_column] - data[i, low_column] > \               (2 * data[i - 1, atr_column]) and \               data[i, close_column] - data[i, open_column] > \               data[i - 1, close_column] - data[i - 1, open_column] and \               data[i, buy_column] == 0 and \               data[i, rsi_column] > 50:

                    data[i + 1, buy_column] = 1 

        `# Bearish setup`
           elif data[i, close_column] < data[i, open_column] and \               data[i, close_column] < data[i - 1, close_column] and \               data[i - 1, close_column] < data[i - 1, open_column] and \               data[i, high_column] - data[i, low_column] > \               (2 * data[i - 1, atr_column]) and \               data[i, open_column] - data[i, close_column] > \               data[i - 1, open_column] - data[i - 1, close_column] and \               data[i, sell_column] == 0 and \               data[i, rsi_column] < 50:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

注意到通过 RSI 代码行添加过滤器,说明其相对于中性水平 50 的值。图 10-1 显示了 USDCAD 的信号图表。

你始终可以调整策略,使其更适合你的配置和市场特征。然而,你应该记住,RSI 并非预测趋势的神奇工具,因为它是基于价格的,并且是滞后的(即,它不预测未来,只是讲述过去的故事)。此外,RSI 倾向于多次突破和重新整合 50 水平,这可能会产生错误的信号。

图 10-1. 使用双重麻烦图案和相对强弱指数(RSI)策略的信号图表

结合三根蜡烛图案和移动平均线

移动平均线是很好的趋势过滤器,有助于确定是否执行信号。记住,移动平均线是一种使用滚动窗口跟随市场价格的均值。这种策略结合了来自不同领域的两种趋势跟随元素²,以便发出信号。

三根蜡烛图案是由连续的大体积同类蜡烛线组成的趋势跟随配置,确认了底层趋势。一般来说,看涨的三根蜡烛图案被称为三白兵,而看跌的版本被称为三黑鸦。

注意

类似于使用 RSI 作为趋势跟随者,使用移动平均线在确定底层趋势方面非常有用。

当你看到市场价格高于其移动平均线(例如,100 周期移动平均线)时,通常表明牛市正在进行,而当你看到市场价格低于其移动平均线时,则通常表明熊市正在进行,从而指示了应该偏好哪种类型的信号。

该策略的交易条件如下:

  • 每当市场价格高于其 100 周期移动平均线时,出现三白兵图案时生成长期信号。

  • 每当市场价格低于其 100 周期移动平均线时,出现三黑鸦图案时生成短期信号。

注意

趋势跟随策略使用蜡烛图形态和趋势过滤器的组合,增加了交易的信心。尽管历史回测显示,过滤器并不总是能提高命中率,但对于某些市场来说,这一比率显著提升。

以下代码片段显示了如何编写该策略的信号函数:

def signal(data, open_column, close_column, ma_column, buy_column, 
           sell_column):

    data = add_column(data, 10)

    for i in range(len(data)):

       try:

        `# Bullish setup`
           if data[i, close_column] - data[i, open_column] > body and \               data[i - 1, close_column] - data[i - 1, open_column] > \               body and data[i - 2, close_column] - \ 
              data[i - 2, open_column] > body and data[i, close_column] \               > data[i - 1, close_column] and data[i - 1, close_column] \               > data[i - 2, close_column] and data[i - 2, close_column] \               > data[i - 3, close_column] and data[i, close_column] > \               data[i, ma_column] and data[i, buy_column] == 0:

                    data[i + 1, buy_column] = 1

           `# Bearish setup`
           elif data[i, open_column] - data[i, close_column] > body and \                 data[i - 1, open_column] - data[i - 1, close_column] > body \                 and data[i - 2, open_column] - data[i - 2, close_column] \                 > body and data[i, close_column] < \                 data[i - 1, close_column] and data[i - 1, close_column] \                 < data[i - 2, close_column] and data[i - 2, close_column] \                 < data[i - 3, close_column] and data[i, close_column] < \                 data[i, ma_column] and data[i, sell_column] == 0:

                    data[i + 1, sell_column] = -1

       except IndexError:

            pass

    return data

图 10-2 展示了一个使用 100 周期移动平均线(从左上角开始的弯曲线)作为过滤器的信号图表示例。注意,当市场价格高于其移动平均线时,你只会看到看涨信号,而当市场价格低于其移动平均线时,你只会看到看跌信号。

图 10-2. 使用三根蜡烛图案和移动平均线策略的信号图表

该策略最适合与其他趋势跟随策略一起使用。例如,一个基本交易者在 USDJPY 上有一个带息交易,并看到出现了三个白兵模式,同时市场位于其 100 期移动平均线之上。这种观察可以作为信念增强剂或确认以增加头寸。毕竟,交易是数字游戏,而将胜算累积到你这边则增加了获利的概率。

基本交易者是依靠经济和金融分析而非技术分析做决策的交易者。

带息交易是一种通过买入利率较高的货币并卖出利率较低的货币来获利于利率差异的货币头寸。

结合瓶形图案与随机振荡器

与 RSI 类似,随机振荡器是一种动量指标,在技术交易中广泛使用,并被零售和专业社区广泛知晓。随机振荡器使用基本的归一化函数将值困在 0 到 100 之间。它比 RSI 更容易计算。在讨论振荡器之前,让我们看一下归一化的概念。

每当你有一个不同未界定值的数组,比如市场价格(或任何其他随机时间序列),你可以将这些值归一化到 0 到 1 之间,其中 0 是特定时间窗口的最低值,1 是特定时间窗口的最高值。看看这个表格:

时间步骤 1 2 3 4 5
数值 10 40 5 90 25
标准化值 0.06 0.41 0.00 1.00 0.24

表格显示,当变量从第 1 期到第 5 期移动时,归一化值显示它们可以在 0 到 1 之间,0 指的是特定时间窗口的最低值(5),1 指的是特定时间窗口的最高值(90)。同样,注意到大约在 0 到 1 之间的值具有归一化值 0.41,这意味着它可能是中间值。这是正常的,因为 40 大约是 5 和 90 之间距离的一半。

下面的公式展示了如何在特定时间窗口内将任何值归一化到 0 到 1 之间:

x Normalized = x Original -x Low x High -x Low

让我们通过前面的表格来尝试一个例子。取值为 10,尝试使用公式进行归一化。你应该得到以下计算:

x Normalized = 10-5 90-5 = 0 . 06

随机振荡器以修改的方式将市场价格归一化,通过在公式中结合高点和低点使其变为以下形式:

Stochastic value i = Close i -Low i-n:i High i-n:i -Low i-n:i

公式意味着随机变量的当前值是当前收盘价减去设定的回看期内最低低价之间的差异,再除以相同回看期内最高高价与最低低价之间的差异。

简单归一化函数与随机震荡器函数的区别在于后者增加了高价和低价。

随机震荡器可以被描述为前一个公式的平滑版本,并且通常与其值上计算的短期移动平均线一起绘制,称为信号线。要创建默认的随机震荡器,请按照以下步骤进行:

  1. 使用 14 期滚动窗口归一化随机震荡器函数的值。

  2. 用三期移动平均线平滑第一步骤的结果。这就是随机震荡器。

  3. 计算信号线,这是在第二步骤的值上计算的另一个三期移动平均线。这就是信号线。

注意

在随机震荡器上计算的第一个移动平均线称为平滑,而信号线称为放缓

与 RSI 类似,随机震荡器限于 0 到 100 之间,超卖区在 20 以下,超买区在 80 以上。由于其公式,它比 RSI 更具波动性,并且倾向于更快地从一个极端移动到另一个极端。

随机震荡器有许多技术,但我们感兴趣的是它与信号线的交叉。这被称为交叉技术,在逆向策略中很有名。 (然而,我将其与趋势跟随蜡烛图形模式一起使用,因此将其转变为趋势跟随技术。)

注意

由于归一化函数的性质,你必须小心随机震荡器有时会粘在极端值上,从而产生虚假信号。这种粘性效应表现为振荡器长时间停留在超卖和超买区域。

下面的代码片段展示了如何编写随机震荡器:

def stochastic_oscillator(data, 
                             lookback, 
                             high, 
                             low, 
                             close, 
                             position, 
                             slowing = False, 
                             smoothing = False, 
                             slowing_period = 1, 
                             smoothing_period = 1):

    data = add_column(data, 1)

    for i in range(len(data)):

        try:

            data[i, position] = (data[i, close] - min(data[i - lookback \
                                + 1:i + 1, low])) / (max(data[i - lookback\
                                + 1:i + 1, high]) - min(data[i - lookback \
                                + 1:i + 1, low]))

        except ValueError:

            pass

    data[:, position] = data[:, position] * 100  

    if slowing == True and smoothing == False:

        data = ma(data, slowing_period, position, position + 1)

    if smoothing == True and slowing == False:

        data = ma(data, smoothing_period, position, position + 1)

    if smoothing == True and slowing == True:

        data = ma(data, slowing_period, position,   position + 1)

        data = ma(data, smoothing_period, position + 1, position + 2)        

    data = delete_row(data, lookback)

    return data

该策略的交易条件如下:

  • 当随机震荡器高于其信号线时出现牛瓶形态时生成长信号。

  • 当随机震荡器低于其信号线时出现熊瓶形态时生成短信号。

下面的代码片段展示了如何编写策略的信号函数:

def signal(data, open_column, high_column, low_column, close_column, 
           stochastic_column, signal_column, buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:
  `# Bullish setup`
           if data[i, close_column] > data[i, open_column] and \               data[i, open_column] == data[i, low_column] and \               data[i - 1, close_column] > data[i - 1, open_column] and \               data[i, open_column] < data[i - 1, close_column] and \               data[i, stochastic_column] > data[i, signal_column] and \               data[i, buy_column] == 0:

                    data[i + 1, buy_column] = 1 

           `# Bearish setup`
           elif data[i, close_column] < data[i, open_column] and \                 data[i, open_column] == data[i, high_column] and \                 data[i - 1, close_column] < data[i - 1, open_column] and \                 data[i, open_column] > data[i - 1, close_column] and \                 data[i, stochastic_column] > data[i, signal_column] and \                 data[i, sell_column] == 0:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 10-3 显示了 USDCHF 的信号图表。

图 10-3. 使用瓶形态和随机震荡器的策略信号图表

结合丸坐模式与 K 的波动带

让我们从本书中涵盖的第一个蜡烛图案重新开始。丸坐模式可以被认为是最强大的蜡烛图案,因为它没有影线,意味着市场直接从一个点到另一个点而没有犹豫。

此策略使用一种称为波动带的概念,这是一种包围市场价格以提供动态支撑和阻力水平的框架技术。

注意

有许多类型的波动率带。最著名的是布林带。不同类型的波动率带的可靠性取决于基础市场及其参数。

在掌握 K 的波动率带之前,您必须了解布林带的基础知识。由约翰·波林格(John Bollinger)开发,这些带子的性质更倾向于统计而非技术。

考虑以下列表:{11, 4, 5, 20}。给定这四个值,您如何描述这些元素?一般来说,描述列表中元素的最佳指标是均值。它也是下一个预期值的最佳估计(如果您按时间顺序添加新元素)。要计算列表的均值,请按照以下公式操作:

χ = 1 n ( i=1 n x i ) = x 1 +x 2 +...+x n n

因此,根据公式,您必须将它们相加,并将结果除以它们的数量:

χ = 11+4+5+20 4 = 10

因此,列表的均值为 10。在前几章中,记住波动性的概念,您使用 ATR 来近似价格相对于过去时期的波动。带子使用另一种技术来计算波动性,即描述性统计中使用的标准差。

标准差是变量与组均值的平方偏差的平方根。这个概念可能听起来复杂,但让我们简化几个步骤:

  • 计算每个变量(收盘价)在同一时间步长内与回溯期均值的距离。

  • 对这些距离进行平方,以避免获得负值。

  • 计算这些平方距离的均值。结果称为方差

  • 计算方差的平方根。结果称为标准差

注意

在最后一步中取平方根,使您能够将均值进行苹果与苹果的比较。

从数学角度来说,标准差的公式如下所示:

σ = 1 n i=1 n (x i -χ) 2

现在您已经知道如何计算移动平均线,您可以简单地应用滚动标准差测量,这与移动平均线相同,只是您在计算滚动波动性。

  • 上布林带是当前 20 周期移动平均值与当前标准差乘以 2 的和。

  • 下布林带是当前 20 周期移动平均值与当前标准差乘以 2 的差。

注意

常数(默认为 2)乘以标准偏差的值,然后将乘积加或减去当前移动平均值。

图 10-4 显示了应用在 USDCHF 上的布林带示例。一些交易者喜欢保持中线(即 20 周期移动平均线)。然而,对于布林带来说,该线并不像带子本身那样有价值。

图 10-4. 在 USDCHF 上应用布林带的示例

一般来说,当市场达到下布林带时,被认为是超卖的,预期将出现看涨反应。同样,当市场达到上布林带时,被认为是超买的,并且预期将出现看跌反应。

现在让我们看一下 K 的波动带,它受布林带的启发。它遵循以下条件:

  • 计算最近 20 个周期内最高高点和最低低点的均值。

  • 计算最近 20 个周期的最高标准偏差测量。

  • 上波动带是第一步和第二步结果的总和乘以 2。

  • 下波动带是第一步和第二步结果的差值乘以 2。

注意

同样,常数(默认为 2)乘以标准偏差的最大值,然后将产品与最大高低点的均值当前值相加或相减。

下面的代码片段显示了编码 K 的波动带函数:

`# Defining the standard deviation function`
def volatility(data, lookback, close, position):

    data = add_column(data, 1)

    for i in range(len(data)):

        try:

            data[i, position] = (data[i -lookback + 1:i + 1, close].std())

        except IndexError:

            pass

    data = delete_row(data, lookback)    

    return data

def k_volatility_band(data, lookback, multiplier, high, low, close, 
                      position):

    data = add_column(data, 6)

    `# Calculating the median line`
    for i in range(len(data)):

        try:

            data[i, position] = max(data[i - lookback + 1:i + 1, high]) 
            data[i, position + 1] = min(data[i - lookback + 1:i + 1, low]) 
            data[i, position + 2] = (data[i, position] + data[i, position \                                     + 1]) \/ 2

        except ValueError:

            pass

    data = delete_column(data, position, 2)

    `# Calculating maximum volatility`
    data = volatility(data, lookback, close, position + 1)

    for i in range(len(data)):

        try:

            data[i, position + 2] = max(data[i - lookback + 1:i + 1, \                                     position + 1]) 

        except ValueError:

            pass   

    data = delete_column(data, position + 1, 1)

  `# Calculating the bands`
    data[:, position + 2] = data[:, position] + (multiplier * data[:, \                             position + 1])    
    data[:, position + 3] = data[:, position] - (multiplier * data[:, \                             position + 1])

    data = delete_column(data, position + 1, 1)    

    return data

注意

保持中线对于策略至关重要,因为它是主要的过滤器。因此,使用 K 的波动带时,中线出现在图表中。

请注意,词语波动性标准偏差在本文中是可以互换使用的。图 10-5 展示了应用在 USDCHF 上的 K 的波动带的示例。

图 10-5. K 的波动带应用在 USDCHF 上的示例

现在让我们讨论一下策略。交易条件如下:

  • 每当市场价格低于中线时出现看涨光头党图案时,将生成一个长信号。

  • 每当市场价格高于中线时出现看跌光头党图案时,就会生成一个短信号。

下面的代码片段显示了如何编写策略的信号函数:

def signal(data, open_column, high_column, low_column, close_column, 
           middle_band, buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish setup`
           if data[i, close_column] > data[i, open_column] and \               data[i, high_column] == data[i, close_column] and \               data[i, low_column] == data[i, open_column] and \               data[i, close_column] < data[i, middle_band] and \               data[i, buy_column] == 0:

                    data[i + 1, buy_column] = 1 
        `# Bearish setup`
           elif data[i, close_column] < data[i, open_column] and \                 data[i, high_column] == data[i, open_column] and \                 data[i, low_column] == data[i, close_column] and \                 data[i, close_column] > data[i, middle_band] and \                 data[i, sell_column] == 0:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 10-6 显示了 AUDNZD 上的信号图表。

图 10-6. 使用光头党图案和 K 的波动带策略的信号图表

可选地,您可以考虑以下更严格的条件(然而,信号会更少频繁):

  • 每当市场价格低于下波动率带时出现看涨光头党图案时,将生成一个长信号。

  • 每当市场价格高于上波动带时出现看跌光头党图案时,将生成一个短信号。

总之,该策略可能会有更少的信号,但直观上它具有关于最强大蜡烛图(按振幅计算)和统计极端的坚实基础。

将 H 型模式与趋势强度指数结合起来

趋势强度指数(TII)衡量趋势的强度。它是通过围绕移动平均线和价格偏差的简单计算创建的,以显示趋势的强度。要构建该指标,请按以下步骤操作:

  1. 在市场价格上计算 20 周期移动平均值。

  2. 计算市场价格与移动平均线的偏差。这可以通过在两列上完成。如果收盘价高于其移动平均值,则第一列由两者之间的差异填充(上行变量),如果当前市场价格低于其移动平均值,则第二列由两者之间的差异填充(下行变量)。

  3. 计算市场上移动平均线之上和之下的数值。

注意

使用numpy函数count_nonzero()可以完成具有特定条件的数值计数。

  • 按照以下公式找到 TII(默认为 20 期回顾)来应用:

T I I i = ( Numberofup Numberofup+Numberofdown ) x 100

要在 Python 中编码 TII,请使用以下函数:

def trend_intensity_indicator(data, lookback, close_column, position):

    data = add_column(data, 5)

    `# Calculating the moving average`
    data = ma(data, lookback, close_column, position)

    `# Deviations`
    for i in range(len(data)):

        if data[i, close_column] > data[i, position]:
           data[i, position + 1] = data[i, close_column] - \            data[i, position]

        if data[i, close_column] < data[i, position]:
           data[i, position + 2] = data[i, position] - \            data[i, close_column]

    `# Trend intensity index`
    for i in range(len(data)):

        data[i, position + 3] = np.count_nonzero(data[i - lookback + 1:i \                                 + 1, position + 1])

    for i in range(len(data)):

        data[i, position + 4] = np.count_nonzero(data[i - lookback + 1:i \                                 + 1, position + 2])

    for i in range(len(data)):

        data[i, position + 5] = ((data[i, position + 3]) / (data[i, \                                 position + 3] + data[i, position + 4])) \                                 * 100

    data = delete_column(data, position, 5)

    return data

通常情况下,当 TII 高于 50 时,正在进行强劲的看涨动能,而当 TII 低于 50 时,正在进行强劲的看跌动能。

策略的交易条件如下:

  • 每当 20 期 TII 高于 50 时,出现看涨 H 型时产生长信号。

  • 每当 20 期 TII 低于 50 时,出现看跌 H 型时产生短信号。

注意

调整 TII 的回顾以找到合适的调整是可取的。H 型模式作为逆转失效模式(因此是趋势确认模式),可能与显示基础趋势强度的指标很好地配合。

下面的代码片段显示了如何编写策略的信号函数:

def signal(data, open_column, high_column, low_column, close_column, 
           tii_column, buy_column, sell_column):

    data = add_column(data, 5)    

    data = rounding(data, 4) `# Put 0 instead of 4 as of pair 4`

    for i in range(len(data)):  

       try:

           `# Bullish setup`
           if data[i, close_column] > data[i, open_column] and \               data[i, close_column] > data[i - 1, close_column] and \               data[i, low_column] > data[i - 1, low_column] and \               data[i - 1, close_column] == data[i - 1, open_column] and \               data[i - 2, close_column] > data[i - 2, open_column] and \               data[i - 2, high_column] < data[i - 1, high_column] and \               data[i, tii_column] > 50:

                    data[i + 1, buy_column] = 1 

           `# Bearish setup`
           elif data[i, close_column] < data[i, open_column] and \                 data[i, close_column] < data[i - 1, close_column] and \                 data[i, low_column] < data[i - 1, low_column] and \                 data[i - 1, close_column] == data[i - 1, open_column] and \                 data[i - 2, close_column] < data[i - 2, open_column] and \                 data[i - 2, low_column] > data[i - 1, low_column] and \                 data[i, tii_column] < 50:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 10-7 显示了 EURGBP 的信号图表。

图 10-7. 使用 H 型和趋势强度指数策略的信号图表

图表显示,有一个信号与看涨条件重合。

总结本章时,重要的是将正确的模式与正确的指标结合起来,这通过反向测试完成。当然,所提供的组合只是例子,可以通过将其他指标与其他模式融合来创建更强大的组合是非常有趣的。此外,你可以将多种模式包含在你的策略中,而不仅仅是将一个模式与一个指标结合。

¹ 看不见的手机制涉及与趋势同步使用交易,例如,在看涨趋势中仅接受买入信号,而忽略任何卖出信号。

² 三蜡烛模式源自于模式识别领域,而移动平均则来自于统计学和趋势跟随技术指标领域。

第十一章:基于蜡烛图的逆向策略

本章涵盖了蜡烛图案策略的逆向部分。 请记住,单独的蜡烛图案不太可能提供稳定的回报,因为它们必须与更复杂的技术和指标相结合,以将简单的想法和观察转化为可行的交易设置。

您应该认识到本章中使用的一些指标,因为它们已经表明它们在趋势跟踪中是有用的。 值得注意的是,RSI 不仅可以提供当前市场状态(有助于确定趋势),还可以提供可能指向逆转的极端水平(有助于确定逆向交易)。 换句话说,取决于您如何使用它,RSI 可以是趋势跟踪或逆向指标。

确保专注于将模式与指标相结合的直觉,以便您可以创建自己的策略组合。 毕竟,第十章和第十一章的重点是帮助您设计自己的策略。

将十字星图案与 RSI 相结合

此策略可能是最熟悉的将蜡烛图案和技术指标相结合的策略之一。 十字星是最简单的逆向配置,RSI 是最常用和研究的指标,两者都可以很好地确认预期的逆向移动。

注意

RSI 过滤器使得可以将十字星图案转换为一个蜡烛图案,而不是三个。 这是因为十字星图案中的第一个和第三个蜡烛只用于区分牛市十字星图案和熊市十字星图案。 因此,十字星只是一个加号形状的蜡烛。

该策略使用了一种激进的技术,等待 RSI 的读数低于超卖水平或高于超买水平。 超卖和超买水平是可变的,并取决于基础市场和 RSI 的回顾。

通常,使用 14 周期 RSI(默认版本)的交易者倾向于将 30 作为超卖水平,将 70 作为超买水平。 该策略使用 3 周期 RSI,将 20 作为超卖水平,将 80 作为超买水平。 这旨在增加信号的频率,因为这样更有可能在 RSI 上同时出现一个十字星图案和一个信号。

交易条件如下:

  • 每当 3 周期 RSI 低于 20 时出现牛市十字星图案时,都会生成一个做多信号。

  • 每当 3 周期 RSI 高于 80 时出现熊市十字星图案时,都会生成一个做空信号。

下面的代码片段显示了如何编写策略的信号函数:

lower_barrier = 20
upper_barrier = 80

def signal(data, open_column, close_column, indicator_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    data = rounding(data, 0)  

    for i in range(len(data)):  

       try:

        `# Bullish setup`
           if data[i, close_column] == data[i, open_column] and \               data[i, indicator_column] < lower_barrier:

                    data[i + 1, buy_column] = 1 

           `# Bearish setup`
           elif data[i, close_column] == data[i, open_column] and \                 data[i, indicator_column] > upper_barrier:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 11-1 显示了 AUDNZD 上的信号图,展示了该策略的运作情况。正如您在前几章中了解到的那样,逆势技术在平稳(横盘)市场中效果更好,因为供求之间存在暗示的平衡,任何一方的过度都有可能恢复正常。逆势工具通过这种过度来衡量。

图 11-1. 使用十字星模式和 RSI 计算策略的信号图

总结一下,十字星模式非常灵活,因其简单而容易与技术指标集成。该策略易于理解,并存在许多其他变体,调整以提高其频率和盈利能力。

将吞噬模式与布林带结合

第十章提到,布林带是一种随市场价格移动的包络线技术,利用统计方法提供动态支撑和阻力水平。此策略将吞噬模式与市场价格相对于下布林带或上布林带的位置结合起来。

策略的交易条件如下:

  • 每当市场价格低于下布林带时出现多头吞噬模式时,会生成一个长信号。

  • 每当市场价格高于上布林带时出现空头吞噬模式时,会生成一个短信号。

注意

市场价格低于其下布林带意味着统计上超卖事件,并暗示看涨反应,而市场价格高于其上布林带则意味着统计上超买事件,并暗示看跌反应。

以下代码片段显示了如何编写策略的信号函数:

def signal(data, open_column, close_column, upper_band_column, 
           lower_band_column, buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish setup`
           if data[i, close_column] > data[i, open_column] and \               data[i, open_column] < data[i - 1, close_column] and \               data[i, close_column] > data[i - 1, open_column] and \               data[i - 1, close_column] < data[i - 1, open_column] and \               data[i - 2, close_column] < data[i - 2, open_column] and \               data[i, close_column] < data[i, lower_band_column]:

                    data[i + 1, buy_column] = 1 

          `# Bearish setup`
           elif data[i, close_column] < data[i, open_column] and \                 data[i, open_column] > data[i - 1, close_column] and \                 data[i, close_column] < data[i - 1, open_column] and \                 data[i - 1, close_column] > data[i - 1, open_column] and \                 data[i - 2, close_column] > data[i - 2, open_column] and \                 data[i, close_column] > data[i, upper_band_column]:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

一般来说,布林带使用 20 期的回溯期和 2 的标准差。但让我们再次回顾一下,确保你彻底理解这个伟大的指标设计的含义:

  • 20 期回溯期是指在市场价格(收盘价)上计算的 20 期移动平均值。类似地,市场价格(收盘价)上计算了 20 期移动标准差测量。

  • 标准差为 2 意味着在加到移动平均值或减去之前,滚动标准差测量将乘以两倍。

以下代码片段显示了计算布林带的函数:

def bollinger_bands(data, lookback, standard_deviation, close, position):

    data = add_column(data, 2)
  `# Calculating the moving average`
    data = ma(data, lookback, close, position)

    `# Calculating the standard deviation`
    data = volatility(data, lookback, close, position + 1)

    data[:, position + 2] = data[:, position] + (standard_deviation * 
                            data[:, position + 1])
    data[:, position + 3] = data[:, position] - (standard_deviation * 
                            data[:, position + 1])

    data = delete_row(data, lookback)

    data = delete_column(data, position + 1, 1)

    return data

注意

波动性标准差 这两个词可以互换使用。

策略使用标准差为 1 的 20 期布林带。这是为了增加信号的频率,就像你在前一个策略中看到的那样。图 11-2 显示了 USDCAD 的信号图,你可以看到该策略的实施情况。

注意带更接近市场价格,并经常被突破或超越。从统计学角度来看,如果我们假设金融时间序列遵循正态分布,那么 68%的市场价格应该包含在移动平均线的一个标准偏差内(由上下带表示)。

吞没模式本身不是一个丰富的模式,因此通过添加额外的过滤器(布林带),频率进一步降低,这就是为什么调整参数很重要的原因。

图 11-2. 使用吞没模式和布林带的策略信号图表

将刺穿模式与随机振荡器结合使用

该策略将经典的蜡烛图逆势配置刺穿模式与技术指标随机振荡器结合,后者在第十章讨论过。

注意

请记住,随机振荡器使用归一化函数创建一个在 0 到 100 之间的滚动计算,同时考虑高低价格。它的解释和使用方式类似于 RSI。

策略的交易条件如下:

  • 在 14 周期随机振荡器低于 20 时出现看涨的刺穿模式时会生成一个长信号。

  • 在 14 周期随机振荡器高于 80 时出现看跌的刺穿模式时会生成一个短信号。

以下代码片段显示了如何编写策略的信号函数:

lower_barrier = 20
upper_barrier = 80

def signal(data, open_column, close_column, indicator_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish setup`
           if data[i, close_column] > data[i, open_column] and \               data[i, close_column] < data[i - 1, open_column] and \               data[i, close_column] > data[i - 1, close_column] and \               data[i, open_column] < data[i - 1, close_column] and \               data[i - 1, close_column] < data[i - 1, open_column] and \               data[i - 2, close_column] < data[i - 2, open_column] and \               data[i, indicator_column] < lower_barrier:

                    data[i + 1, buy_column] = 1 

           `# Bearish setup`
           elif data[i, close_column] < data[i, open_column] and \                 data[i, close_column] > data[i - 1, open_column] and \                 data[i, close_column] < data[i - 1, close_column] and \                 data[i, open_column] > data[i - 1, close_column] and \                 data[i - 1, close_column] > data[i - 1, open_column] and \                 data[i - 2, close_column] > data[i - 2, open_column] and \                 data[i, indicator_column] > upper_barrier:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 11-3 显示了 USDCHF 的信号图表,上升箭头代表看涨信号,下降箭头代表看跌信号。

总之,将刺穿模式与随机振荡器结合使用为预期的反转提供了额外的确认因素。随机振荡器可以根据需要进行调整,以校准策略到所需的频率和盈利能力。当然,没有一种策略适用于所有资产,但这就是我们称之为金融市场的半随机环境的本质。

图 11-3. 使用刺穿模式和随机振荡器的策略信号图表

将亢奋模式与 K 的信封结合使用

K 的信封是一对简单的 800 周期移动平均线,其中一个应用于价格的高点,另一个应用于价格的低点,从而形成一个区域。因此,它是一个随市场价格变动的动态支撑和阻力区域。K 的信封的一个重要特征是稳定性,这是由于回顾期显著高,因此相对于短期波动或噪音相对免疫。

该指标非常简单,用于确定当前市场趋势(看涨或看跌),或者在市场进入区域时寻找需求和供给区。以下代码块显示了 K 线信封的功能:

def k_envelopes(data, lookback, high, low, position):

    `# Calculating the upper moving average`
    data = ma(data, lookback, high, position)

    `# Calculating the lower moving average`
    data = ma(data, lookback, low, position + 1)    

    return data

图 11-4 显示了应用了 K 线信封的 USDCHF 图表。注意信封如何提供动态的支撑和阻力区域。

图 11-4. USDCHF 与 K 线信封

现在的想法是将 K 线信封与蜡烛图案结合起来。策略的交易条件如下:

  • 每当市场价格在 K 线信封内时出现看涨的 Euphoria 模式时,就会生成一个长信号。

  • 每当市场价格在 K 线信封内出现看跌的 Euphoria 模式时,就会生成一个短信号。

通过在 K 线信封内,市场价格因此正在期待一个由 Euphoria 模式确定的方向上的反应。换句话说,触发和方向由 Euphoria 模式给出,而确认则由 K 线信封给出。

以下代码片段显示了如何编写策略的信号函数:

def signal(data, open_column, close_column, upper_k_envelope, 
           lower_k_envelope, buy_column, sell_column):

    data = add_column(data, 5)  

    data = rounding(data, 4) # Put 0 instead of 4 as of pair 4

    for i in range(len(data)):  

       try:
      `# Bullish setup`
           if data[i, open_column] > data[i, close_column] and \               data[i - 1, open_column] > data[i - 1, close_column] and \               data[i - 2, open_column] > data[i - 2, close_column] and \               data[i, close_column] < data[i - 1, close_column] and \               data[i - 1, close_column] < data[i - 2, close_column] and \               (data[i, open_column] - data[i, close_column]) > (data[i - 1,
              open_column] - data[i - 1, close_column]) and \               (data[i - 1, open_column] - data[i - 1, close_column]) > 
              (data[i - 2, open_column] - data[i - 2, close_column]) and \               data[i, close_column] > data[i, lower_k_envelope] and \               data[i, close_column] < data[i, upper_k_envelope]: 

                    data[i + 1, buy_column] = 1 

        `# Bearish setup`
           elif data[i, open_column] < data[i, close_column] and \                 data[i - 1, open_column] < data[i - 1, close_column] and \                 data[i - 2, open_column] < data[i - 2, close_column] and \                 data[i, close_column] > data[i - 1, close_column] and \                 data[i - 1, close_column] > data[i - 2, close_column] and \                 (data[i, open_column] - data[i, close_column]) > (data[i \                 - 1, open_column] - data[i - 1, close_column]) and \                 (data[i - 1, open_column] - data[i - 1, close_column]) > \                 (data[i - 2, open_column] - data[i - 2, close_column]) and \                 data[i, close_column] > data[i, lower_k_envelope] and \                 data[i, close_column] < data[i, upper_k_envelope]: 

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 11-5 显示了一个信号图表,其中 K 线信封在图表上可见。信号的生成是由于在信封内出现 Euphoria 模式。

这种策略借鉴了图表分析领域(支撑和阻力水平),并应用了 Euphoria 现代蜡烛图案来确认需求区或供给区。

图 11-5. 使用 K 线信封和 Euphoria 模式的策略信号图表

将障碍模式与 RSI-ATR 结合起来

RSI-ATR 到底是什么?嗯,你已经知道 RSI 是一个动量指标,ATR 是一个波动性指标。你也看过如何编写它们并相应地使用它们。然而,将它们融合成一个指标是你尚未见过的事情。RSI-ATR 是由 RSI 的方向元素和 ATR 的膨胀/缩小特性组成的结构化指标。它的使用方式与 RSI 相同。

结构化指标 是由两个或更多指标组成的技术指标。结构化指标的例子包括 RSI-ATR 和随机 RSI(其中包含随机振荡器和 RSI 作为基本组件)。

要计算 RSI-ATR(默认情况下,回溯期为 14),请按照以下步骤进行:

  1. 在市场价格上计算一个 RSI。

  2. 使用你已知的公式在市场价格上计算 ATR。

  3. 将第一步的 RSI 除以第二步的 ATR。

  4. 在上一步结果的基础上计算一个 RSI。

因此,RSI-ATR 是在 RSI(应用于市场价格)和 ATR 之间比率上计算的 RSI。这就是它是一个以波动性加权的指标的原因。以下代码片段显示了如何在 Python 中创建该指标:

def rsi_atr(data, lookback_rsi, lookback_atr, lookback_rsi_atr, high, 
            low, close, position):

    data = rsi(data, lookback_rsi, close, position)

    data = atr(data, lookback_atr, high, low, close, position + 1)

    data = add_column(data, 1)

    data[:, position + 2] = data[:, position] / data[:, position + 1]

    data = rsi(data, lookback_rsi_atr, position + 2, position + 3)

    data = delete_column(data, position, 3)

    return data

图 11-6 展示了应用于 USDCHF 的 5 周期 RSI-ATR。

图 11-6. USDCHF 的 14 周期 RSI-ATR
注意

您一定注意到,处理 RSI-ATR 时有三个参数,而处理 RSI 时只有一个参数。RSI-ATR 的第一个参数是 RSI 的回溯期,第二个参数是 ATR 的回溯期,第三个参数是最终 RSI 的回溯期。

RSI-ATR 具有比原始 RSI 更高的波动性和变化率,因此对市场波动更为敏感。另一方面,您使用它的方式与使用 RSI 的方式相同。

请记住,Barrier 模式是一种现代配置(见第 7 章),仅仅是支撑和阻力水平概念的体现。

策略的交易条件如下:

  • 每当 5 周期 RSI-ATR 低于 20 时,出现牛市 Barrier 模式时会生成长信号。

  • 每当 5 周期 RSI-ATR 高于 80 时,出现熊市 Barrier 模式时会生成短信号。

以下代码片段展示了如何编写策略的信号函数:

def signal(data, open_column, close_column, indicator_column, 
           buy_column, sell_column):

    data = add_column(data, 5)    

    for i in range(len(data)):  

       try:

           `# Bullish setup`
           if data[i, close_column] > data[i, open_column] and \               data[i, close_column] < data[i - 1, open_column] and \               data[i, close_column] > data[i - 1, close_column] and \               data[i, open_column] < data[i - 1, close_column] and \               data[i - 1, close_column] < data[i - 1, open_column] and \               data[i - 2, close_column] < data[i - 2, open_column] and \               data[i, indicator_column] < lower_barrier:

                    data[i + 1, buy_column] = 1 

  `# Bearish setup`
           elif data[i, close_column] < data[i, open_column] and \                 data[i, close_column] > data[i - 1, open_column] and \                 data[i, close_column] < data[i - 1, close_column] and \                 data[i, open_column] > data[i - 1, close_column] and \                 data[i - 1, close_column] > data[i - 1, open_column] and \                 data[i - 2, close_column] > data[i - 2, open_column]  and \                 data[i, indicator_column] > upper_barrier:

                    data[i + 1, sell_column] = -1 

       except IndexError:

            pass

    return data

图 11-7 展示了 AUDNZD 的信号图表。

图 11-7. 使用 RSI-ATR 和 Barrier 模式的策略信号图表

总之,RSI-ATR 是一个有趣的指标,提供了基于 RSI 的波动加权信息。将该指标与基于支撑和阻力水平概念的蜡烛图形态结合起来,可能会产生强大的交易配置。

第十二章:风险管理与交易心理

风险管理 是任何交易系统的支柱之一,实际上可能是最重要的支柱之一。找到一种有预测性且有利可图的交易策略将使您赚钱,但一个稳健的风险管理系统将使您能够保留利润。

本章讨论交易过程中的主观部分,并解释在交易中可能遇到的已知偏见。

风险管理基础

风险管理并不需要复杂。您可以通过本节中提供的几个简单规则来建立一个坚实的风险管理系统。

止损和目标

正如本书中先前讨论的那样,止损指令 是在交易发起时设置的自动指令,以确保最小预定损失。例如,如果您在金价 $1,500 上买入几个合约,预期其将上涨到 $2,000,您可以将止损指令设置在 $1,250,以便如果价格下跌到 $1,250,您的损失不超过 $250。与此同时,您在市场价格达到 $2,000 时预期出售的行为被称为止盈指令目标)。

任何交易的最基本风险管理系统是设定适当的止损和目标,以便您能够规划预期并限制风险。

注意

您绝对不能违反的一条规则是:始终设定止损和目标。

移动止损

移动止损 是一种动态止损指令,当市场价格朝预期方向移动时跟随其变化,从而确保较少的损失,并在某一时刻确保无损交易。最好通过一个例子来理解移动止损指令。假设您在 EURUSD 上开多仓,价格为 $1.0000,目标为 $1.0500。您设定止损指令为 $0.9900 以限制损失。现在假设过去两天,当前市场价格为 $1.0230,您希望确保您的交易永远不会亏钱。解决方案是使用移动止损指令,将止损从 $0.9900 调整至 $1.0000,以便在最坏的情况下,当市场回落到 $1.0000 时,您可以平仓并保本。另一种确保至少获得一些利润的方法是将止损调整到 $1.0100,从而无论如何都确保获利。当然,您将止损指令调整得越接近当前市场价格,您被迫平仓(在这种情况下是盈利的)的可能性就越大。

注意

在跟随趋势策略时,始终使用移动止损是个好主意。

仓位大小

仓位大小 是为每笔交易分配合约或手数的选择。一些交易者对所有交易使用相同的大小,而其他人则根据一个或多个因素对它们进行加权。有许多方法来确定您的仓位大小,有些方法使用历史数据,考虑到您的先前结果以优化大小。以下是一些技术列表:

固定金额

这是最简单的尺寸技术,因为它不需要任何努力。例如,你不需要选择合同数量或分配多少资金给交易。例如,你可以在每笔交易中投资$1,000,而不考虑你的资本或风险。这可能被认为是一种简单化的技术,但一些交易者更倾向于将他们的精力投入到其他地方,保持仓位大小中性。

投资组合百分比

这种技术是固定金额技术的更动态版本,因为交易员采取的仓位会随着它们与投资组合大小挂钩而增长和缩减。例如,你有一个 3%的仓位规则。如果你的投资组合是$100,000,那么你应该进行$3,000 的交易。如果投资组合市值变为$120,000,那么你应该进行$3,600 的交易。

信念方面

这是一种基于交易员信念程度的仓位尺寸的主观技术。例如,如果你更相信购买 EURUSD 而不是购买微软股票,那么你可能会在 EURUSD 交易中分配更多资金。金额的差异取决于你自己。

凯利准则

这是一个客观的数学公式,通过使用你的历史结果告诉你应该投资多少。由约翰·凯利创建,这个公式主要用于赛马投注,但也用于交易。公式如下:

Kelly weight = W - (1-W) R

这里,凯利权重 是你应该根据你的投资组合总值采取的交易大小的百分比,W 是历史命中率,R 是平均盈利和平均亏损的比率。看下面的例子:

  • 过去 100 笔交易的历史命中率 = 56%

  • 过去 100 笔交易的历史损失比率 = 44%

  • 每笔平均盈利 = $110

  • 每笔平均亏损 = $100

  • 盈亏比 = 1.1

如果你发现一个机会,推荐的交易分配是多少?

通过使用这个公式,答案是 16%。自然地,凯利准则并非完美的度量方式,因为有时它倾向于给予不利于分散的大权重。用户在使用凯利准则时必须小心谨慎。你也可以使用一个紧缩器来减小公式给出的大小。

命中率技术:这是我有时使用的一种个人技术。它基于绩效聚类,这意味着通常盈利交易和亏损交易会同时发生。这尤其可能是因为某些策略在某些时期表现良好,而在其他时期表现不佳。本质上来说,这就像说交易员有时候有好的时期,有时候会处于输掉的一边,就像最有经验的老手一样。表格 12-1 展示了如何使用命中率技术来确定你的仓位大小。

表格 12-1. 时间命中率测量

元素 t t+1 t+2 t+3 t+4 t+5
命中率 50% 60% 40% 40% 70% 60%
头寸大小 $5,000 |  $6,000 $4,000 |  $4,000 $7,000 |  $6,000

表格显示了针对每笔交易默认大小为$10,000 的推荐头寸大小。基本上,当您有 50%的历史命中率时,系统建议将默认大小的 50%分配,即$5,000。在表现良好时,系统会奖励交易者更多的分配和规模。

经济日历

经济日历是最简单的风险管理技术,因为它是一种风险回避的形式。经济日历显示了预计会对市场产生影响的重要新闻发布。Table 12-2 展示了某一天的经济日历的假设示例。

Table 12-2. 经济日历

时间 国家 事件 影响 上一个数值 预期数值 实际数值
9:00 AM 英国 消费者价格指数 1.00% 1.20% 1.10%
11:30 AM 德国 核心消费者价格指数 0.50% 0.75% 0.75%
4:30 PM 美国 初次申请失业救济人数 232,000 215,000 229,000
7:30 PM 美国 利率决定 1.50% 1.50% TBA

一些交易者根据新闻交易,因此他们喜欢在新闻发布前或发布后几秒钟内交易,以从波动中获利。从风险管理的角度来看,这不被推荐,因为波动在新闻事件周围是随机的,有时会给市场带来惊喜。

最好的做法是避免在历史上曾引起极端波动的重要发布时间周围进行交易。例如政治公告、国内生产总值数据和 FOMC 会议。

注意

FOMC 指联邦公开市场委员会。该委员会监督国家的公开市场国库操作,并就利率作出决策。

行为金融:偏见的力量

行为金融,源自行为经济学,试图解释市场异常现象和交易者的行为。通过深入理解行为金融,你将更好地理解市场为何在某些事件和水平周围以特定方式反应。根据行为金融的观点,这些模式具有心理学特性,因此是由行为特征引起的。

金融市场由不同的人类和机器参与者的行动和反应组成,形成了心理和量化的炖菜。这解释了低信号与噪声比率——换句话说,为什么难以在常规基础上准确预测市场。这些行动和反应也被称为偏见,它们是对某些事件的人类反应的缺陷。

偏见是本节的主角,它们分为两类:

认知偏见

这些偏见源自于知识的缺乏。认知偏见通常涉及基于错误的市场假设或糟糕研究的错误结论。

情绪偏见

这些偏见大多是由感觉驱动并具有冲动性质。它们不是由于教育不足引起的,而是由于缺乏自我控制和自我管理所致。

认知偏见

本小节列出了一些最常见的认知偏见及其市场影响,并提供了如何避免它们的建议:

保守主义偏见

当市场参与者对新信息反应迟缓并对基本比率给予过多重视时,就会出现这种情况。这是一种未适应失败类型。应对这种偏见的方法是强迫自己对基本分析持怀疑态度,并始终保持灵活和随时准备变化。市场不总是像过去那样行动,因为它是前瞻性的。

确认偏见

当交易者专注于有利于其持仓的信息类型并忽视不利于其持仓的信息类型时,就会出现这种情况。这是最常见的偏见之一,实际上是一种随时间导致过度自信的正常心态。解决这种问题的最佳方法是保持公正和中立,虽然这样说起来容易做起来难。另一种方法是通过突出显示所分析的基础资产的吸引力(或不吸引力)的评分卡自动化决策过程。总的来说,人类普遍受到这种偏见的影响,而不仅仅是金融领域。

控制错觉偏见

当交易者高估自己控制交易结果的能力时,就会出现这种情况。这种偏见主要是由于一连串的赢利交易,可能会因对投资资产拥有权力感而导致集中的持仓。市场由大量参与者和数万亿美元的投资组成,因此不太可能受到任何单个人的影响(有少数极少的例外涉及小额和非流动资产)。消除控制错觉的方法是保持专注和谦逊,并理解自己面对的是每天都在变化动态和驱动因素的半随机环境。

事后诸葛亮偏见

这种情况发生在交易者高估他们过去的准确性,并可能导致过度冒险。看过去的图表并得出随后的方向显然是明显的结论是很容易的。大多数反向测试都包含一种事后诸葛亮偏见,因为条件是在分析期末创建的。市场技术分析师在看到过去某些技术运行良好时,往往会高估自己的能力,但未考虑到被测试期间的环境。此外,一些配置在发生时与完成时看起来并不相同。事后诸葛亮偏见可能很难治愈,但最佳方法是考虑到在分析期间存在的变量,以更真实地模拟过去环境。

锚定偏见

这种情况发生在交易员的观点被锚定到某个基准点,并且未能根据新信息进行调整。正如我所提到的,分析师或交易员必须保持动态和开放的心态。治疗这种偏见的最佳方法是随时关注新信息和数据。

心理会计偏见

这种情况发生在交易员因为将资金分配到不同的基金中而给同样金额的钱赋予不同的价值。例如,人们通常会对通过工作赚取的钱和不劳而获得的钱有所不同对待。这是一种认知偏见。治疗这种偏见的最佳方法是在将其分配到不同投资组合时将所有资金视为可互换的。

可得性偏见

这种情况发生在交易员根据能够轻易回忆起的位置选择头寸。这意味着熟悉的资产比不熟悉的资产更具吸引力,这是一个错误的假设,因为机会可能来自任何类型的市场。这是一种心理捷径,交易员在研究中不费多少功夫。要治疗这种偏见,您必须在选择可投资资产的宇宙之前进行全面的尽职调查。不要仅仅因为熟悉就交易 EURUSD:要开阔你的视野。

损失厌恶偏见¹

这种情况发生在失去的痛苦大于赢得的喜悦。这是迄今为止最常见的偏见。众所周知,人类更喜欢不亏钱而不是赚钱,正如丹尼尔·卡尼曼和阿莫斯·特瓦斯基在《前景理论:决策风险分析》(1977 年)中所证明的那样。损失厌恶可能导致减少风险承受能力,因此导致预期收益减少。然而,最重要的影响在于止损水平。厌恶损失的人不愿意接受他们正在亏钱,并且会将亏损的头寸视为持续的头寸,因此更愿意等待直到变得盈利。这是非常危险的,因为在没有止损水平的情况下留下头寸可能会导致灾难性的结果。此外,有些人因害怕后悔而过快地退出盈利头寸(一种后悔恐惧)。处理损失厌恶的最佳方式是自动化风险管理流程,并尊重在交易初始时设定的止损和目标订单。

注意

每当有钱可赚时,非理性就会悄然而至。

情绪偏见

本小节列出了一些最常见的情绪偏见及其影响。需要提醒的是,虽然认知偏见与知识缺乏有关,情绪偏见与心理特征相关:

过度自信偏见

这种情况发生在交易员享受连续获胜并相信这是由于他们卓越的交易能力,从而导致持有集中头寸和过度交易。好的连胜会终结,因此交易员必须始终遵循程序,确保不偏离策略。

后悔规避偏见

这指的是出于恐惧而停留在低风险投资中。这实际上与交易者的风险偏好有关。没有对错答案,但后悔的恐惧可能使交易员错失有趣的机会。你应该冒险赚钱,但只能计算风险。

归属偏见

这发生在交易员认为所拥有的资产比未拥有的更有价值的时候。这可能会阻碍交易者的机会,并导致他们仅限于已经拥有的资产,即使随着时间的推移它们也会衰减。市场无处不在地提供机会,参与者必须时刻保持警惕,以找到下一个大事件。

交易框架

理论交易主题、模拟交易和真实交易各不相同。任何交易员的目标是赚取真实的金钱,而这比看起来要困难。让我们定义这三个概念:

理论交易主题

这是交易员考虑交易策略并在脑海中简化它们的地方。这是偏见形成的地方,特别是事后偏见。

模拟交易

这是交易员使用平台模拟交易的时候。它与真实交易非常相似,但使用的资金并非真实,因此无法模拟真实生活情绪的激动。

真实交易

这时交易员通过实际经纪人使用真实资金买卖资产,以增加财富。

真实交易具有以下时间步骤:

  1. 构思生成:这是战略想法形成的地方。例如,你考虑将镊子模式与特定市场体制中的技术指标结合起来。你已经形成了一个想法,现在你想进行回测,看看它在过去是否表现良好。

  2. 回测:在这个阶段,你评估过去的结果并决定是否将策略投入实战。这可能是最重要的一步,因为它涉及许多因素,如适当的回测实践和验证,以及具备风险管理技术的回测。

  3. 交易前管理:这是你准备交易设置的地方,如止损和止盈订单,并决定是否使用追踪止损。此外,你必须使用本章前讨论的技术之一来确定仓位大小。

  4. 交易管理:这是你监控利润和损失表以及进行中交易的地方,以评估你的情况。在这一步骤中,纪律至关重要,因为你不能让情绪影响你的判断,导致你过早或过晚地结束交易。

这标志着本章的结束,您学到了如何更好地管理交易的各种信息。交易是一场心理游戏,您有责任通过适当的培训克服情绪和认知障碍,以最大化生存机会。

这也标志着蜡烛图案探险的结束。我要感谢你,并祝贺你完成这本书,并花时间理解我的研究和技术。图案,以其所有的威严和复杂性,必须谨慎使用,并与其他技术工具适当结合。正如你在本章中看到的那样,一个交易系统必须包括构思、回测、风险管理和交易管理。

如果你想深入研究技术模式识别,特别是蜡烛图案,请确保从任何配置的理念开始。为什么什么一样重要。Python 是一种非常强大和多功能的编程语言,将为你的研究提供便利。因此,我建议掌握它以加快你的研究进程。

¹ 这也被视为一种情绪偏差。

posted @ 2024-06-17 18:15  绝不原创的飞龙  阅读(7)  评论(0编辑  收藏  举报