Python-卖空算法教程-一-

24 阅读1小时+

Python 卖空算法教程(一)

原文:zh.annas-archive.org/md5/ceefdd89e585c59c20db6a7760dc11f1

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

"没有比一个时机已经成熟的理念更加强大的了。"

– 维克多·雨果

市场参与者总是希望行业变得更加高效:“去除中间人”,“降低成本”,“合理化”。我们终于尝到了我们自己的药。市场长期平均回报率为每年 8%。然而,大约 60%的专业基金经理年复一年地表现不佳。90%的散户投资者都失败了。我们交易的方式显然不起作用。尽管充满了傲慢自大,但金钱的皇帝们却一直在赤裸裸地游行。如果我们想要在这个市场达尔文主义中生存下来,我们就必须共同进化。进化不会留下任何囚犯。

全球变暖是金融服务领域的现实。积极管理的资金冰川正在融化。共同基金面临着来自交易所交易基金降低费用的巨大压力。幸运的是,一直以来我们的眼皮底下就有一个terra incognita,人类从未踏足的未知领域。

如果我们把所有关于投资、交易、市场的书都堆在一起,去月球的旅行将成为一个悲伤的生态现实。然而,如果我们把有关做空交易的书籍一字排开放在餐桌上,那么仍然会有足够的空间放一瓶库特罗蒂酒,一瓶神圣的北罗纳山谷西拉-维奥涅白葡萄酒,和几杯酒。做空交易是提高和维持资产管理规模的关键。当市场暴跌时,仍然站得住的人脱颖而出。资金可能暂时流向(和流出)那些在牛市中表现出色的人,但它将永远倾向于那些在熊市中表现出色的人。投资者可能会忘记不那么出色的回报,但他们不会原谅回撤。

做空交易收取高额费用。假设你在濒临破产的纯做多共同基金中添加了一本做空账面。从那一天起,你就可以收取高额管理费,甚至要求高昂的绩效费用。你将在交易异国情调的工具时享有更多自由,有权保持更高的现金余额,自由选择性地披露你的持仓。而自由的代价就是学会做空。

这本书是为谁而写的

这本书是由一位从业者为从业者撰写的。它适用于高级到专家级的市场参与者。即使你从未在 Python 中编写过一行代码,这本书仍然适合你。它最初是没有源代码的。后来的补充是为了帮助读者在现实生活中实施这些概念。如果你是一个经验丰富的编程人员,但对市场还很新,你将会掌握一些对你的旅程有帮助的概念。然而,你可能希望通过进一步阅读来补充你的市场教育。

即使你选择永远不卖空,本书仍然适合你。为卖空一侧开发的工具和技术是经受住极端条件的。如果你能在卖空一侧的干旱环境中生存,想象一下你将如何在买空一侧蓬勃发展。如果你从事长/短业务,问题不是你是否应该阅读本书。真正的问题是你是否能承受阅读本书的代价。你可能不同意一些观点,但它们会引发思考并引发讨论。我们最初抵制的想法是使我们成长的想法,所以欢迎来到你舒适区之外的空间。

本书涵盖内容

第一部分内部游戏:揭秘卖空

第一章股市游戏,讨论了几个问题:“股市是一门艺术还是一门科学?如果它只是一场游戏呢?你如何赢得一场无限复杂的随机游戏?”本章设定了本书的背景。

第二章关于卖空的 10 个经典谬论,驳斥了有关卖空的持久谬论。最重要的问题是:“你想靠数字还是故事退休?”如果是前者,那么卖空者就是你养老金的最好朋友。

第三章走进狂野的卖空,解释了长期思维方式在卖空上的弧线及其可预测的失败。本章描述了卖空的三个固有挑战:市场动态、稀缺心态和信息不对称。

第二部分外部游戏:打造稳健的交易边缘

第四章长/短方法论:绝对与相对,探讨了创意的生成。在短期内,你能够持续产生与长期相当多,甚至更多的想法。

第五章制度定义,解释了几种制度定义方法,将股票重新分类为看涨、看跌或无法确定的。

第六章交易边缘是一个数字,这就是公式,旨在揭开神秘的、神秘的、神奇的交易边缘。无论是什么资产类别和时间跨度,都只有两种策略。我们解释了每种策略的利弊。

第七章提升您的交易边缘,概述了提高回报分配和构建稳健交易边缘的七种方法。

第八章头寸规模:金钱是在资金管理模块中赚到的,证明了金钱是在资金管理模块中赚到的。我们介绍了一种改变游戏规则的股价曲线交易方法。

第九章风险是一个数字,介绍了四个无愧的衡量稳健性的风险指标。卖空者是出色的风险管理者。

第三部分长/短游戏:打造长/短产品

第十章精细化投资宇宙,解释了一些常见的避坑陷阱,以及投资者希望解决的问题,以帮助将大量股票精简为可投资的范围。这一章为本书的最后部分铺平了道路。

第十一章长/短工具箱,深入探讨了管理长/短组合的四个最重要的杠杆。现在我们知道客户想要什么,我们来看看可用于实现这些目标的工具。

第十二章信号与执行,汇集了前几章涵盖的概念,并讨论了构建长/短投资产品时的信号处理、执行和其他重要组成部分。

第十三章投资组合管理系统,探讨了你武器库中最被低估的工具之一。现在你已经添加了一个相对短的书籍,到目前为止你一直在使用的任何工具都迫切需要进行彻底的升级。本章介绍了在设计自己的投资组合管理系统时会有所帮助的主题。

附录股票筛选,提供了一个股票筛选工具,它将解决市场参与者最为关注的理念生成问题,并允许你将学到的一切付诸实践。

为了充分利用本书

有时我们赢,有时我们学。从本书中获得最大收益的最佳态度是在市场上亏钱。这将使你保持一种开放的思维状态!

对 Python 的中级知识,特别是对numpypandasmatplotlib的使用就足够了。我们还会使用一些非标准的 Python 库;yfinancescipy。此外,还需要具备高中水平的代数和统计知识。

下载示例代码文件

本书的代码包也托管在 GitHub 上,网址为github.com/PacktPublishing/Algorithmic-Short-Selling-with-Python。我们还提供了来自我们丰富书籍和视频目录的其他代码包,可以在github.com/PacktPublishing/下载。快去看看吧!

下载彩色图片

我们还提供了一个 PDF 文件,其中包含本书中使用的屏幕截图/图表的彩色图片。你可以在这里下载:static.packt-cdn.com/downloads/9781801815192_ColorImages.pdf

使用的约定

本书中使用了许多文本约定。

CodeInText:指示文本中的代码词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄。例如:“从rolling_profitsrolling_losses函数中计算profit_ratio。”

一段代码设置如下:

# Import Libraries
import pandas as pd
import numpy as np
import yfinance as yf
%matplotlib inline
import matplotlib.pyplot as plt 

任何命令行输入或输出都如下所示:

3.52 

粗体:表示一个新术语、一个重要词或屏幕上看到的词,例如,在菜单或对话框中,也会在文本中显示为这种格式。例如:“价格是否击败了加权平均价格成交量VWAP)?”

警告或重要说明如下所示。

提示和技巧显示为这种格式。

第一章:股票市场游戏

“无限游戏有无限的时间跨度。因为没有终点线,游戏没有实际结束,所以不存在“赢得”无限游戏的概念。在无限游戏中,目标是保持游戏进行,延续游戏。”

– 西蒙·西尼克

金融服务业正面临严重的存在危机。融资活跃管理资产融化的速度比北极冰盖还要快。进化不留俘虏。如果主动管理者不想成为濒危物种名单上的蓝鳍金枪鱼的一员,那么学会做空可能是一个不可多得的技能,可以加入到他们的武器库中。正如 2007 年至 2008 年全球金融危机向我们展示的那样,市场参与者不仅需要在牛市中实现盈利,而且需要在熊市中实现盈利至关重要。为此,本书将介绍做空的方方面面,并制定算法策略以最大化其有效性,最终目标是创建一个稳健的投资产品,使您与市场竞争对手区分开来。

本章为本书铺平了道路。在你的职业生涯中的某个时刻,你可能会想知道市场更像是一种科学还是一种艺术形式。如果市场是一个永无止境的、无法解决的谜题呢?你如何赢得一个无限、复杂、随机的游戏?

我们将涵盖以下主题:

  • 股票市场是艺术还是科学?

  • 你如何赢得这个复杂、无限、随机的游戏?

  • 玩做空游戏

股票市场是艺术还是科学?

“当银行家们聚餐时,他们谈论艺术。当艺术家们聚餐时,他们谈论钱。”

– 奥斯卡·王尔德

从前,洛伦佐·德·美第奇赞扬米开朗基罗的手工艺品质。伊尔·迪维诺回答伊尔·玛格尼菲科说:“只有那些还没有努力工作到看到工艺的人才会认为它是艺术。”

每个市场参与者都曾想过股票市场更像是一种艺术还是一种科学。艺术背后的假设是天赋的概念。一些人天生就有天赋。有些人没有,我就是其中之一。如果天赋是与生俱来的,那么我们这些凡人只能接受我们根本没有。然而,天赋常常是懒惰的借口。迈克尔·乔丹并不是天才。他曾被踢出篮球队,所以他训练,直到他能够连续命中 100 个罚球为止才会回家。命中了 98 个?哦,不好意思。再来一次。这样,技能就可以被发展。产出可能看起来像是毫不费力的优雅。然而,这需要技艺、努力、毅力,以及安吉拉·达克沃斯称之为“毅力”的东西。

在市场上赚钱不是艺术,而是一种技能。在 80 年代初,理查德·丹尼斯和威廉·艾克哈特组建了一个团队,其中包括一名扑克玩家、一名毒贩和来自各行各业的其他人。他们被赋予了一个系统、起始资金,并被派去交易期货。几十年后,其中一些人仍在交易。他们是有天赋的吗?也许其中一些人有一些先天倾向,但这并不重要。他们研究并努力实施了一个系统,其结果可能看起来像艺术品。

科学家喜欢用明确的公式来解释世界。这种方法对于简单甚至复杂的系统都很有效(通常可以将其分解为几个简单的系统),但对于复杂系统则不适用:

  • 简单系统:你需要多少燃料才能把火箭送到火星?

  • 复杂系统:如何将某人送到火星?(这可以分解成简单的系统,比如燃料消耗。)

  • 复杂系统:如何在火星上维持生命?

市场是复杂的系统。与复杂系统不同,复杂系统不能被分解为一系列简单的系统。当你认为自己有一个明确的公式来解释股价时,市场会适应并变成其他形式。

我要表达的观点是,我们看到的事物并不是它们的本来面目。我们看到的是我们认为它们是的样子。背景信息过滤了我们的感知。如果我们认为某事会很难,那很可能不会容易。

如果我们认为股市是一种艺术,我们会对杰作感到惊叹,但无法欣赏工艺。如果我们把它看作是一门科学,我们将寻找一个明确的公式,却一次又一次地被随机性所愚弄。如果我们把它看作是一场游戏,那么我们内心的孩子会参与其中。

如何赢得这个复杂、无限、随机的游戏?

“已知已知”是我们知道自己知道的东西;而“已知未知”是我们知道自己不知道的东西。但也有“未知未知”,那就是我们不知道自己不知道的东西。

– 唐纳德·拉姆斯菲尔德

股价可能随时间反映基本面,但旅程可能是一次随机行走。随机行走理论由伯顿·马尔基尔在《华尔街的随机漫步》中得到推广。它基本上假设每种金融资产都有一定的内在价值,然而市场价格很难准确预测。随机性经常使市场参与者迷失方向。即使是业内最优秀的人成功的概率也大约是 50%,唯一的结论是无法消除随机性。

有两种类型的游戏:有限和无限。有限游戏有明确的规则、参与者、开始、中间和结束。无限游戏没有一套规则、没有开始和结束。有限游戏的目标是赢得游戏。无限游戏的目标是留在游戏中。

让我们举个例子来说明这一点。一名职业扑克玩家遇到了一名职业交易者。交易者整晚都在打高风险的牌并赢得了比赛。第二天,扑克玩家买了交易者推荐的一只股票。两周后,交易者停止了交易,而赌徒却忘记了这件事,并在接下来的 3 年里把钱翻了一番。对于交易者来说,扑克是一种爱好,他赢得了扑克夜,因为他知道自己能承受更多的风险。与此同时,扑克玩家采取了有计划的风险。他接受了短期损失作为赢得长期游戏的一部分。当扑克玩家遵循投资提示时,他将其经历了起起落落,因为他只是使用了可支配的资产。另一方面,当交易者关闭同样的股票并错过随后的涨势时,他正在执行风险管理。

对于交易者来说,扑克夜是一个有限的游戏。另一方面,对于扑克玩家来说,股票提示是一个有限的游戏。他们在彼此的游戏中都可以承受更高的风险容忍度,因为他们知道游戏是有限的。然而,当游戏从爱好变成生活方式时,我们变得更加风险厌恶。

畅销书系列《市场魔法师》的作者杰克·施瓦格经常说,没有一个理智的人会买一本外科手术的书,周末读完,然后相信自己周一就能准备好给人动手术。然而,人们会买投资书籍,订阅一两份通讯,然后认为在周一开始交易是完全合理的。这可能对于有着非常小样本的业余爱好者有效。毕竟,有一半的机会是赢的。对业余爱好者有利的随机性对于有着更大样本的专业人士来说是有害的。当一个爱好变成工作时,游戏就变得无穷了。赌徒可能已经为每年几个糟糕的扑克夜预算好了。同样地,交易者遵循严格的风险管理政策。扑克玩家和顶尖交易者有一个共同点:他们都去工作;这不应该是有趣的。

这引出了本书的核心问题:你如何打败一个无穷复杂的随机游戏?

如何赢得无穷的游戏?

如果你参与了一个无穷游戏,你不是通过赢得一个游戏或所有游戏来取胜。你是通过留在游戏中来取胜。你赢了一些,输了一些,但只要你的平均胜率乘以你的胜率大于你的平均损失乘以你的损失率,你就能留在游戏中。只要你的盈利期望保持正值,你就能赢。作为一名股票选择者、交易者、投资者、投机者,或者无论你选择称呼自己为什么,你的工作就是最大化这个盈利期望。这部分是你挑选的所有股票中,你保留的那些股票必须看起来不错的部分,其结果最终可能看起来像艺术品。这就是我们将在第二部分外部游戏:发展健壮的交易优势中努力的内容,所以继续阅读吧,米开朗基罗。

如何打败复杂性?

当面对一个复杂问题时,我们直觉上认为解决方案必须复杂化。并非总是如此。一个快速抛射物的轨迹是火箭科学,确实如此。现在,你上一次看到塞雷娜·威廉姆斯在球场边解决随机方程式是什么时候?这就是所谓的凝视启发式:看,跑,拦截,重复。复杂的问题有简单的解决方案。

许多量化交易者,亲切地称为量化交易员,认为他们必须用费解的方程式证明他们的博士学位。通过数学恐吓来证明无疑会激发自尊心,但高智商并不总是与高绩效相称。股市是诺贝尔奖获得者走来受挫的地方。

另一方面,似乎有一个简单的启发式法则就隐藏在明处,它击败了市场的复杂性。这个简单的口号是:“止损,放大赢家。” 第二部分外部游戏:发展稳健的交易优势,将提供减少输家的负面影响的实用技术。

如何击败随机性?

作为一个物种,我们的生存取决于我们如何处理随机性。我们在日常生活中本能地应用的同样生存机制并不转移到市场中。理解随机性对于培养健康的卖空实践至关重要。首先,让我们看看我们如何在市场中处理随机性。其次,让我们看看我们如何在现实生活中处理随机性。第三,我们将看到如何将这种技能应用到市场中。

假设我们设计一个挑选股票的系统。当我们构建策略时,我们从一些假设开始。如果股票符合某些预期[在此插入一长串标准...],我们就做多或做空。在理论上,高估值,远远超出合理市场预期的股票将恢复到“公平”,公平估值是一些市场参与者愿意为他们所感知的价值支付的价格。在理论上,糟糕的企业有望破产。在理论上,超买的股票有望回归到平均水平,超卖问题则相反。在理论上,这应该奏效。现在,是时候尝试这个想法了。随机性可以总结在下面的结果矩阵中:

图 1.1:比喻矩阵结果

真正的阳性是指结果符合预期的情况。真正的阴性是指股票未能通过我们的测试,并且如预期的那样表现糟糕。这是理论与现实的第一次交锋。在理论上,市场是有效的:所有公开可用的信息应该立即反映在价格中。但在实践中,情况并非总是如此。

回到起点,当结果不符合期望时(例如,股票通过了我们的测试但在实践中却失败了),存在假阳性,这表明我们遗漏了某些东西。在实践中,估值可以变得更加丰厚并且维持时间更长,而客户却不会一直投资。在实践中,超买和超卖的技术指标是持续强势和弱势的迹象,分别表示趋势的延续而不是回归到平均水平。我们感到困惑和沮丧。我们的自然倾向是完善我们的论点,增加复杂性以减少假阳性。这种方法会产生更少的信号,但假阳性并没有完全消失。

对于中级超卖的短线卖空者来说,过度过滤的一个副作用和经典陷阱是假阴性。这是指股票表现出期望的行为,但由于我们更严格的测试而完全未被发现。现实生活中的类比是通过清单约会。有时人们带着一长串不可实现的标准和不切实际的期望出现。同样,市场参与者经常因为他们自己的自我限制信念系统而拒绝足够好的想法。他们实质上是在寻求他们的选择将如预期般执行的保证,通过应用多余的过滤器,但他们没有意识到其中一些条件是互斥的或不切实际的。因此,他们系统性地定价自己脱离市场,并错过了所有完全正常的机会。这解释了图 1.1中假阴性圈的膨胀大小。

结构/拥挤的空头是过度过滤的典型例子。他们勾选所有的坏项目,除了显而易见的交易很少盈利。相反,高股息率价值陷阱是假阴性或盲点的典型例子。这些股票具有便宜的估值和股息支持。它们不参与牛市。在长期的熊市中,它们也不能提供足够的支持。它们是慢燃的表现不佳者,被排除在被遗忘的问题的炼狱之外。最重要的是,尽管我们尽了最大努力,一些股票仍然无法盈利,无论是在空头还是多头方面。这比我们最初想象的要复杂得多。更多的困惑。又回到起点。

在继续使用清单约会场景的情况下,战胜随机性的一种方法如下。在纸上,一个人勾选所有项目。实际上,大红旗出现了:那个人不笑你的笑话,讨厌西兰花,顽固地拒绝与你的金鱼辩论康德的《纯粹理性批判》——所有经典重要的事情。

在现实生活中,你要处理这种看似随机的反应就像中止任务一样。你不会等到结婚并带着一对孩子,一个死掉的金鱼在鱼缸里,冰箱里堆满了蔬菜才决定分手。市场也是一样。一只股票可能符合所有标准,但可能会出现一些意外或被忽视的情况,你会选择退出。当我们将所有精力都集中在选股上时,我们试图用确定性解决随机性。下次努力选择正确的股票并不能解决随机性。完美主义是一种拖延症。处理随机性的唯一方法是接受我们的错误。我们失败得越快,我们就能越快地前进。

让我们通过一个实际的例子来说明这个概念。我们都可以同意,相对于指数表现不佳的股票已经达到了顶峰。在达到顶峰的群体中,有 100% 的未来表现不佳者(这将是我们空头卖出的主要目标),还有一些股票将会徘徊不前,直到再次趋势。没有简单的方法来区分前者和后者。然而,有一些简单的技巧来处理"吃白食"者。击败随机性的方法不是试图成为一个更好的选股人。击败随机性的方法是接受在某个时候,你会选到失败者,并学会如何处理他们。人们看到所有那些在市场上表现出色的人只是因为他们在选股时做出了正确的选择。他们没有看到那些在这条道路上被丢弃的不那么赚钱的选择。我们的看法是颠倒的。我们希望在比赛之前就获得奖牌。伟大的选股人应该根据他们选择留下来的东西来评判,而不是根据他们在这条路上丢弃的不那么赚钱的选择。

玩空头卖出游戏

"跟我来如果你想活下去。"

– 阿诺德·施瓦辛格,终结者

空头卖出的机制看似简单。例如,你以 100 的价格卖出一只股票,以 90 的价格买回,然后获得 10 的利润。它可以绝对或相对于一个基准。在进行空头交易之前只需要进行一个额外的步骤。空头卖家出售他们没有拥有的股票。因此,他们首先从他们的经纪公司的股票借贷台借出这些股票。一旦他们买回股票并平仓,他们就会归还这些股票。

不要让这种简单性愚弄你。由于我们在本章中考虑的游戏的无限,复杂,随机性质,90% 的市场参与者失败。剩下的 10% 中,不到一半的人会参与空头卖出。这是市场的毫不妥协的现实。

我们的目标是应对这些挑战,并在投资组合的两侧取得成功,尽管情况复杂。如果我们跟随大多数人走的路,我们最终会得到相同的结果,减去一个标准差以作良好的衡量。

如果几乎所有人都在宽容丰富的长端失败,那么为了你在无情的干旱短端生存,这本书必须有意地与众不同。这本书将带你走上一条少有人走的道路。你可能会对其中的某些部分持有异议,但你会以改变的方式走出来。例如,和你之前的所有人一样,你会得出结论,挑选个股是破产的。你也会亲眼看到投资过程中究竟在哪里创造了财富。

摘要

在本章中,我们为本书的其余部分设定了背景。股票市场既不是艺术形式,也不是科学。市场巫师既不是天生的,也不需要极度聪明。他们是在逆境的熔炉中锻造出来的。股票市场是一个无限、复杂、随机的游戏。赢得这场游戏的唯一方法是留在其中,通过调整你的策略以适应市场的无限、复杂和随机的特性,并相应地挑选股票和削减损失。在接下来的章节中,我们将考虑如何将卖空纳入你的交易策略,并实施技术以提高你的成功率和盈利预期。

市场参与者通常比买入持仓更不愿意卖空。这归因于一些技术因素,也因为人们对卖空的普遍恐惧,这种恐惧是由与卖空相关的许多神话所传播的。我们将在下一章讨论并驳斥这些神话。

第二章:10 个关于卖空的经典神话

自从 1975 年的电影 《大白鲨》,每当我们进入水中,我们都会对游弋在水下的生物有一种本能的恐惧。鲨鱼是无与伦比的杀戮机器。它们拥有比最先进的声纳还要好的检测系统。它们比快艇游得更快。它们有三排锋利的牙齿,不断地再生。然而,你是否知道在你舒适的家中的某个阴暗处,有着比任何大白鲨都要致命一千倍的东西?平均每年有 80 次鲨鱼袭击,大多数是探索性咬和误认身份。与此同时,从床上摔下来的概率要大得多。鲨鱼是雄伟的生物。如果它们想要我们死,我们早就死了。显然,它们不喜欢垃圾食品。

卖空者就像鲨鱼,稍微不那么雄伟,但仍然被误解得很厉害,而且并没有你想象中那么致命。当你的同行,在被认为是最受鄙视的行业中,一提到你的职业仍然会欣然拿起草叉时,你知道自己有点名声不佳。在这一章中,我们将揭穿围绕卖空的 10 个最持久的神话:

  • 神话 #1:卖空者毁掉养老金

  • 神话 #2:卖空者毁掉公司

  • 神话 #3:卖空者毁掉价值

  • 神话 #4:卖空者是邪恶的投机者

  • 神话 #5:卖空有无限的损失潜力,但有限的利润潜力

  • 神话 #6:卖空增加风险

  • 神话 #7:卖空增加市场波动性

  • 神话 #8:卖空导致股价崩溃

  • 神话 #9:在牛市中,卖空是不必要的

  • 神话 #10:"结构性卖空" 的神话

神话 #1:卖空者毁掉养老金

"你信仰上帝吗,雪菲先生?"

"我相信合理的回报率。"

– 《007: 皇家赌场》,詹姆斯·邦德

在 2008 年的大金融危机GFC)中,许多有影响力的人物鼓励市场参与者购买股票以“支撑市场”。他们声称这是“爱国主义的行为”。我成长于一个时代,在那个时代,爱国者是无私的个人,他们冒着生命危险,以便他人有一个更美好的未来。在华尔街某处,一个爱国者变成了一个将其他人的钱置于风险中,以保证年终奖金和自我膨胀的人。

在 2008 年的 GFC 中,卖空者并没有摧毁任何人的养老金,因为一个简单的原因:养老金基金并没有分配给卖空者。他们也没有造成 GFC。卖空者没有证券化有毒债务或导致房地产市场泡沫,也不负责其崩溃。他们的罪行是做好功课,选择另一边,并从这场惨败中获利。

交易员只做两件事。他们要么赚钱,要么找借口。当他们赚钱时,业绩说明一切。当他们没有赚钱时,他们会找借口。短头卖者是完美的替罪羊。最激烈批评短头卖者的人并不完全是基金管理的贵族。

此外,长期来看,将短头卖者归咎于自己的不幸可能会适得其反。你可以以两种方式过你的生活:作为英雄或作为受害者。英雄会承担责任,迎接挑战,并战胜逆境。受害者会责怪他人的失败。将短头卖者归咎于“爱国者”选择了受害者的道路。下次资产配置者决定他们的配置时,你认为他们更愿意分配给谁:英雄还是受害者?

现在,做空者真的会摧毁养老金吗?关于你自己的养老金最重要的问题是:“我是想靠故事退休,还是想靠数字退休?”在你退休的第二天,什么对你更重要:所有那些激动人心的投资主题还是你银行账户里的余额?

如果你认为它们是同一回事,那么继续翻腾,等待握手和金表,或者从线上经理那里得到一次改变人生的谈话。然而,如果你选择以数字退休,那么让我们来看看数字。

与主动投资和被动投资辩论相比,没有什么比“故事与数字”二分法更能说明问题。主动管理指的是基金经理将押注从基准中抽走的做法,这被称为主动资金。被动投资是指通过模仿指数来最小化跟踪误差。主动管理者声称他们的选股能力和投资组合管理技能可以提供优异的回报。然而,数字讲述了一个不同的故事。根据标普的《指数对比主动》报告,在 1 年、3 年和 5 年的时间跨度上,绝大多数主动管理者的表现都不如标普 500 指数基准。这意味着他们的累积复合回报低于基准。交易所交易基金,或ETFs,在每年的记录中表现比主动管理者更好,甚至在最严重的市场下跌期间也是如此。

关于主动管理者表现与基准比较的更详细报告可以通过标普的 SPIVA 报告获得:www.spglobal.com/spdji/en/spiva/#/reports/regions

事实就在眼前。现在证明的责任不再在于 ETFs,而在于主动管理者能否证明他们能够比指数提供更多的回报。辩论逐渐从“我们应该分配给哪个经理?”转向了“提醒我为什么我们应该选择一个昂贵的、表现不佳的基准追踪者,而不是选择一种流动性更好、更好、更便宜的替代品?”

不幸的是,还有更多。偏离基准的惩罚是严重的。如果管理者偏离并表现出色,他们被称为“股票选择者”。然而,当他们偏离并表现不佳时,他们被称为“跟踪误差高”。这经常导致赎回,对于基金经理来说是死亡之吻。当选择是成为英雄还是保住你的工作时,自我保全促使主动管理者模仿基准,这种做法被称为暗中跟踪指数。这就是著名的“没有人因持有[插入大型安全蓝筹股票名称……]而被解雇”的说法。如果主动管理者最终效仿其基准,那么“主动与被动”之争就是一个错误的名称。这实际上是在低成本指数基金与通过自我保全的主动管理者进行昂贵的暗中跟踪之间做出选择。无论哪种方式,你都会得到同样的指数,但是对于后者,你还必须支付一个中间人,即主动管理者。正如 Vanguard 的创始人约翰·博格尔曾经说过的:“在投资中,你得不到你不付钱的东西”。

这并不意味着主动管理应该死得无声无息。有些杰出的主动管理者确实物有所值。这仅仅意味着普通的主动共同基金经理给主动管理抹了黑。选择主动管理的投资者不仅承担股权风险溢价,还承担主动管理风险溢价。当前主动管理的危机只不过是每个行业中那些意识到自己再也不能拖延效率的中间人的一贯做法。

接下来,让我们看看熊市时会发生什么。市场的平均回报率在 6.3%到 8%之间。一个世纪的复利回报是天文数字。所以理论上来说,你应该长期投资。再向那些在 2001 年和 2009 年退休的人群解释一遍。在一个十年内市场曾两次下跌 50%。当对“太大而无法失败”和“杠杆过度”的回应是使它们变得更大、超级杠杆,并将同样的人放回金融危机时期的位置时,可以放心地说市场肯定会再次陷入“困境”。在熊市期间,仅持有多头头寸的主动管理者可能会展现出英勇的风采,但是当你的净资产下降了 50%时,1 或 2%的超额表现就成了一个舍入误差。十年内两次双黑坡,每个人都想要熊市保险:“熊市期间我应该买什么?”

让我们重新审视这个问题。想象有人走到你面前问:“市场正在牛市,我应该卖空什么?”停顿一秒,然后考虑一下你的反应。如果在牛市卖空毫无意义,那么为什么在熊市买入任何东西呢?没有什么安全的资产类别会神奇地上涨。在熊市唯一上涨的是相关性。一旦“掉落的刀片”的雨停下来,就会有充足的时间以白菜价购买。

在熊市中,唯一能够保证合理回报率的市场参与者是那些与指数呈负相关的人。这些人就是卖空者。你不必喜欢他们。甚至在牛市期间你也不必继续投资于他们。与其他任何市场参与者相比,他们更了解资金流入和赎回的周期性。如果你选择依靠数字退休,那么你应该考虑将资金配置给卖空者。

这给我们带来了一个违反直觉的结论。如果你选择依靠数字而不是故事退休,那么被动投资是长期的正确选择。为了在经济下行期间保护资本和创造超额收益,投资者需要将资金配置给卖空者。在主动管理领域,能够为你的养老金提供合理回报率的唯一市场参与者就是卖空者。

另一个对从业者而言违反直觉的结论是进化。主动型基金经理面临前所未有的生存危机。如果他们想要生存下去,就需要进化、适应并获得新的技能。卖空可能会是一项罕见的技能,非常适合决心保持相关性的市场参与者。

神话 #2:卖空者毁掉公司

“把通常的嫌疑犯聚集起来。”

– 《卡萨布兰卡》中的雷诺船长

当 2007 年房地产泡沫破裂时,雷曼兄弟的风险委员会和董事会中的卖空者在做什么?什么也没做。他们严格地什么都没做来防止或纠正这种情况,因为他们中没有人曾经在这些委员会上任职。在资本主义的历史上,没有任何一位卖空者曾经在他们卖空的公司的董事会上任职过。

我们可以同意,基本面在长期内推动股价。驱动力是管理的质量。马克·扎克伯格是 Facebook 背后的天才。沃伦·巴菲特将一家名叫伯克希尔哈撒韦的濒临倒闭的纺织公司转变为一个工业企业集团。杰夫·贝索斯创建了亚马逊。史蒂夫·乔布斯 2.0 是苹果复兴的建筑师。如果高层管理人员如此渴望为成功负责,那么他们也应该对失败负责。史蒂夫·乔布斯 1.0 将苹果搞垮了。凯·惠特莫尔埋葬了柯达。对于贝尔斯登、雷曼兄弟、美林和 AIG 的责任完全落在那些掌舵者的肩上。做空者并没有做出摧毁这些公司的任何错误决定。糟糕的管理会做出糟糕的决定,导致糟糕的结果,就像良好的管理会做出良好的决定,导致良好的结果一样。

没有人比史蒂夫·乔布斯在他 1995 年的《失落采访》中更好地捕捉到公司最高层发生的事情。他提到了在庄严的机构的高层管理之间的“群体思维”有时会导致一种认知偏差,称为邓宁-克鲁格效应。以柯达为例,曾经是一个标志性品牌。管理层相信他们在游戏中处于领先地位,他们可以无限期地推迟创新。当世界在前进时,他们退回到了他们的老核心技术。尽管当时很悲惨,但今天在柯达的坟墓上没有鲜花。世界,甚至被裁员的 5 万柯达员工,都已经继续前进。如今,柯达成为管理层拒绝创新的失败案例。

高层管理者喜欢围绕自己与 bozocrats、非威胁性的顺从“是人”,他们的唯一目的是向上层阶级保证他们的聪明才智,加强了对不可推翻性的致命信仰。异议被压制。创新,被标记为自相残杀,迅速被埋葬在柯达创新的石棺中。

高层管理者对自己的聪明才智如此着迷,以至于他们甚至没有意识到自己已经脱离了现实。给定足够的时间,他们过时的产品会从内部摧毁他们自己。做空者只是简单地乘着傲慢一路走向尘封的终点。

资本主义的历史就是进化的故事。在第一次世界大战期间,主要的交通方式是马匹。在第二次世界大战的第一天,世界惊恐地醒来,看到德国装甲师正在剿灭波兰骑兵。残酷的教训是进化不会留下俘虏。在两次世界大战之间的数百家汽车制造商中,只出现了少数赢家。其余的行业都倒闭了。对于每个赢家,都有无数的输家。今天,每个人都对在中央公园附近跑马车感到非常满意,但没有人为已经消亡的马车工业流泪。每个人都忘记了所有那些小汽车制造商的名字。世界已经继续前进。

我们经常把标普 500 指数看作是这个具有企业名望和权力的整体殿堂,但我们忘记了自从该指数于 1957 年成立以来,只有 86 家原始的 500 家成分公司仍在指数中。其他 414 家要么破产了,要么被并入了更大的公司。Radio Shack 并不是因为卖空者而破产的。它破产是因为无法适应亚马逊和百思买等竞争对手的竞争。卖空者不会摧毁公司。他们只是在不可阻挡的演变过程中护送过时的东西离开。

神话#3:卖空者摧毁价值

"价格是你付出的,价值是你得到的。"

– 沃伦·巴菲特

市场评论员喜欢在股价暴跌时给价值毁灭贴上一个美元的标签。2018 年 7 月 26 日,扎克伯格先生的净资产缩水了 120 亿美元。由于卖空者有望从跌价中获利,他们因附带关系而被指控破坏价值。例如,乔治·索罗斯经常与 1995 年英镑贬值联系在一起。一个人如何能独自拉低地球上最富有国家之一的货币?他大胆押注于英格兰银行不可持续的立场。

这的核心是对内在价值和市场价值的混淆。一个是价值,另一个是估值。内在价值是公司通过产品和服务销售创造的净财富。市场价值是市场参与者愿意支付的价格。市场价值和内在价值生活在很少交汇的平行宇宙中。一个是辛勤的工作。另一个是传说中的凯恩斯式选美大赛。最终结果是股东不会创造比卖空者摧毁的价值更多的价值。

神话#4:卖空者是邪恶的投机者

"我很温柔,我很可爱。但我真正想做的是伸手进去,把他们的心撕出来,在他们死之前吃掉。"

– 坠入神坛的天使,关于卖空者的话

人们经常忘记,当史蒂夫·乔布斯重回舵手时,这个标志性的标志再次被放在了杂志封面上。亚马逊并不总是华尔街的宠儿。现在被认为是有远见的管理,很长一段时间都被认为是对股东的顽固不尊重。

当高管抱怨卖空者及其代理传播的恶毒谣言时,他们忘记了史蒂夫·乔布斯和杰夫·贝佐斯多年来不得不忍受同样的恶毒。他们提出了对抗卖空者的最佳解药。制造畅销产品,妥善管理公司,卖空者就会消失。今天,没有卖空者会对苹果出手。给所有 CEO 的忠告,对抗卖空者的疫苗是:将公司的利益、员工、客户、环境、股东和管理层的利益排在首位,一切都会好起来。

如果你的方法是从研发、客户服务中挖空资源,随机“重组”人员,并将组织图扁平化,从事激进的会计实践,并为董事会投票支持荒谬的股票期权计划,吞并无用的收购,并且,最重要的是,为股票回购计划提供资金,那么,终有一天,彩虹的另一边将有一锅黄金可供做空者分享。

2007 年,量化研究全球负责人马修·罗斯曼发表了一份关于量化交易员灭亡的说明,这篇说明后来成为雷曼兄弟历史上流传最广的研究成果。随着做空者与雷曼之间的斗争升级,他向高管展示了一份欧文·拉蒙特的白皮书,标题为Go Down Fighting: Short Sellers vs. Firms。理查德·富尔德并不感到高兴。他责怪做空者散布恶意谣言,导致了雷曼的股价下跌。十年后,尘埃落定。关于全球金融危机和银行家傲慢的其他文章都以理查德·富尔德在众议院委员会作证的图片为插图。成为全球金融危机的标志性人物是一种粗暴的历史方式,即使是按照冷酷的投资银行家的标准。我为富尔德先生感到难过...

欧文·A·拉蒙特的Go Down Fighting论文可以在此处的Oxford Academic上完整访问:academic.oup.com/raps/article/2/1/1/1563177

但是,如果导致公司、市场和货币崩溃的仅仅是口臭、多彩的语言和相对于总体浮动的小头寸,那么对资本主义的信心应该加入大白鲨和北极熊的濒危物种名单。做空者的国家运动是揭示企业时空连续体中的悖论。无知和能力不能同时存在于同一地方。基本上,如果你不知道发生了什么,就不能假装知道自己在做什么。奇怪的是,这是被困扰的首席执行官希望我们相信的谎言。每当他们被问及下属的非法活动时,他们的首要防线就是装作愤怒,把他们扔到贝宁哲·巴尔斯下面,假装他们不知道一些孤立的流氓个体所犯的非法行为。这是值得赞扬的,除了全世界的每个人都知道钱不是长在树上的。金钱留下踪迹。奖金不是慈善捐款。

此外,公司规模也不是一个有效的借口。例如,战争是肮脏的生意。将军们常常远离作战地域。然而,这并不意味着他们的最低级士兵可以肆意抢劫和掠夺而不受惩罚。所以,当 CEO 声称他们不知道下属所犯的欺诈行为时,要么他们是故意视而不见,因此参与了掩盖,要么他们真的不知道发生了什么,因此无能。无论哪种情况,他们都不适合担任职务,也不配得到他们的报酬计划。这解释了为什么每当卖空者揭露不端行为时,高层管理人员都会采取进攻性行动,并将卖空者描绘成传播恶意未经证实谣言的邪恶投机者。没有什么可担心的公司可能不会开心,但他们很少在卖空者身上浪费时间进行法律诉讼。

卖空者就是市场上的蝉。从来没有人因为蝉声宣告夏日结束而责怪过蝉。当卖空者出现时,这可能预示着好时光的结束。他们不只是空谈。他们言出必行。如果有人愿意冒资本风险,持有者最起码应该重新审视他们的看涨立场。卖空者经常被指责散布恶毒谣言并从下跌中获利。公司会请买入评级的分析师吃饭,却将卖空者告上法庭。因此,卖空者必须对他们的事实和措辞小心谨慎。其次,监管机构不会善待卖空者在养老基金的大额持股上的卖空行为。它们定期接受审计。合规是一种生存机制。如果你的商业模式是通过散布谣言操纵股价并据此交易,那么放下这本书去买咖啡杯,因为“联邦人”即将在你的会议室设立基地营地。

“如果我们在与罗马人的下一场战斗中获胜,我们将彻底毁灭。”

– 普鲁塔克关于皮尔胡斯

给卖空者的一句警告。卖空是行业中不成熟而脆弱的一环。一方面,卖空者希望得到他们为市场带来的价值的认可。用 James Surowiecki 的话来说,他们平衡了“华尔街固有的看涨偏见”,并发挥了“揭露不端行为的关键作用”。卖空者也希望得到公平对待,就像任何其他市场参与者一样。

上述引述摘自 James Surowiecki 于 2015 年在《纽约客》发表的一篇文章,链接如下:www.newyorker.com/magazine/2015/03/23/in-praise-of-short-sellers

然而,另一方面,空头卖家之所以被视为敌人,是有充分理由的。播放商业广告或赞助纪录片揭露公司的欺诈行为以及他们的管理人员是一把双刃剑。每次成功的行动都在公司、监管机构和公众之间积聚了怨恨。每一次短期的皮耶里克小冲突的胜利都使长期的胜利更加难以实现。许多司法管辖区仍然禁止空头卖出。允许空头卖出的那些地方有繁琐的行政规定,例如上涨规则,交易前必须确保“借入”股票。上涨规则规定,空头卖出只能在交易价格上涨后进行。

尊重永远不是理所当然的,而是始终需要赢得的。只要空头卖家采取肮脏手段,他们就应该被同等鄙视对待。最有力的激励可能是投资者的态度。空头卖家拥有如此硫磺般的声誉,以至于许多投资者将简单地拒绝向空头卖家分配资金。

本书的前提是,空头卖出不必是冲突的。请对高级管理人员友善。不要提醒他们已经过时。时间和市场已经够残酷了。中间地带就是说你在相对基准的表现不佳的股票上空头。寻找相对空头并不会激怒公司,事实上恰恰相反。硅谷的每位初创企业家都知道市场只有两个季节,牛市和熊市。牛市是 A 轮和 IPO 的季节。熊市是“回到为人工作”的季节。防御性行业的高管,如食品或公用事业,不指望他们的股票在牛市中成为首选资产。事实上,他们可能会撤销给那些在牛市中大举购买他们股票的经理的养老金授权,除非你是沃伦·巴菲特并且你与可口可乐交谈。

神话 #5:空头卖出的损失潜力无限,但利润潜力有限

"直到教训消失,一切都不算失去。"

– 特蕾莎修女

股价可能会多次上涨,但只能下跌 100%。因此,空头卖家使自己面临无限的损失和有限的利润。每位基金经理都有一个不那么秘密的梦想,那就是把自己的名字传承下去。只是坐着看着自己的空头多次上涨的“经理”应该让这个梦想成真。他们有资格在一个公共厕所的底部得到他们的名字的权利... 没有什么借口可以为糟糕的风险管理辩解。

另一方面,让我们来认识一下乔·坎贝尔(Joe Campbell),一个年轻有活力的企业家,业余时间是投资者。 2015 年 11 月 18 日,他以平均每股2的价格把卡罗比奥斯(Kalobios,简称KBIO)做空,总市值为2 的价格把卡罗比奥斯(Kalobios,简称 KBIO)做空,总市值为33,000。 之后出现了制药巨头马丁·施克雷利(Martin Shkreli)拥有卡罗比奥斯 50%股权的消息。 市场闭市后,股价飙升了 800%。 借贷一夜之间消失了。 无法满足保证金要求,不幸的空头卖家在 GoFundMe 上发起了众筹活动,希望得到其他交易者的同情,但却面临着市场参与者“复仇交易”和恶毒评论的双重打击。 我对坎贝尔先生表示同情,愿他的故事至少能成为渴望做空者的一则教训:

  • 低价股是旅游陷阱。 游客不关心借贷的质量。 他们对故事感到兴奋。 当召回发生时,他们争相定位。 当没有借贷可用时,他们被迫平仓,最终演变成了空头挤压。

  • 低价股是二元事件。 要么它们归零,要么有公司行动,股价飙升。 低价股是高风险、低回报的交易。 在挑战布鲁斯·李之前,先在你的黑带上多积累一些经验。 90%的市场参与者是无法盈利的。 剩下的 10%中,大多数人仍然不做空。

如果坎贝尔先生感到慰藉,那么对于施药者来说,他已经成为一名被定罪的重罪犯。

神话#6:做空增加了风险

“事实并不因为被忽略而停止存在。”

– 奥尔德斯·赫胥黎

做空是有风险的。 然而,不知道如何做空的风险要高得多。 当市场参与者选择不学习这门手艺时,并非他们不愿冒险。 他们保守到寻求风险的程度。 把它想象成紧急演练。 拒绝练习演练并不会让火灾、海啸或地震的风险消失。 人们选择在罕见但危及生命的事件发生时毫无准备地过日子。 成为市场参与者不仅仅是买进并期待顺利。 事情可能会变得艰难,而且将会变得艰难。

在潜意识水平上,每个市场参与者都对即将到来的熊市心存恐惧。 他们知道他们会失去一些收益。 他们的最佳情况是在熊市来临之前卖出并等待。 这有时会促使他们过早卖出并错过大的波动。 正如彼得·林奇所说:“投资者为了纠正或预测纠正而准备所失去的钱比纠正本身失去的钱要多得多。”

由于任何学术研究都无法说明这一点,让我们内省一下,玩一个游戏。拿两张纸,画两栏。在第一张纸上,写下你对熊市的恐惧。你的收益、投资组合、净值和工作会发生什么?你如何准备?具体说明它何时以及如何在你的日常工作中显现。例如,你是否经常检查市场?你是否扫描新闻以寻找潜在的熊市催化剂?你是否过于保守还是认为可以冒险?

接下来,想象一下你对在熊市中赚钱的能力非常淡定,以至于随便说:“牛市。熊市。它们都尝起来像鸡。”你会做些什么不同?你会持有头寸更长时间吗?你会调整头寸大小吗?你会一直检查新闻吗?将所有的感受写在第二张纸上。完成后,拿起第一张纸,逐个解决右栏中的所有恐惧。你的恐惧中大约有一半是情绪吸血鬼,它们会消耗你的能量。在逻辑审查的光下,它们会消散。

在内心深处,我们都知道,无法做空比根本不做空更加危险,因为它使你能够从牛市和熊市中获利。

神话#7:做空增加了市场波动性

2008 年,银行高管们站在他们办公室的窗台上凝视深渊。银行业游说团迅速走向华盛顿,要求暂停做空交易。作为回应,美国证券交易委员会(SEC)在该国暂时禁止了做空交易,以“恢复市场平衡”。这一禁令后来被解除。在尘埃落定后,对做空交易禁令的影响进行了一些分析,美联储发布了一份报告,其中他们得出结论,做空实际上减少了波动性。

在被称为股票市场的拳击场上,美联储不会每天都站在做空者一边。毫不拖泥带水,看看他们报告的开篇段落:

“为了应对 2008 年秋季金融股价格的急剧下跌,一些国家的监管机构禁止了特定股票和行业的做空交易。证据表明,这些禁令几乎没有阻止股价下跌,但显著增加了流动性的成本。2011 年 8 月,美国市场经历了一次大幅下跌,当时标准普尔宣布降低了美国债务的评级。我们的横断面测试表明,股价下跌并不是由做空交易显著推动或放大的。做空似乎并不是最近股市下跌的根本原因。此外,禁止做空似乎不能阻止股价在特定公司或全球经济基本面疲软时下跌,并可能对市场参与者施加高昂的成本。”

报告标题如下:《纽约联邦储备银行,市场下跌:禁止做空的成果是什么?,罗伯特·巴塔利奥,哈米德·梅赫兰,保罗·舒尔茨,第 18 卷,第 5 号,2012 年。

市场参与者做空有各种各样的原因。期权交易员、可转债经理和指数跟踪者需要对其头寸进行对冲。无法做空会减少流动性和金融产品的供应。对做空的限制因此是市场不成熟的标志。

神话#8:做空会导致股价崩溃

做空者根本没有足够的火力来击垮股价。做空者需要借股才能卖空。这些股份来自愿意将部分持股借给股票贷款部门的股东。借股可用性通常平均不到流通股的 10%,换句话说,是公共投资者可用的股份部分。这意味着做空者只代表了整体卖出量的一部分。

做空者的 BB 枪可能会对市场产生短期影响,但真正的伤害是由机构投资者卖出的重型火炮造成的。这让我们对做空有了一个有趣的看法。在空头上赚钱不是关于发现潜在下跌的股票。这是关于乘坐机构投资者清仓的尾巴。

神话#9:牛市中不需要做空

“修补屋顶的最佳时机是在太阳照耀的时候。”

– 约翰·F·肯尼迪

一些市场参与者不想在牛市中做空。他们对“好的做空想法”的稀缺感到惋惜。此外,他们不想通过做空股票浪费宝贵的α值来追赶竞争对手。他们拖延着磨刀霍霍,直到生锈为止。

没有牛市曾经提高过任何人的智商。市场参与者在牛市中不会变聪明;他们变得自满。就像等待第一次心脏病发作才开始健身不健康一样,等待熊市学习卖空是一种不专业的管理他人资金的方式。卖空是一种不使用时会萎缩的肌肉。

投资者将资金留在多空基金中的原因是下行风险保护。在牛市中,只要他们知道在熊市中有下行风险保护,投资者将原谅中等表现并容忍高费用。

贝塔赛骑手相信,当整个市场转为熊市时,会有充足的时间进行卖空。毕竟,卖空的外在游戏、工具和技术可能比多头稍微复杂一点,但这不是火箭科学。卖空首先是一种内在的游戏。不要低估内化卖空的心理纪律所需的时间。

开始的错误时间是当多头亏损,投资者在你的脖子上喘气的时候。

神话#10:"结构性空头"的神话

"伴随着巨大的力量而来的是巨大的责任。"

– 蜘蛛侠的本叔

结构性空头是被视为不可逆转地注定失败的股票;就像 20 世纪 30 年代的马车、数字时代的印刷报纸和可再生能源时代的煤矿一样。它们被认为是强制性的空头,因为它们的商业模式或行业的动态结构上存在缺陷。

结构性空头就像市场大师在媒体上滔滔不绝一样廉价,成千上万。盈利性的结构性空头是金融服务行业的独角兽,像市场巫师一样稀有且难以捉摸。

第三章中,走进狂野的空头,我们揭穿了结构性空头的神话。现在,让我们专注于管理他人资金时寻找结构性空头意味着什么。市场参与者一直坚信,在某个地方,有一只股票他们只需卖空并扔掉钥匙。因为它将自己走向破产,所以不需要任何进一步的维护。

现在,他们并不对他们的多头持有相互信念。当然,他们相信他们需要持续维护。他们相信与管理层会面,更新盈利模型,与分析师通话等等。因此,他们相信在多头方面有严格的职业道德,而在空头方面则被动。在现实世界中,每个人都知道空头比多头要困难得多。那么,为什么在困难的一面,漫不经心的懒散会奏效,而辛勤的工作在容易的一面几乎得不到回报呢?

当人们公开持有这种不对称的不受质疑的信念时,令人不便的事实是,他们对于短空头并没有多加思考。他们不知道如何做空。显然,他们也没有尝试很努力。如果他们有尝试,现实很快就会打败他们。然而,他们依然希望事情会奇迹般地自行解决。他们自信地市场推广他们没有掌握的技能,乐意接受他人的钱并收取丰厚的费用。然而,他们并不打算为必然的不适负责。用英国女王的英语来说,这被称为失职。在交易员的执行英语中,这些个体被称为小丑。在本书的其余部分,让我们将他们的地位装饰成货币小丑声chremato: 货币,coulro: 小丑,phones: 声音)。

摘要

做空已经长期存在于我们的门口的未知领域。与现代技术,如人工智能或机器学习相关的书籍和白皮书比起,关于做空的出版物更多,而做空已经存在了几个世纪。如果我们想要给这项技术一个尊贵的称号,重建这门学科,并吸引有才华的人才,驱散谬论尤为重要。

在下一章中,我们将讨论空头市场的市场动态,并解释对这些动态的深入理解对于成功至关重要。

第三章:走进狂野的做空面

“在理论上,理论和实践是一样的。在实践中,它们是不同的。”

– 约基·贝拉,《洋基哲学家》

对于许多仅做多的参与者来说,卖空是一个秘密的幻想。他们都曾经碰到过一些他们分析过的股票,得出结论认为它注定会失败,并希望自己能做空它。然后,他们看着它坠落。他们相信自己的分析超能力在做空方面也会奏效。在理论上一切都很顺利,直到它必须在实践中奏效为止。当市场参与者来到做空的世界时,他们认为他们应该简单地做与在做多方面相反的事情。

在这一章中,我们将从做多方过渡到做空方的旅程。我们考虑为什么大多数交易者认为他们可以做空却在实践中失败。首先,我们将研究为什么基于估值的卖空会失败。然后,我们将彻底揭穿结构性卖空旅游陷阱。我们将在学会无助的炼狱中徘徊,然后醒悟到做空的现实。在本章的第二部分,我们将开始深入探讨做空和其独特的特点。

在此过程中,我们将涵盖以下主题:

  • 依据加普的做多方世界

  • 结构性卖空:金融服务行业的独角兽

  • 克服学会无助

  • 金钱“是”在“应该”发生的事件之间赚到的

  • 做空面临的独特挑战

依据加普的做多方世界

“他希望他能安排一次伤害作为一种道德教训。”

– 约翰·欧文,《依据加普的世界》

在做多方面,市场参与者经常寻找长期前景良好但暂时定价错误的股票。他们想要买一些以折扣价增长的东西,就是著名的“安全边际”。这种方法被称为以合理价格增长GARP)。如果在做多方面这种方法看起来运作良好,那么在做空方面做相反的事情就可以了,没错吧?这甚至听起来可能像以记录价格潜水DARP)。

第一个逻辑步骤是最简单的:找到价格超现实的股票。总有一支股票,有时是整个行业,似乎违反传统的重力法则。随着全球货币当局在“打印”按钮上打盹,荒谬定价的股票层出不穷。第二步是对奇特的商业模式、增长率的可持续性、现金流耗尽速度等进行分析。一旦星星排成一列,你发现悬浮的估值与下沉的商业模式相结合,就是时候用一些精心设计的做空头寸教训那些傲慢的股票了。过了某个阶段,无论商业模式有多好,估值都不再有意义,事情应该回归到合理价位。

尽管这种方法表面上似乎合乎逻辑,让我们考虑一下为什么可能不是这样。GARP 的概念隐含地依赖于公平。廉价的估值会回归到公平。目标是在股票便宜时抓住它们,并在修正行情上赚取利润。对于技术娴熟的市场参与者来说,买入大幅超卖的股票,然后等待反弹是公平且合乎逻辑的。因此,假设不可持续的定价会回归到公平估值是公平和合乎逻辑的。问题在于,将这种对公平的潜意识信仰带入短期世界证明是一个致命的优点。

达到同温层估值的股票往往具有足够的动量将它们推向电离层,然后引力将它们拉回。拥有 100 倍市盈率PE)(一种估值指标,计算方法是股价除以每股收益)的股票已经逃脱了理性的引力。它们也许会涨到 150、200 或 3000。

香槟股票在泡沫区域仍然有泡沫,这时,华尔街的欢呼者方便地推出同样的套路:“永久的高原”,“这一次不同”,“范式转变”,“新经济”。市场参与者可能把自己视为疯狂人群中的理性声音。然而,正如西尼加,投行家白天的守护神,夜晚的斯多亚哲学家所证明的,一颗理智的头脑对抗疯狂的人群仍然是不公平的战斗。

在几何上升之后,股价出现了抛物线式的“大结局”上涨。这时,基本面空头卖家遭受了理性的诅咒:他们提前离场,因为仓位是不可持续的。我们都经历过这种情况。我们买回我们的空头仓位,收盘最后的高点,然后恼怒地离开,只是发现牛顿物理定律不区分水果、热核洲际弹道导弹和伊卡洛斯股票。

故事的寓意:卖空一只毫无道理的股票也没有道理。正如凯恩斯曾经说过的那样,“市场的非理性可能比我们的偿付能力更长久。”

结构性空头:金融服务行业的独角兽

“如果你想要保证,就买一个烤面包机。”

– 克林特·伊斯特伍德

一旦市场参与者在试图融化伊卡洛斯股票的翅膀上多次受挫后,他们会改变策略。他们渴望确定性。他们寻找那些已经符合所有“坏”标准的股票:坏公司、坏行业、坏产品、坏管理、坏估值、坏消息传播、坏评级等等。他们开始寻找结构性空头。幸运的是,失败之路上的公司远比成功之路上的公司多得多。

问题在于时机。每一点信息都附带着一个价格标签。这被折价在股价中。到了做空者积累足够证据可以毫无疑问地得出他们遇到了结构性空头的结论的时候,机构长期持有者已经离场了。剩下的唯一股东是稳定的长期投资者,如创始人和战略合作伙伴。做空“结构性空头”变成了一个二元事件。要么它们破产,要么发生一项重大的公司并购或收购事件。简单来说,股价要么下跌到零,要么保持不变。

此外,做空比买多复杂一些。做空者需要卖出他们根本不拥有的股票。因此,他们方便地从股票借出台中借来,这些台中收取借贷费用。借贷费用是供求关系的直接函数。对于难以找到的问题,借贷费用从一般抵押品的 0.25%-0.5%上涨到两位数。结构性做空恰好也被称为拥挤做空,这种做空的借贷费用会让莎士比亚的夏洛克嫉妒。股价可能会下跌,但借款成本非常昂贵,任何一点买压都会引发恶性做空压力,你可能会发现自己在两个月内赚了 1-2%,但股价在 3 天内上涨了 15%。

结构性做空是廉价的,就像市场大师一样:千篇一律。盈利性的结构性做空就像市场巫师一样:金融服务的独角兽,证明了没有规则的例外。

克服学会的无助感

“记住,除非他感到气馁,否则没有人真正被击败。”

  • 中国裔美国哲学家布鲁斯·李

经过几次试图捕捉射击星星和咀嚼干骨头的失败尝试后,市场参与者在财务和情感上陷入了困境。然而,任何精心制定的作战计划都无法在第一次遭遇敌人时生存下来。做空一方变成了一个无尽的挫折源,其逻辑违背了逻辑。

狗是人类最好的朋友,但不幸的是也是他最喜欢的实验室测试对象之一。在一次著名的实验中,积极心理学运动的先驱马丁·塞利格曼剥夺了狗们获得奖励的机会。奖励分配的随机性进一步剥夺了实验狗的希望。它们逐渐变得冷漠。即使他们有明显的成功机会,他们也停止了努力。他们只是放弃了“免费赚钱”的交易。这些狗已经学会了无助感。

在金融狼群中学会的无助的症状表现为一些象征性的空头,大量的空头指数期货和结构上的高净头寸。在执行交易员的英语中,他们放弃了试图做空特定股票的尝试。他们只保留零星的象征性空头想法。他们通过出售期货对冲或平衡多头和空头。从多头席位上观看比赛时看起来很容易,但现在他们在实地上被打了几次后,这似乎是不可逾越的困难。

沮丧的市场参与者随后退回到他们的舒适区:多头。这甚至在他们的营销材料中也发生了。他们仍然谈论下行保护,但他们向投资者宣传的精明股票几乎都是多头方面的。

在这一点上,他们无意中背叛了他们作为多空交易者的唯一"理由":他们能够在市场的情绪化波动中产生阿尔法。判断市场参与者是否是认真的空头卖家的一个快速方法是查看他们在营销材料中发布的空头和多头观点的比率。

幸运的是,学会的无助是可以逆转的。这就是这本书的一部分。

金钱"是"在"应该"发生的事件之间赚取的。

"大多数决策可能应该在你希望拥有的信息的大约 70%左右做出。"

  • 杰夫·贝索斯

空头交易的现实是,金钱是在"应该"发生的事件之间的时间内赚取的。让我解释一下我的意思。当股票达到不可持续的水平时,它们"应该"下跌。当公司处于完全混乱状态时,它们"应该"倒闭。在轨道上的老卫星一样的灭亡的致命时刻和僵尸股票的苦闷炼狱之间,它们并不是由市场的某个斯科蒂奇神奇地传送下来的。在它们"应该"下跌的时间和它们"应该"破产的时间之间,事实上,它们确实在很长一段时间内下降了很多,不为人注意,不受欢迎,但对一些精明的空头卖家来说,仍然是非常有利可图的方式。

他们退出了对话。它们在整个过程中的估值并不奢侈,事实上恰恰相反。它们与同行和整个市场的估值相当,甚至稍微便宜一些,但它们之所以便宜是有原因的。它们让人失望。机构逐渐出售了它们的持股。零售商忙于追逐新的热门股票。市场参与者没有理由再持有它们了。它们在市场选美大赛中犯下了终极罪行:它们无聊。

仔细想想:在多头方面,你不会拥有一只无聊的股票。其他不太有才华的市场参与者可能最终会得出同样的结论。他们要么卖掉,要么远离。不吸引人的股票不会表现出色。随着时间的推移,小的表现不佳会累积成大的失望。简言之,你在多头方面不想拥有的股票是空头账本的潜在候选人。

找到好的空头的关键在于接受一个反直觉的真理:它并不令人兴奋。好的空头是无聊的。它们既不显得过于昂贵,也不显得太有缺陷,它们的估值往往与同行相似。它们只是无聊的表现不佳者。

空头面临的独特挑战

“当事情出错时,不要跟着一起出错。”

– 猫王

人们在做空交易上失败,是因为他们忽视了三个对他们不利的关键因素:市场动态、稀缺心态和信息的不对称性。

市场动态:做空不是股票挑选比赛,而是头寸规模化练习

“这是太空,环境不合作。”

–《火星救援》

成功的多头扩大。成功的空头缩小。在多头方面,市场做了大部分的工作。在空头方面,市场并不合作。失败的空头膨胀,而成功的空头收缩。

为了说明这一点,让我们看看下面的表格。想象一下我们有四只股票:两只多头(A 和 B)和两只空头(C 和 D)。这里的目标是说明多头和空头的行为有所不同。为了保持简单,让我们从价格为 100 美元的 4 只股票开始。开放的多头市值为+200,空头市值为200,空头市值为-200。总暴露(多头和空头账簿的绝对值)为 400 美元,总净暴露(多头和空头账簿之间的差异)为 0 美元。在金融术语中,净暴露低于 10%通常被分类为市场中性。这听起来可能更聪明、更安全,但绝对不是无风险。

100 天后,A、B、C 和 D 的价值分别为 110、95、90 和 105。

代码第 1 天第 100 天盈亏
A10011010
B10095-5
市值多头2002055
C-100-9010
D-100-105-5
市值空头-200-1955
总暴露40040010
净暴露01010

总暴露仍然是 400 美元,但净暴露现在是+10 美元。在多头方面,有更多有效的东西,不起作用的东西少了。然而,在空头方面,有效的东西少了,不起作用的东西多了。尽管每个做空股票(C 和 D)的绝对移动等于多头头寸(A 和 B)的绝对移动,但净暴露自然上升。成功的多头扩大,空头缩小。这导致净暴露的自然健康向上漂移。这意味着多头和空头的暴露不匹配。

股票通常按部门、行业和子行业分类。市场参与者倾向于在类似的部门购物以进行对冲。例如,可能是丰田对通用汽车。部门暴露也会出现错位。在多头方面,有助于增加规模的部门。与此同时,在空头方面,造成伤害的部门规模增加。

Beta 是对市场的敏感性。在高中令人昏昏欲睡的数学课上,这是一支股票的离散收益与其基准的协方差矩阵。在执行交易员的语境中,这是当指数波动时股票波动的程度。在考虑 Beta 时情况变得更糟。做多方从扩张中受益,但做空方面却经历了来自收缩的净拖累。最重要的是,在做空方面,市场不合作。

任何一个清醒的学者都会逻辑地认为,解决方案是增加命中率和超额的做空头寸。如果市场参与者 100%正确,那么做空头寸可以超额。在现实世界中,任何被打击和受伤的做空从业者都会哭着说疯了。增加命中率意味着成为更好的股票选择者。这是每个人每天都在努力实现的目标。问题在于,即使投资传奇人物在做多方面的胜率也仅在 30%到 50%之间,在做空方面也只能达到 20%到 40%之间。因此,解决方案就是做更多相同的事情,并期待不同的结果。欢迎来到疯狂边际贡献的世界。

好吧,既然几率更低,做空的扶手椅战略家会继续争辩说,解决方案显然是将仓位大小缩小以控制损失。问题再次出在市场动态上。成功的做空者缩小。例如,进行-0.50%的赌注意味着-10%的下跌将产生+0.05%的利润,这几乎不是能吸引投资者投入大笔资金的回报。

赤裸的事实是做空并不是一场选股比赛。这是一种仓位规模的练习。困难在于确定仓位大小,使其在发挥作用时起到贡献作用,但在不起作用时不损害业绩。

由于做多和做空具有相反的动态,只有两种平衡净敞口的方式:

  • 补充赢家:这是“骑赢家,割失败者”的做空版本。成功的做空需要定期补充。

  • 保持比做多多的做空头寸:在做空方面进行想法生成是大多数市场参与者的一大障碍。

这引出了下一个问题。

稀缺心态

“它在任何地图上都没有标注;真正的地方从不会有。”

– 赫尔曼·梅尔维尔,《白鲸》

需要持续提供想法的需求导致了第二个不利于做空者的因素:稀缺心态。以基本的长期持有视角对待做空的市场参与者倾向于仔细研究和挑选股票。这意味着他们的优质选择往往少而又少。长市场参与者倾向于成为捕鲸者。这在做多方面是有效的,因为成功的做多会随着时间扩展。然而,将这种捕鲸心态带到做空方面,它就变成了一场疯狂的独角鲸追逐。

卖空方需要不同的心态。它需要一种丰富心态,其中数量胜过质量。如果长期投资者是捕鲸者,卖空者就需要成为沙丁鱼渔民。沙丁鱼捕捞可能不是古典小说最具启发性的素材,但至少它能让人们有饭吃 —— 祝你好运,从北极圈带回那些难以捉摸的独角兽鲸中的一只。卖空者需要避免过滤过多。他们需要让进入投资组合变得容易,而让留下来变得困难。关键是期望每个卖空头寸都失败。

这使我们进入了第三个挑战。关于卖空候选人的信息不多。

信息的不对称

“当一个人的工资取决于他不理解某件事时,要让他理解某件事是困难的。”

– 奥普顿·辛克莱尔

除了扭曲的市场动态驱动需要稳定提供新想法之外,卖空者还面临信息有限的挑战。无论公司还是街道都没有动机主动提供可能对股价产生不利影响的信息。卖空者自食其力。

股票期权和透明度

“利润是甜蜜的,即使它来自欺骗。”

– 索福克勒斯

股票期权是吸引、激励和留住人才的一种常用方式。当公司高管的报酬直接与股价表现挂钩时,没有动机主动提供可能动摇船只的信息。卖空者面临三种困难:

  • 公司有权拒绝向公开宣称为卖空者的人提供企业准入。他们没有义务回答投资者的棘手问题。这种沉默是一种完全可以理解的人类行为,特别是当卖空者是对抗性的时候。

  • 其次,高层管理有时对卖空者采取敌对态度。好消息是,当管理层对付卖空者的皮肤足够薄到诉诸法庭时,他们在商业实践和会计政策方面通常也很激进。

  • 第三,透明度是单向的。公司对其成就大肆宣扬,但对失败则守口如瓶。当涉及成功时,公关没有预算冻结,但失败时则像永久冻土一样冰封。公开自我折磨是为了烈士,而不是为了企业战士。

在实践中,这意味着需要两倍的努力来收集一半的信息,以使投资决策变得两倍冒险。

卖方分析师是金融星系的守护者

“我是格鲁特。”

– 格鲁特,《银河护卫队》

金融是唯一一项竞争激烈的运动,啦啦队员穿着细条纹西装。卖方行业缺乏满足卖空者需求的能力。在分析师的辩护中,当整个投资银行的奖金池取决于以任何必要手段证明“买入”建议时,支持“卖出”建议是困难的。

卖方分析师没有鼓励卖出或做空的动机。公司通过发行股票、商业票据和债务等工具在资本市场上融资。他们可能会对将下一章节定为 11 或 13 的店铺的住宿爱因斯坦的人感到稍微不感兴趣。

分析师致力于与高层管理接近。买方社区会以他们促进公司接触高层管理的能力来奖励他们。正如詹姆斯·蒙蒂尔曾经说过的那样,他们是受人尊敬的秘书。因此,没有动机用卖出评级疏远管理层。当每个人都自豪地持有“买入”评级时,通过具有卖出评级的分析师发送公司请求很少会让管理层有友好的倾向。这是一个不必要的向敌方发出的警告。

最后,分析师会疏远现有投资者。谁说机构投资者从不回复卖方的电话?试着在他们的大头寸上提出“卖出”建议,他们会记住你的电话号码。

结果,卖方分析师是金融星系的守护者。更准确地说,他们是格鲁特,那个以独特一句话“我是格鲁特”而闻名的行走树木,而在这个语境中等同于“这是一次购买”。当股价表现不符时,合理化可能会非常超级派,正如对金融界所有事情都了如指掌的专家玛丽·波平斯所说的那样。因此,这是破译街头行话谜题的方法:

  • "这是一次性的,这是一次购买":股价意外下跌。我是格鲁特。

  • "由于周期性库存调整导致负增长,这是一次购买":盈利因为“软裁决”而下滑,股价表现不佳。我是格鲁特。

  • "市场是错误的,这是一次购买":股票未能随着整体市场上涨。我是格鲁特。

  • "在弱势中买入,买入低点":表现不佳持续下行。我是格鲁特。

  • "我们已经降低了我们的估计,调整了我们的目标价格,将我们的投资视野延伸到 2057 年,但保持了我们的评级,因为长期故事仍然完整,这是一次购买":表现不佳。我是格鲁特。

  • "长期投资者买入,这是一次购买":没有任何效果,价格便宜且越来越便宜。我是格鲁特。

  • "新闻流动如此糟糕,这是好消息,这是一次购买":股价跌至谷底—在那个价位,一定会有所行动。我是格鲁特。

  • "坏消息已经融入估值中,这是一次购买":没有什么发生,股价持续低迷。我是格鲁特。

  • "这是结构性空头,卖出":投资银行部门不期望在近期有任何交易。因此,烧毁那座桥是可以的。如果一支股票在一系列卖方评级下调之后仍然没有动静,那么现在就是抛售家族珍宝和大量购买的时候。

在大多数商店里仍然可以看到“卖出”建议,但这就像电梯里的“关门”按钮一样:通常是断开的,只是纯粹出于安慰性目的。

底线:这使得评级表格有点难以理解。金融克里奥尔语可能很难解读。以下是分析师评级的简单指南,它们的含义以及您应该如何做出反应:

建议翻译行动
强烈买入动量股或正在筹备投资银行交易买入
买入默认评级晚饭吃什么?周五看电影吗?
中性消极意见卖出或卖空
卖出投降,不惧怕与公司破裂平仓并寻找长期布局
强烈卖出报复评级如果最近形成了长期布局,请将家庭白银融化并买入、买入、买入,否则以市价买入
放弃覆盖表现不佳者在卖空前检查借入利用率

评级是固定的。坦率地说,诚信并不是那种让法拉利停放在车库里的货币。虽然分析师有保持有利评级的自然动机,但他们在数字方面享有更多自由。他们会削减其预估,延长其投资视野,并与其上涨潜力讨价还价。这是讨价还价阶段。

这是一种承认,事情可能不像预期的那样顺利。收益动能下降是卖空者中的一种流行信号。他们可能无法改变自己的评级,但他们会在数字方面更加诚实。

如果市场参与者基于分析师的估计做出投资决策,他们可能应该了解他们的预测准确性。预测似乎也不是分析师的强项。马可·迪翁,当时是摩根大通的量化研究负责人,在全球金融危机爆发前于 2007 年编制了一份卖方预测准确性报告。该论文的目的是计算分析师在一年内对其预测的准确性。

这份研究论文的结论主要解释了为什么策略着重于盈利动能,也称为随时间方向,而不是准确性。真正令人着迷的是样本内预测准确性。分析师在一年后对其盈利预测准确的概率为 2%。他们有 25%的概率相差 10%。在 2%的准确率下称为统计误差。在 25%的概率下相差 10%,即使准确性奇迹般加倍,它仍将具有硬币抛掷的长期概率。

揭开财务分析师的面纱可能会显露出有缺陷的魔术师。如果你不开心,责怪游戏,而不是玩家。分析师是才华横溢、热情洋溢、工作努力的人,对其行业和公司有着全面的了解。然而,他们运营在一个旨在促使人们交易,而不一定是为了让他们赚钱的游戏中。

摘要

市场参与者倾向于沿着可预见的路径发展,从他们自豪地踏上空头交易的未知领域的那一刻开始,到他们下意识地放弃主权的时候。最重要的是要记住,空头方不是长仓的反义词。你不能依赖错定价格的股票恢复到其公允估值,而且“结构性空头”只在空头交易旅行者的心中有利可图。空头方遵循自己的规则。

空头卖方面临的挑战之一是,长仓市场参与者不必面对的挑战,即克服信息匮乏,采取丰富心态成功地抵消扭曲的暴露。

现在我们已经驱散了一些关于空头交易的神话,并分析了空头方的特殊动态,本书的下一部分将讨论从零开始建立空头交易实践。在第二部分外部游戏:打造强大的交易优势中,我们将探讨外部游戏,或者如何发展有利的交易优势。

第三部分长/短游戏:打造长/短产品中,我们将把一切都放在一起,考虑如何建立一个投资者感兴趣的长/短投资组合。

从下一章开始,我们将讨论如何选择有效的交易方法,并开始发展你的空头交易优势。

第四章:多空方法论:绝对和相对

在本章中,我们将比较方法,特别关注绝对与相对系列。绝对系列是您可以在任何网站或平台上看到的开高低收OHLC)价格。它们通常会调整为股息、股票拆分和其他公司行动。相对系列是上述绝对系列除以基准的收盘价格,调整为货币。

我们希望展示绝对方法的弱点,以及相对弱势方法的优势,这将定义本书的方法论。在此过程中,我们将涵盖以下主题:

导入库

以下代码,实际上是本书中大部分代码,首先需要安装yfinance包:

pip install yfinance 

然后可以导入yfinance

import yfinance as yf 

在本章节和本书的其余部分,我们还将使用pandasnumpymatplotlib。因此,请记得首先导入它们:

# Import Libraries
import pandas as pd
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt 

多空 1.0:绝对方法

"‘但是,皇帝一点也没有穿衣服!’,一个小孩说道。

"‘倾听无辜之声!’,他的父亲叫道。"

– 阿瑟·安德森

绝对方法在直观上是有道理的:买涨的股票,卖跌的股票。来自各种提供商的数据、屏幕上的价格图表以及进入组合的内容之间存在一对一的关系。每个人都说同样的语言。投资者、市场评论员和其他各种市场参与者谈论的都是同样的价格和一般估值水平。卖出绝对价值下跌的股票会产生现金,可以用于在多头方向上购买更多的股票并增加杠杆。

只有一个小问题:产品并不总是如说明书所说那样。让我们保持冷静:绝对方法从一开始就是彻底的失败,接下来的章节将探讨其原因。

无法降低与基准的相关性

投资者明确支付溢价费用以获得不相关的回报。在执行交易员的英语中,投资者希望他们的资金增长,不受市场先生的情绪波动影响。让我们看看为什么绝对方法未能实现这一承诺。

在牛市中,潮水抬高了所有船只。很少有股票下跌,但是当它们下跌时,它们吸引了很多关注。长持有者退出股票,而空头卖家则加码。这些股票成为拥挤的空头头寸。流行的空头头寸 notoriously 难以交易——它们不流动,而且异常波动。进出这些股票会产生一些不利的市场影响,借款费用昂贵,并且它们还容易受到空头挤压的影响,即在熊市下跌结束时发生的激烈反弹。由于没有人想要通过空头挤压过度受限,这对下注规模设置了自然限制,导致空头头寸萎缩。

另一方面,在牛市中,多头头寸过度发展。这导致高结构性正净曝露,这是对市场上升方向的明确押注。在金融克里奥尔语中,这些被称为“定向对冲基金”。这些基金经理谈论对两手灵活和灵活的管理,但是一旦市场转为熊市,他们就寻求庇护在他们的书桌下的舒适之下。相反,在熊市中,很少有股票上涨。空头想法很多,但在实践中,暴露很少跨越到负区域。这意味着投资者减轻了打击,但仍然亏损。

以下图表显示了标准普尔 500 指数以及绝对价格系列中牛市或熊市的所有成分的计数。

图 4.1:在市场波动时,处于牛市或熊市领域的股票数量大幅波动

上述图表,以及与相对弱势法比较的另一个图表(我们将在“两面都提供新鲜想法的一致供应”部分回来),可以通过执行以下源代码生成:

# S&P500 dataframe: list of tickers
sp_df = pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')[0]
sp_df['Symbol'] = sp_df['Symbol'].str.replace('.', '-')
bm_ticker = '^GSPC'
tickers_list = [bm_ticker] + list(sp_df['Symbol'])[:]

# Variables instantiation
window = 252
df_abs = pd.DataFrame()
batch_size = 20
loop_size = int(len(tickers_list) // batch_size) + 2

for t in range(1,loop_size): # Batch download
    m = (t - 1) * batch_size
    n = t * batch_size
    batch_list = tickers_list[m:n]
    print(batch_list,m,n)
    batch_download = yf.download(tickers= batch_list,
                                 start= '2007-01-01', end = None, 
                                 interval = "1d",group_by = 'column',
                                 auto_adjust = True, 
                                 prepost = True, treads = True, 
                                 proxy = None)['Close']
    df_abs = df_abs.join(batch_download, how='outer')

### removed for brevity: check GitHub repo for full code ###
bullbear['bulls_absolute'] = df_abs[df_abs > 0].count(axis=1) 
bullbear['bears_absolute'] = df_abs[df_abs < 0].count(axis=1) 
bullbear['bulls_relative'] = df_rel[df_rel > 0].count(axis=1) 
bullbear['bears_relative'] = df_rel[df_rel < 0].count(axis=1) 

bullbear[280:][['benchmark','bulls_absolute', 'bears_absolute', 
               ]].plot(figsize=(20,8),
                style=['k', 'g', 'r'],grid=True,secondary_y=['benchmark'],
                title = 'S&P500, 1yr High/Low count: absolute series' )

bullbear[280:][['benchmark','bulls_absolute', 'bears_absolute', 'bulls_relative', 'bears_relative']].plot(figsize=(20,8),
                style=['k', 'g', 'r','g:', 'r:'],grid=True,secondary_y=['benchmark'],
                title = 'S&P500, 1yr High/Low count: absolute & relative series') 

上述代码的结构相当紧凑和简单:

  1. 导入yfinance模块以允许从 Yahoo Finance 下载。

  2. 使用pandas.read_html方法下载最新的标准普尔 500 成分股。提取股票列表并将.替换为-以确保与 Yahoo Finance 兼容。

  3. 实例化数据框和变量以处理数据和聚合结果。使用模数//函数计算批量大小。

  4. 添加一个循环来批量下载收盘价格。使用join方法添加到df_abs中。

  5. 通过将df_abs除以bm_ticker列(使用axis=0指定)然后将其重新定位到索引的第一个值,创建df_rel

    1. 使用np.where方法定义牛市/熊市制度:如果收盘价是 252 个周期中的最高价,则分配1,如果收盘价是 252 个周期中的最低价,则分配–1;否则,分配np.nan

    2. np.nan缺失值之间传播1-1

  6. bullbear数据框上聚合结果,跨绝对和相对数据框添加水平计数(axis=1)。

  7. 绘制基准、牛市和熊市计数。

当市场上涨时,看涨股票的数量增加。当市场横盘或熊市时,看跌股票的数量增加。这表明绝对方法从定义上与市场相关。只需看看多空基金的业绩记录,就可以得出结论,绝对方法未能提供与市场不相关的吸引人回报。

接下来的几节将考虑绝对方法的一些弱点。

无法有效降低波动性

由于空头头寸比其他头寸少,平衡头寸的方法是加大更集中的头寸。这意味着一个稀释的、相对低波动性的多头投资组合和一些集中的“结构性空头”投注。正如我们在第三章中看到的走进狂野的空头市场,拥挤的空头头寸是不流动的,因此更容易出现波动率飙升。卖方不少,但勇敢的买方稀少。

空头方面的波动性推动整个投资组合。绩效不佳除以高剩余波动性只会产生不吸引人的波动率调整回报。

几乎没有历史性的下行保护

绝对方法在牛市中可能会发布正回报。但每当市场下跌时,绩效就会出现“软裁”。

大萧条(GFC)期间,人们本应该期望净头寸下降到零以下。毕竟,每个人都在谈论金融末日。如果多空参与者真的像他们声称的那样喜欢做空,净头寸应该下降到 0 以下。然而数字讲述了不同的故事。随着净贝塔达到+0.5,市场参与者仍然持有乐观态度。

采用绝对方法的从业者减少净头寸的方式是减少他们的多头头寸,并囤积现金。当到了在空头方面动手时,他们却胆怯了。多年来在牛市中交易使他们的空头卖出能力萎缩。如果你想打败迈克·泰森,你需要去健身房几次并且摆出你的笑脸。

较差的投资工具

绝对方法已经赢得了自身的存在危机。多空 1.0 既不是一个复杂的,也不是一个安全的投资工具。在任何一个方面,它都是一个较差的工具。它在牛市中的赚钱比共同基金和指数基金少。它在熊市中只比指数亏损少一点。经过费用后,投资者使用绝对方法比使用低技术水平的普通指数基金少积累的钱。与经典的共同基金相比,透明度和流动性都较低。因此,毫不奇怪,这些基金未能吸引和保留寻求稳定、不相关回报的养老金资金。绝对多空基金是为自己赚钱的企业,偶尔也为他们的投资者赚钱。

落后的指标

"La gravité est le bouclier des sots [引力是愚人的盾牌]。"

– 蒙特斯基耶,法国哲学家

股票不是洲际弹道导弹。它们不会只是因为它们无法获得足够的船用柴油来填满整个燃料箱而从天而降:

  1. 首先,他们落后于其直接竞争对手。

  2. 第二,他们落后于所在行业的其他股票。

  3. 第三,他们在所在行业中落后。

  4. 第四,他们表现不及更广泛的指数。

  5. 第五,他们最终在绝对值上下降。

关键问题在于,当这些股票出现在人们的雷达屏幕上时,它们已经失去了很多价值。在一个以创造性的多彩侮辱作为职业业余爱好的行业中,几乎没有什么比被称为滞后指标更刺耳的了。然而,在空头/多头业务中似乎是主导业务模式。

空头/多头市场参与者绝对不是低能儿。他们是受过高等教育、敬业、勤奋的人。以“看多强势”和“看空弱势”为正确的理念—绝对数据系列只是错误的数据集。作为替代方案,下一节将讨论使用相对系列而不是绝对价格的好处。

空头/多头 2.0:相对弱势方法

"真理本质上是不言自明的。一旦你清除了围绕它的无知之网,它就会清晰地闪耀出来。"

– 马哈特玛·甘地

指数如标准普尔 500、纳斯达克 100、富时 100 和 Topix 是其成分股的市值加权平均值。大约一半的股票在任何时间段内都会比指数表现得更好,而其余的则会更差。相对表现不佳的股票中有更多可供选择,而绝对价值下跌的股票则寥寥无几。

下面是计算相对系列的源代码:

def relative(df,_o,_h,_l,_c, bm_df, bm_col, ccy_df, ccy_col, dgt, start, end,rebase=True):
    '''
    df: df
    bm_df, bm_col: df benchmark dataframe & column name
    ccy_df,ccy_col: currency dataframe & column name
    dgt: rounding decimal
    start/end: string or offset
    rebase: boolean rebase to beginning or continuous series
    '''
    # Slice df dataframe from start to end period: either offset or datetime
    df = df[start:end] 

    # inner join of benchmark & currency: only common values are preserved
    df = df.join(bm_df[[bm_col]],how='inner') 
    df = df.join(ccy_df[[ccy_col]],how='inner')

    # rename benchmark name as bm and currency as ccy
    df.rename(columns={bm_col:'bm', ccy_col:'ccy'},inplace=True)

    # Adjustment factor: calculate the scalar product of benchmark and currency
    df['bmfx'] = round(df['bm'].mul(df['ccy']),dgt).fillna(method='ffill')
    if rebase == True:
        df['bmfx'] = df['bmfx'].div(df['bmfx'][0])

    # Divide absolute price by fxcy adjustment factor and rebase to first value
    df['r' + str(_o)] = round(df[_o].div(df['bmfx']),dgt)
    df['r' + str(_h)] = round(df[_h].div(df['bmfx']),dgt)
    df['r'+ str(_l)] = round(df[_l].div(df['bmfx']),dgt)
    df['r'+ str(_c)] = round(df[_c].div(df['bmfx']),dgt)
    df = df.drop(['bm','ccy','bmfx'],axis=1)

    return (df) 

接下来,我们将尝试这个功能。Softbank(9984.T)是一家在东京证券交易所TSE)上市的公司。它以日元交易。该公司在美国科技行业已经有近三十年的历史了。因此,Softbank 将与纳斯达克的美元进行对比:

ticker = '9984.T' # Softbank
ohlc = ['Open','High','Low','Close']
_o,_h,_l,_c = [ohlc[h] for h in range(len(ohlc))]
start= '2018-12-30'
end = None
df =  round(yf.download(tickers= ticker,start= start, end = end, 
                        interval = "1d",group_by = 'column',                        auto_adjust= True, prepost= True,                         treads = True, proxy = None),2)
bm_df = pd.DataFrame()
bm_ticker = '^IXIC' #Nasdaq 
bm_col = 'nasdaq'
ccy_df = pd.DataFrame()
ccy_ticker = 'USDJPY=X'
ccy_col = 'JPY'
dgt = 5

bm_df[bm_col] =  yf.download(tickers= bm_ticker,start= start, end = end,
                             interval = "1d",group_by = 'column',                             auto_adjust = True, prepost = True,                              treads = True, proxy = None)['Close']
ccy_df[ccy_col] =  yf.download(tickers= ccy_ticker,start= start,                                end = end, interval= "1d",                               group_by = 'column',auto_adjust = True, 
                               prepost = True, treads = True,                                proxy = None)['Close']

df = relative(df,_o,_h,_l,_c, bm_df, bm_col, ccy_df, ccy_col, dgt, start, end,rebase=True)

df[['Close','rClose']].plot(figsize=(20,8),grid=True,
            title= 'Softbank Absolute in JPY vs relative to Nasdaq in USD rebased' ) 

此代码计算相对于数据框架开头的重新基准化的相对系列,与绝对系列进行比较,以 Softbank 为例。首先,我们下载 Softbank 的 OHLC 本地货币。然后我们下载基准纳斯达克和美元的收盘价。

我们通过保持布尔标志rebase=True来运行相对系列函数重新基准化到数据框架的开头。

图 4.2:Softbank 在绝对 JPY 与相对于美元纳斯达克的重新基准化

当电话失去了线缆时,人们随身携带它们,并逐渐束缚了自己。 自从电话束缚了人类以来,Softbank 一直是东京证券交易所的强大力量。 然而,与纳斯达克指数相比,以美元计价的软银表现平平。 在本书的其余部分,我们将使用绝对价值的软银系列和仅用于示范目的的日元。 这个概念很简单:买入表现良好的,卖空表现不佳的,从价差中赚取利润。 关注超过指数的超额回报的想法并不新鲜。 共同基金经理根据其超额回报来评估。 当仅关注长期时,任务是增加表现优异者的权重并减少表现不佳者的权重。 与基准的权重差称为“主动资金”。

相对弱势方法采取了类似的方法。 长/短组合是两个相对账簿的净和。 长方向是经典的共同基金类型长账簿。 短方向由相对于指数的逆向表现的表现不佳者组成。 与共同基金的唯一区别在于,经理们在短期内采取主动对冲的策略,而不是远离表现不佳的人。 绩效来自长期的超额表现和短期的不足表现之间的差异。 下面是一个简单的例子。 通用电气、通用汽车和高盛在三个不同的行业中。 然而,它们有两个共同点。 首先,它们是同一个标准普尔 500 指数的组成部分。 其次,当它们组合在一起时,它们的股票代码具有这个可爱的缩写:GEMS。

下面的代码显示了绝对价值的价格系列,然后返回相对于基准的系列。

tickers_list = ['GE','GM','GS']

# Dataframes instantiation
gems = pd.DataFrame() 
start = '2020-03-31'
benchmark = yf.download(tickers= '^GSPC',start= start, end = None, 
                        interval = "1d",group_by = 'column',                        auto_adjust = True, prepost = True,                         treads = True, proxy = None)['Close']
failed = [] 
rel_ticker_list = []
for n,ticker in enumerate(tickers_list):
    try: #7 Download & process data
        gems[ticker] = yf.download(tickers= ticker,start= start,                                    end = None, interval = "1d",                                   group_by = 'column',                                   auto_adjust = True, prepost = True,                                    treads = True, proxy = None)['Close']
        gems['rel_'+ticker] = gems[ticker].div(benchmark * gems[ticker][0]) * benchmark[0]
        rel_ticker_list.append('rel_'+ticker)
    except:
        failed.append(ticker)
gems = gems[tickers_list+rel_ticker_list]
gems.plot(figsize= (20,8),secondary_y= rel_ticker_list,style=['r','b','g','r:','b:','g:'], 
          title= 'GEMS Absolute Prices vs Relative Series' ) 

该代码采取以下步骤:

  1. 实例化了gems数据框。 start可以是日期——例如2019-12-31,也可以是偏移期间,如–254。列表已实例化。

  2. 运行一个循环从 Yahoo Finance 下载价格信息。 将绝对系列添加到gems数据框中。

  3. 对于相对系列,需要除以基准并在系列开始时重新定位基准。

  4. rel_list_ticker附加到以el为前缀的 ticker 列表中。 这将用于以后排序列。

  5. 重新排序列并打印。

结果显示了通用电气GE)、通用汽车GM)和高盛GS)的绝对价格以及相对系列在虚线上:

图

图 4.3:通用电气(GE)、通用汽车(GM)和高盛(GS)的绝对价格与相对价格对比

图表说明相对系列对股票相对强势与市场的比较更具指示性。价格与基准相比在周期开始时重新调整,但它们提供了跨行业的均匀系列。起初,对一个上涨的股票进行空头操作似乎有些不自然。对于绝对回报型玩家来说,赔钱并不是一件自然的事情。为了理解这个概念,让我们通过设想在熊市中发生的情况来重新构思一下。当大熊猫袭击市场时,没有任何东西会上涨。这意味着你将寻找买入那些能够保持立场或者跌幅低于整体指数的防御型股票。在多头方面,你会比市场亏损少。通常情况下,你会购买非周期性的公用事业、铁路或食品股票。

相反,你会寻找那些下跌速度比基准更快的股票进行做空。这些往往是周期性股票,其表现随着经济周期的波动而波动,比如航空公司。顺便说一下,你可以将之前牛市的宠儿保留在你的投资组合中,但记得换边。牛市领头股往往会吸引末期动量玩家。这些是市场中最弱的参与者,晚来一步,没有真正的游戏计划。一旦形势严峻,他们就会退出,这导致突然的业绩退潮。与经典的绝对方法相比,相对系列开启了一整个新世界的可能性。以下是断言相对弱势方法优越性的 10 个理由。

在双方都能持续提供新思路的情况下,稳定的供应

指数通常是所有成分股的市值加权平均值。这意味着大约一半的股票将会跑赢市场,而另一半将落后于市场。起初,这种大量的想法对那些一直专注于绝对表现的市场参与者似乎令人不安。市场参与者可能会被诱惑继续使用绝对方法交易多头,而使用相对方法交易空头。这种糟糕的想法经常导致购买和做空表现不佳的股票。多头方面必须是与空头方面采用的策略和系列类型相反的镜像。

让我们重新审视我们在“无法降低与基准的相关性”部分编写的脚本,关于牛市和熊市中的股票数量。正如我们在那里提到的,该代码生成两个图表。我们最初使用了绝对系列进行横向计数,这也在这里显示出来:

图 4.4:使用绝对系列的标普 500 中处于牛市或熊市领域的股票

图表说明标普 500 指数已经处于牛市领域超过 12 年,中间偶有波动。总体来说,牛市股票远多于熊市股票。适合做空的候选股票寥寥无几。正如一句谚语所说,潮水能托起所有的船。

然而,让我们将这与相对系列进行比较。这是对每日条形图的简单横向计数。相比之下,下图显示了使用绝对和相对系列的牛市和熊市领域中的股票数量,价格除以指数的收盘价:

图 4.5:使用绝对系列与相对于指数的 S&P 500 中牛市或熊市领域中的股票数量

虚线代表相对于指数而言处于牛市或熊市领域的股票数量。毫不奇怪,牛市阵营大约有一半的股票,另一半处于熊市模式。这为双方提供了大量的选择。

成分清单不包括历史的纳入/删除。表现不佳、破产或被吸收的股票将从指数中删除。这造成了一种人为的向上漂移,称为幸存者偏见。幸存者偏见不会影响空头策略,因为它们的有效性仅针对最强的股票进行衡量。

无论指数如何,都有持续不断的新思路。绝对系列的波动非常大,取决于市场不断变化的情绪。同时,使用相对系列的牛市或熊市领域中的股票数量保持相对稳定。这意味着在任何给定时刻,书中的双方都有充足的想法。

随着广度变窄,表现不佳者的数量甚至可能超过表现优异者的数量。这直接违反了普遍存在的观念,即短期想法很少见。事实上,拥有更多表现不佳者而不是表现优异者并不罕见。

指数是其成分的市值加权平均值。它由最大的 100 个资本主导。在横向或动荡时期,较小的市值往往会被提醒牛顿物理学。对于流动性不足的股票,重力产生了沉重的影响。

专注于部门轮换

在绝对方法中,目标是控制市场的顶部和底部。每一个经验丰富的市场参与者都会告诉你,只有两种类型的人能够一直准确地掌握市场的顶部和底部。他们要么是健忘症患者,要么是江湖骗子,更多时候是两者兼而有之。当将所有事物重述为相对系列时,目标是专注于部门轮换。正如我们在上面的图表中看到的,不管是哪一方的股票数量随着时间的推移都没有太大的波动。这并不意味着相同的股票会永远表现不佳。市场可能会上涨数年,但它会随着时间的推移奖励不同的行业、部门,甚至是市值。使用相对弱势方法,这意味着购买新兴的表现优异者,并在早期卖空表现不佳者。想象一下当你告诉客户,在成功的熊市运动之后,现在是时候转向,押注早期周期股和小市值股,而周围充斥着末日的阴霾。

提供低相关性产品

将一切都除以基准,剥离了基础指数的影响。这样机械地去除了对指数的相关性。现在焦点是超过基准的超额回报。这可能会显得重复,但它却让人铭记于心。绝对系列在市场状况不同的情况下,名字的数量在不同的制度中波动很大。

相反,相对系列两边的名字数量相当一致。市场的波动并不会极大地影响候选池的规模,正如“两边都提供新想法的持续供应”部分所示。这也是基本的算术。将绝对系列除以指数,剥离了整个群体对基准的影响。剩下的只有货币影响和股票特定的表现。

提供低波动性产品

这是大量表现不佳者的直接结果。当有大量的空头候选者可供选择时,市场参与者在其投资组合中享有更大的多样化。他们也有更低的集中度。这降低了波动性。

降低借贷费用的成本

拥挤的空头借贷费用极其昂贵。机构股东很少遵守老海事荣誉准则。他们不会随船沉没。当表现持续不佳时,他们倾向于清算其头寸。这使得随着时间的推移,借贷变得更加困难。

另一方面,表现不佳的股票仍然受益于一些惯性。借贷接近一般抵押品,换句话说,便宜且充足。当坏消息传开,绝对空头玩家四处游荡时,相对空头可以将接力棒传递给他们不那么复杂的对手。前者可以转向廉价易借的空头,而后者则被迫咀嚼昂贵、干燥、难以借贷的名字。

提供可扩展性

绝对方法的一个问题是其缺乏可扩展性。在绝对价值下降的股票通常很受欢迎。拥挤的空头波动大且流动性差。很难建立大规模的盈利头寸。

在 2007 年,通常被称为量化基金的量化基金学习到,对拥挤的问题进行做空是有限度的。当两边都有充足的想法时,集中度可以保持较低,资产管理AUM)继续增长。

非对抗性

相对方法是非对抗性的。相对空头不需要将事情个人化。防御性公司的管理层明白,在牛市中他们的股票注定会表现不佳。他们不会因为他们的股票被空头卖出或者在这个前提下被多头买入而感到愤怒。相反,高飞的科技企业家知道,熊市并不是 IPO 的季节。

货币调整成为一种优势

具有区域或全球授权的经理需要处理多种货币和指数。将一切转换为相对于全球或区域基准的基金货币放在同一个竞技场上。

不需要额外的宏观视角、货币对冲、风险管理。一切都重新基于相同的货币和基准调整单位。例如,随着日元贬值 40%,日本市场猛涨。以日元(JPY)操作的经理在本地货币表现良好;而以美元计价的同行尽管持有完全相同的股票组合,但表现不佳。日元贬值吞噬了所有收益。

但管理一个货币调整后的相对组合并不直观。从股票选择到投资组合管理,一切都必须根据基准和基金货币进行调整。诸如进入、退出和头寸大小等决策都需要以货币调整后的相对价格进行。大多数数据供应商提供的绝对和本地货币的图表回答了相对市场参与者根本不应该问自己的问题。将股票的绝对价值与货币进行比较就像是在比较苹果和橙子。将整个投资范围转换为相对系列在一开始可能稍微复杂些,但在此后操纵起来却容易得多。

其他市场参与者无法猜测你的水平

市场参与者经常抱怨“他们”正在触发他们的止损,或者“他们”在操作他们的订单。市场参与者倾向于将止损设置在支撑/阻力水平、圆整数上。有些算法专门设计用于操纵挂单。当所有价格水平都相对于指数进行计算并进行货币调整时,那些狙击手算法就失效了。相对参与者反应的系列与绝对水平不同。

反过来,止损必须得到积极管理。在执行交易员的术语中,不能与来自交易所的价格匹配的订单无法成交。

你将会看起来像一个投资天才

正如我们之前所见,股票并不会毫无征兆地绝对价值下降。表现不佳始于它们的竞争对手,然后延伸至行业、部门和更广泛的市场,最后以绝对价值暴跌。在相对基础上做空可能在一段时间内略微痛苦。然而,对于那些专注于绝对价格的人来说,这似乎是有远见的。

一图胜千言。以下图表绘制了威尔斯法尔戈WFC)的相对和绝对表现。

ticker = 'WFC'
benchmark = '^GSPC'
tickers_list = [benchmark] + [ticker]

data = round(yf.download(tickers= tickers_list,start= '2015-09-07', end = None,
            interval = "1d",group_by = 'column',auto_adjust = True, 
            prepost = True, treads = True, proxy = None)['Close'],2)

data['r'+str(ticker)] = round(data[ticker].div(data[benchmark])*data[benchmark][0] ,2)
data[[ticker,'r'+str(ticker)]].plot(figsize=(20,8),grid=True,
title= str.upper(ticker)+ ' Absolute vs Relative series') 

这产生了以下图表:

图示

图 4.6:威尔斯法尔戈在绝对和相对系列中丑闻爆发前一年(至今)

该图表从丑闻爆发前一年零一天开始。在绝对股价反映出即将发生的事情之前,表现不佳早已开始。相对表现提前数月折扣了绝对表现。

现在,想象一下,即使在丑闻爆发前 6 个月,你也已经开始做空富国银行了。对于那些急于寻找一个好的做空者的所有投资者来说,还有比这更好的卖点吗?没有比绝对值图表更好的营销说辞,它绘制了你根据与指数相对变化所进行的交易。想象一下,早在它们成为新闻之前,你就在所有世界上的恩隆、雷曼、通用汽车和柯达的短头位置上锚定了。

在所有人之前进入市场会给你一个安全边际。头寸不太容易受到熊市反弹的影响。然而,这只是问题的一半。在做空方面退出可能会很混乱。随着做空交易的普及,成交量逐渐减少。这就是相对方法提供决定性优势的地方。在某个时候,卖压将会结束。相对做空者有足够的时间来平仓,而他们的绝对对手则会加倍进行毒辣的攻击。股票开始表现优于市场,一开始几乎察觉不到,然后顽固地上升,最终挑衅地上升。这总会使那些依靠市场双底的绝对基本做空者措手不及。

摘要

在本章中,我们概述了从绝对 OHLC 价格转向相对系列的好处。绝对参与者是滞后指标,而相对参与者则领先一步。采用本章概述的方法的市场参与者将拥有明显的优势。他们将能够在众人之前建立和清算头寸。他们将看起来像是有先见之明的投资天才。他们将有更多的选择。他们的投资组合与市场的相关性更低,波动性也更低。这些都是投资者在寻找的特征。

一旦所有股票相对于基准在基金货币中重新计算,下一步就是根据它们的市场情况重新分类投资范围:看涨、看跌、横盘。我们将在下一章中详细介绍这一点。

第五章:制度定义

在拿破仑战争期间,资源有限的野战外科医生不得不迅速决定谁需要手术,谁可以在没有手术的情况下生存,以及那些不幸的人,无法做任何事情。分类是在有限的时间和资源中尽可能有效和人道的分配的必然产物。在股票市场上,制度是分类的另一个词。有些是看涨的,有些是看跌的,有些是不确定的。

市场往往会持续“错误”的时间比投资者坚持你的时间要长。在进行深入分析之前,将股票分为不同的制度桶——进行分类——是资源的有效分配。这种初步分类的目标不是预测股票可能会、会或者应该走向何方,而是实践已经失传的主动倾听市场的艺术。

一些市场参与者喜欢花时间和资源建立那些顽固地违背理性的股票的看跌论点。这并不是高效的,有两个原因。首先,他们期望回归均值。在多头方面,他们交易趋势并持有表现优异者,期待它们继续表现良好。与此同时,在空头方面,他们进行均值回归并期待昂贵的股票吞下“谦卑的馅饼”,再次回到廉价。

正如我们将在接下来的章节中分析的那样,趋势跟随和均值回归具有相反的回报和风险特征。长期趋势跟随和短期均值回归并不能降低风险,而是加剧了风险。暂时来说,市场参与者必须做出选择。他们要么交易预期趋势会发展的趋势,要么交易预期不规范的地方会纠正的不规范。当他们选择同时交易趋势和不规范时,他们的投资风格是不一致的。他们邀请了每种风格的最坏结果,而这种情况不出所料地往往会在最糟糕的时刻同时发生。

其次,期望股票回归本质上就像试图时机抄顶。这就像站在铁轨中间期待一列又一列货运火车停下来一样。牛市制度往往会比投资者对勇敢的耐心更长久。在放空之前,等待更多信息浮出水面并且市场趋势转为熊市是更为谨慎的做法。

作为一个不同的方法,确定市场制度是一件真正有助于基本面卖空者的事情。他们经常会过早出现。他们在更广泛市场开始考虑信息之前就下注了。卖空大师和可怕的失败之间的差距是 6 个月。在 1999 年卖空互联网股票,然后在 2000 年你就会在大学里教无聊的数学了。在 2000 年一月底就卖空同样的股票,那么一个新的卖空之星就诞生了。

在接下来的几节中,我们将查看各种制度定义方法,然后进行比较:

  • 导入库

  • 创建图表函数

  • 突破/崩溃

  • 移动平均线

  • 高高低低

  • 地板/天花板

  • 方法比较

  • 让市场制度决定最佳策略

您可以通过以下链接访问本章中所有图片的彩色版本:static.packt-cdn.com/downloads/9781801815192_ColorImages.pdf。您还可以通过本书的 GitHub 存储库访问本章的源代码:github.com/PacktPublishing/Algorithmic-Short-Selling-with-Python-Published-by-Packt

导入库

对于本章和本书的其余部分,我们将使用pandasnumpyyfinancematplotlib库。我们还将使用来自 ScientificPython 库的find_peaks

所以,请记得首先导入它们:

# Import Libraries
import pandas as pd
import numpy as np
import yfinance as yf
%matplotlib inline
import matplotlib.pyplot as plt
from scipy.signal import find_peaks 

创建绘图函数

在我们视觉上比较各种制度方法之前,让我们发布名为graph_regime_combo的彩色图表函数的源代码。随着我们逐步揭示每种方法,参数将逐渐有意义。

代码如同日本麻酱米饭一般易于消化,这是日本婴幼儿、老年人和外国人,如作者,在日本因窒息而死亡的常见原因。但结构很简单,就像作者一样。一切都取决于是否在rg变量中实例化了地板/天花板方法。如果存在地板/天花板,则它将替代其他一切。如果没有,则会打印其他两种方法(突破和移动平均线交叉)。ax1.fill_between方法标识边界。阅读所有内容以了解条件。其余部分平淡无奇:

#### Graph Regimes ####
def graph_regime_combo(ticker,df,_c,rg,lo,hi,slo,shi,clg,flr,rg_ch,                       ma_st,ma_mt,ma_lt,lt_lo,lt_hi,st_lo,st_hi):

    '''
    https://www.color-hex.com/color-names.html
    ticker,df,_c: _c is closing price
    rg: regime -1/0/1 using floor/ceiling method
    lo,hi: small, noisy highs/lows
    slo,shi: swing lows/highs
    clg,flr: ceiling/floor
    rg_ch: regime change base
    ma_st,ma_mt,ma_lt: moving averages ST/MT/LT
    lt_lo,lt_hi: range breakout High/Low LT 
    st_lo,st_hi: range breakout High/Low ST 
    '''
    fig = plt.figure(figsize=(20,8))
    ax1 = plt.subplot2grid((1,1), (0,0))
    date = df.index
    close = df[_c]
    ax1.plot_date(df.index, close,'-', color='k',  label=ticker.upper()) 
    try:
        if pd.notnull(rg):  
            base = df[rg_ch]
            regime = df[rg]

#### removed for brevity: check GitHub repo for full code ####

    for label in ax1.xaxis.get_ticklabels():
        label.set_rotation(45)
    ax1.grid(True)
    ax1.xaxis.label.set_color('k')
    ax1.yaxis.label.set_color('k')
    plt.xlabel('Date')
    plt.ylabel(str.upper(ticker) + ' Price')
    plt.title(str.upper(ticker))
    plt.legend()
#### Graph Regimes Combo #### 

现在这段致命的代码已经解决了,幸存者可以继续进行下一阶段:范围突破。

突破/突破

“风筝最高飞,逆风飞翔。”

—温斯顿·丘吉尔

这是最古老和最简单的趋势跟踪方法。它适用于牛市和熊市。如果价格在x个周期内创下新高,则为牛市。如果价格在x个周期内创下新低,则为熊市。这种方法在计算上很容易实现。

流行的持续时间是 252 个交易日(相当于 52 周)、100 个交易日和 50 个交易日。下面是这种制度方法的简单表达:

def regime_breakout(df,_h,_l,window):
    hl =  np.where(df[_h] == df[_h].rolling(window).max(),1,
                                np.where(df[_l] == df[_l].                                    rolling(window).min(), -1,np.nan))
    roll_hl = pd.Series(index= df.index, data= hl).fillna(method= 'ffill')
    return roll_hl

ticker = '9984.T' # Softbank ticker
start= '2016-12-31'
end = None
df = yf.download(tickers= ticker,start= start, end = end,                 interval = "1d",group_by = 'column',                 auto_adjust = True, prepost = True, 
                 treads = True, proxy = None)

window = 252
df['hi_'+str(window)] = df['High'].rolling(window).max()
df['lo_'+str(window)] = df['Low'].rolling(window).min()
df['bo_'+ str(window)]= regime_breakout(df= df,_h= 'High',_l= 'Low',window= window)
df[['Close','hi_'+str(window),'lo_'+str(window),    'bo_'+ str(window)]].plot(secondary_y= ['bo_'+ str(window)], 
        figsize=(20,5), style=['k','g:','r:','b-.'],        title = str.upper(ticker)+' '+str(window)+' days high/low') 

这段代码的功能很简单:

  1. 如果高点是x周期的最高点,则hl1

  2. 否则,如果低点是x周期的最低点,则hl-1

  3. 如果这些条件都不成立,则hl为 N/A。

  4. 我们想要使用fillna方法沿着缺失值传播最新值。首先,我们将numpy数组转换为pandas系列。

  5. 然后,我们使用fillna向前填充方法填充缺失值。

  6. 下载数据,运行函数,并绘制图表:

    图 5.1:软银一年最高/最低制度突破定义

当价格在整理或横盘市场之后突破时,这种范围突破策略效果非凡。横盘市场是上行或下行趋势之间的暂时期间,旧制度已死,新制度尚不明显。在横向波动的市场中,价格在一定范围内波动。

公牛与熊在一场吉尔伽美什史诗般的战斗中激烈争斗。当价格突破上界或下界时,这表明一方已经放弃了。被压抑的能量得以释放。价格毫不费力地沿着最小阻力线移动。因此,这种突破方法是范围突破/突破的首选武器。

这种方法的主要缺点是其内置的滞后性,这是由持续时间引起的。在财务修订主义的行话中,等待期被称为确认。市场参与者很少有耐心等待 50 天、100 天,甚至一年才最终找到一些解决方案。时间就是金钱。拖欠租金的股票应该被减少或者被赶走。使用这种长期持续时间的市场参与者可能希望将时间退出重新引入到他们的策略中。

这种方法的主要优点是计算简单和稳定性。主要缺点是其固有的滞后性和回撤大量利润的不适。这将我们引向下一个迭代:不对称的范围突破策略。

对突破制度定义方法的进一步完善包括为进入和退出分离的周期。例如,传奇的芝加哥海龟交易者在 50 日最高点进入,20 日最低点退出:

# CHAPTER 5 Turtle for dummies

def turtle_trader(df, _h, _l, slow, fast):
    '''
    "    _slow: Long/Short direction\n",
    "    _fast: trailing stop loss\n",
    '''
    _slow = regime_breakout(df,_h,_l,window = slow)
    _fast = regime_breakout(df,_h,_l,window = fast)
    turtle = pd. Series(index= df.index, 
                        data = np.where(_slow == 1,np.where(_fast == 1,1,0), 
                                np.where(_slow == -1, np.where(_fast ==-1,-1,0),0)))
    return turtle
slow = 50
fast = 20
ohlc = ['Open','High','Low','Close']
_o,_h,_l,_c = [ohlc[h] for h in range(len(ohlc))]
df['bo_'+ str(slow)] = regime_breakout(df,_h,_l,window = slow)
df['bo_'+ str(fast)] = regime_breakout(df,_h,_l,window = fast)
df['turtle_'+ str(slow)+str(fast)] = turtle_trader(df, _h, _l, slow, fast)
rg_cols = ['bo_'+str(slow),'bo_'+ str(fast),'turtle_'+ str(slow)+str(fast)]
df[['Close','bo_'+str(slow),'bo_'+ str(fast),'turtle_'+ str(slow)+str(fast)] ].plot(
    secondary_y= rg_cols,figsize=(20,5), style=['k','orange','g:','b-.'],
                                 title = str.upper(ticker)+' '+str(rg_cols)) 

这种不对称的持续时间使交易者能够在灵活的市场中获得小利润:

图 5.2:软银的不对称制度突破持续时间(海龟入门者策略)

上述图表显示了软银的收盘价,慢速制度突破(橙色实线),快速制度突破(绿色虚线),以及两者的组合蓝色虚点线。蓝色虚点线提供入场和出场信号。这有点难以阅读,因此我们将在下面使用一个视觉上更友好的图表。

上面概述的海龟策略是受传奇海龟交易者启发的一种基本脚本。它由两个范围突破制度组成。较慢的持续时间用于进入。较快的持续时间用于退出。这种入场和出场的不对称持续时间依赖于一项古老的原则:谨慎和审慎地确认趋势,但快速和果断地削减损失并保护利润。这最后一个制度将从现在起改名为Turtle for dummies

我们将在本书中多次使用这种基本策略来说明例子,纯粹是为了教育目的。但是,请不要在家里这样做——这对于教育目的而言是足够现实的,但过于简单,无法用于实际的盈利。

使用graph_regime_combo更直观地表示海龟入门者策略如下:

ma_st = ma_mt = ma_lt = 0
rg=lo=hi=slo=shi=clg=flr=rg_ch = None
ohlc = ['Open','High','Low','Close']
_o,_h,_l,_c = [ohlc[h] for h in range(len(ohlc))]
bo_lt = 200
bo_st = 50

lt_lo = df[_l].rolling(window= bo_lt).min()
lt_hi = df[_h].rolling(window= bo_lt).max()
st_lo = df[_l].rolling(window= bo_st).min()
st_hi = df[_h].rolling(window= bo_st).max()
graph_regime_combo(ticker,df,_c,rg,lo,hi,slo,shi,clg,flr,rg_ch,ma_st,ma_mt,ma_lt,lt_lo,lt_hi,st_lo,st_hi) 

这给出了下面的图表:

5.3:软银制度使用乌龟交易员方法。较暗的区域是较短时间范围

更长的持续时间给出了方向;长或短。这是蓝线,基于50-day的最高/最低点。更短的持续时间是止损。我们将在第七章提高您的交易优势中详细讨论止损。较短的持续时间通过缩小范围来保护利润。这样做的反面是交易频率增加。乌龟策略的这组参数在波动市场中效果不佳,正如我们在2018年整年都能看到的那样。在2019年的横向市场中,它也遇到了困难。

移动平均线交叉

移动平均线是另一种流行的制度定义方法。这种方法非常简单和普遍,以至于即使是声称从不看图表的最顽固的基本分析师,也喜欢使用200-day的简单移动平均线。这种方法也很容易计算。对于移动平均线的类型可能还有进一步的细化,从简单到指数、三角形、自适应都有。然而,原则是相同的。当快速移动平均线高于较慢的时候,制度是看涨的。当它低于较慢的时候,制度是看跌的。下面的代码展示了如何使用简单移动平均线和指数移动平均线(分别是SMAEMA)计算制度:

#### Regime SMA EMA ####
def regime_sma(df,_c,st,lt):
    '''
    bull +1: sma_st >= sma_lt , bear -1: sma_st <= sma_lt
    '''
    sma_lt = df[_c].rolling(lt).mean()
    sma_st = df[_c].rolling(st).mean()
    rg_sma = np.sign(sma_st - sma_lt)
    return rg_sma

def regime_ema(df,_c,st,lt):
    '''
    bull +1: ema_st >= ema_lt , bear -1: ema_st <= ema_lt
    '''
    ema_st = df[_c].ewm(span=st,min_periods = st).mean()
    ema_lt = df[_c].ewm(span=lt,min_periods = lt).mean()
    rg_ema = np.sign(ema_st - ema_lt)
    return rg_ema

st = 50
lt = 200
df['sma_' + str(st) + str(lt)] = regime_sma(df, _c='Close', st= st, lt= lt)
df['ema_' + str(st) + str(lt)] = regime_ema(df, _c='Close', st= st, lt= lt)

ohlc = ['Open','High','Low','Close'] 
_o,_h,_l,_c = [ohlc[h] for h in range(len(ohlc))]
rgme_cols = ['sma_' + str(st) + str(lt), 'ema_' + str(st) + str(lt),'turtle_'+ str(slow)+str(fast) ]
df[['Close','sma_' + str(st) + str(lt), 'ema_' + str(st) + str(lt),'turtle_'+ str(slow)+str(fast)] ].plot(
    secondary_y= rgme_cols,figsize=(20,8), style=['k','orange','m--','b-.'],
                                 title = str.upper(ticker)+' '+str(rgme_cols)) 

这产生了下面的图表:

5.4:软银制度使用乌龟突破,简单移动平均线和指数移动平均线

在这里,我们比较了三种制度方法。我们有我们新鲜出炉的,最好的朋友Turtle for dummies在虚线蓝线上。我们有橙色的简单移动平均线,和紫色虚线的指数移动平均线。移动平均线系列的结果是可预见的接近。指数移动平均线比简单移动平均线更具反应性。现在我们可以使用graph_regime_combo图表函数来可视化结果。

rg=lo=hi=slo=shi=clg=flr=rg_ch = None
lt_lo = lt_hi = st_lo = st_hi = 0

ma_st = df[_c].rolling(window=50).mean()
ma_mt = df[_c].rolling(window=200).mean()
ma_lt = df[_c].rolling(window=200).mean()
ohlc = ['Open','High','Low','Close']
_o,_h,_l,_c = [ohlc[h] for h in range(len(ohlc))]

graph_regime_combo(ticker,df,_c,rg,lo,hi,slo,shi,clg,flr,rg_ch,ma_st,ma_mt,ma_lt,lt_lo,lt_hi,st_lo,st_hi) 

该函数可容纳最多三个移动平均线。要获得仅具有两个移动平均线的图表,就像在这里所做的那样,请将中期和长期设置为相同的值(在这种情况下,中期和长期都设置为200)。下面是移动平均线交叉制度的可视化呈现。浅绿色和浅红色区域是制度看涨或看跌且盈利的地方。深绿色和深红色区域是制度看涨或看跌但无盈利的地方:

5.5:软银的交叉区域较暗的区域是亏损区域

这种策略在横向和波动市场中表现不佳。快速和慢速移动平均线收敛为低幅度正弦振荡的平坦线。交易频率和亏损率增加,而胜率下降。

实例化三个移动平均线的更简洁方法是通过列表推导。首先,我们创建一个移动平均变量列表。其次,我们通过列表推导实例化变量。让我们用几个列表推导来写上面的内容:

mav = [50, 200, 200]
ma_st,ma_mt,ma_lt = [df[_c].rolling(mav[t]).mean() for t in range(len(mav))]

bo = [50, 252]
st_lo,lt_lo = [df[_l].rolling(bo[t]).min() for t in range(len(bo))]
st_hi,lt_hi = [df[_h].rolling(bo[t]).max() for t in range(len(bo))]
ohlc = ['Open','High','Low','Close']
_o,_h,_l,_c = [ohlc[h] for h in range(len(ohlc))]

graph_regime_combo(ticker,df,_c,rg,lo,hi,slo,shi,clg,flr,rg_ch,ma_st,ma_mt,ma_lt,lt_lo,lt_hi,st_lo,st_hi) 

这将是这样的:

图 5.6:Softbank 交叉适用于菜鸟的海龟

这张越来越色彩缤纷的图表显示了两种制度方法的组合。不幸的是,它增加了更多的混乱而不是解决问题。市场参与者有时会试图添加多个条件,希望筛除假阳性。但不幸的是,接受随机性要比试图根除随机性更容易。

两线交叉是移动平均线交叉方法中最受欢迎的版本。较慢的线定义制度,而较短的持续时间线计时进出。最受欢迎的持续时间是 50/200,被称为黄金/死亡交叉。理论上,这种组合是有意义的。200 天是一个强大的长期衡量指标,而 50 天是一个良好的动量指标。在实践中,这种组合的命中率很差。它只适用于大的长期趋势。不幸的是,它们很少出现,因此胜率大约为 20%。其余的时间,更快的移动平均线像职业政客一样在较慢的移动平均线周围来回摇摆。

这些弱点导致移动平均线的狂热者将其发展到下一个阶段的三个移动平均线。在以下示例中,我们通过添加另一个持续时间较短的移动平均线来改进之前的 50/200 金叉移动平均线交叉。为了简单起见,我们使用 20、50 和 200 天。200 天给出了制度,而 20/50 排列给出了进出。

我们所要做的就是在以下代码中更改一个变量:

rg=lo=hi=slo=shi=clg=flr=rg_ch = None
lt_lo = lt_hi = st_lo = st_hi = 0

mav = [20, 50, 200]
ma_st,ma_mt,ma_lt = [df[_c].rolling(mav[t]).mean() for t in range(len(mav))]
ohlc = ['Open','High','Low','Close']
_o,_h,_l,_c = [ohlc[h] for h in range(len(ohlc))]

graph_regime_combo(ticker,df,_c,rg,lo,hi,slo,shi,clg,flr,rg_ch,ma_st,ma_mt,ma_lt,lt_lo,lt_hi,st_lo,st_hi) 

我们可以在下面看到产生的图表:

图 5.7:Softbank 三重移动平均线交叉

最长的持续时间决定制度。中期和短期持续时间分别计时进入和退出。与其长段落不如用以下逻辑最好地概括:

  1. 长期:当短期移动平均线最高时进入并保持长期持有,其次是中期和长期移动平均线

  2. 短期:当短期移动平均线低于中期移动平均线时进入并保持空头,中期移动平均线需要低于长期移动平均线。

  3. 否则:中性,无持仓。

这种方法可能是在遵循长期已建立的趋势和保持良好风险管理之间取得的最实际的折中。

与我们之前看到的双移动平均图不同,三移动平均线不会长时间保持错误方向。它在早期削减头寸方面做得更好。这些是无色和较短的较暗区域。另一方面,该方法的缺点是交易频率的增加。另一个缺点是该方法的固有滞后性。正如图表的中间部分所示,在横向市场中,价格会在产生信号之前朝任一方向移动相当多。

市场参与者放弃移动平均线方法的主要原因是横向市场。当市场横向波动时,移动平均线会相互振荡。这会产生许多错误的信号,这些信号倾向于侵蚀金融和情绪资本基础。在经历了几次代价高昂的错误开始后,市场参与者往往会寻找更少噪音的方法。

与调整移动平均持续时间或完全放弃该方法不同,更好的解决方案可能是调整赌注大小。在出现横向市场的第一个迹象时减小规模,然后随着趋势的增长增加权重。

更高的高点/更高的低点

这是另一种流行的方法。趋势上升的股票会创造更高的高点和更高的低点。相反,趋势下降的股票会按顺序创造更低的低点和更低的高点,因此表明持续的弱势。这种方法在直觉上是有道理的。不幸的是,统计上并不像看起来那么稳健。市场有时会打印出低/高低/高,从而使计算失效,然后恢复其行程。其次,此方法需要同时满足三个条件:

  1. 一个更低的低点。

  2. 一个更低的高点。

  3. 两个更低的低点和更低的高点条件必须按顺序满足,这只适用于有序的市场。

这三个条件必须按照精确顺序连续满足,才能使制度转为熊市。市场是随机的,比人们一般认为的更嘈杂。

此方法的主要优点是进出场。在多方面,低点买入,高点退出。在空头方面,高点卖出,低点退出。这些反向趋势的进出口使市场参与者能够获利。此外,止损在多方面明确定义为更高的低点,在空方面明确定义为更低的高点。

总的来说,这种方法的前提是合乎逻辑的。创造更高的高点和更高的低点的股票被拉向上升,反之亦然。不幸的是,这种方法在嘈杂的市场中表现不佳,那里没有清晰的高点和低点的连续性,因此我在本章中省略了代码。

以下方法使用相同的摆动高点和摆动低点以更强大的方式定义制度。它简单且统计上稳健。

地板/天花板法

该方法最初是对更高高/更低低方法的变体。每个人都直观地使用过它,然而它显然是如此明显,以至于似乎没有人费心将其形式化。与更高高/更低低方法不同,制度只需满足以下两个条件之一即可更改:

  1. 熊市:摆动高点必须明显低于峰值。

  2. 牛市:摆动低点必须明显高于底部。

即使制度转变,摆动也不必连续。例如,市场有时会飙升,然后退却并打印出一段时间的横向波动。这些时期被称为整理。直到一个摆动高点明显低于峰值,制度才会转为熊市。

经典定义始终有效,无论时间框架和资产类别如何。在牛市中,低点将明显高于底部。相反,在熊市中,高点将明显低于峰值。

随机性触发了以简洁优雅的方式处理的异常。有两种方法:

  1. 保守的

    • 如果制度是熊市的,价格越过天花板,制度就会转为牛市。

    • 如果制度是牛市的,价格越过地板,制度就会转为熊市。

  2. 积极的

    • 如果制度是熊市的,价格越过发现摆动高点,制度就会变成牛市。

    • 如果制度是牛市的,价格越过发现摆动低点,制度就会转为熊市。

这种地板/天花板方法只有两种制度:牛市或熊市。横向制度是在更广泛的牛市或熊市背景中的暂停。该方法为制度定义带来了稳定性。在实践中,没有什么比围绕移动平均线来回翻转更令人沮丧的了。稳定性使市场参与者能够更好地管理其持仓。

地板/天花板方法在概念上很简单。但是计算起来并不容易。这是一个两步过程:

  1. 摆动检测

  2. 制度定义

市场不是直线上涨的。它沿着主导趋势上下波动。它沿途标记局部高点和低点。这些被称为摆动高点摆动低点

摆动检测占了地板/天花板方法的 80%。并非所有的摆动高低点都是平等的。主要困难在于将噪音与信号分离。由于制度定义是基于摆动的,错误的摆动检测不可避免地导致错误的制度定义。

代码逻辑很简单。它依赖于两个测试:重测和距离。我们将从摆动高点到摆动低点的整个序列进行,如图 5.8所示:

  1. 价格从先前的摆动低点上升到新的高点。

  2. 价格从那个历史新高下跌。

  3. 价格重测那个历史新高,但失败了,并低于那个历史新高后的低点。

  4. 一旦价格跌破最高低点,卖方可能掌握主导地位。该算法设计为在创历史新高后不断重置到最高低点。

以下是摆动低点的等效步骤:

  1. 价格打印出最低点:第一个低点。

  2. 它反弹到第一个高点。

  3. 价格回落到其最新低点,但未能达到最低点。

  4. 价格随后开始向上走动。它要么突破第一个高点(始终是最低点后的最高点)或者打印一个较低的高点,称为最新高点。当价格收盘高于第一个或最新的高点时,这表明买家现在可能掌控着局势。

    该序列重复出现,直到价格收盘高于或低于最新的高点或低点。单独看,重新测试并不具有统计学意义。它们发生得相当频繁。当与距离测试相结合时,重新测试往往更具意义。

  5. 距离测试:这是从摆动高点到最低点的距离。此测试可以以波动率单位或百分比点单位进行。距离越远,越有可能表明趋势耗尽:

    图 5.8:摆动检测的视觉解释:距离和重新测试

现在,让我们放大看看整体情况。上图中的摆动高点是下图中的峰值:

图 5.9:楼层/天花板制度定义

次轴上的线是制度。制度在找到比底部高得多的摆动低点后变为看涨。这个摆动低点现在是制度变更线。如果价格跌破该水平,制度将变为看跌。这发生在 2020 年第一季度,此时制度变为看跌。价格再次突破该水平,制度转为看涨。价格在 2021 年初创下历史新高,随后下跌,然后反弹,但在高点之前转跌。制度变为看跌。现在是时候从多头转为空头了。然而,该问题的借贷成本昂贵得令人望而却步,因此那笔丰厚的交易未能成行。

在接下来的几节中,我们将介绍计算此内容所需的源代码。这个概念框架受到了比利时数学家本尼迪克特·曼德布罗特关于分形的开创性工作的启发。我们从一系列嘈杂的小高点和低点开始,然后使用前一系列缩小的数据。这种方法比其他方法更加计算密集。然而,结果出奇地直观。它大致分为两个阶段:摆动检测制度定义。摆动检测是一系列小函数。

摆动检测

摆动检测分为两部分:历史摆动和最后摆动调整。前两个函数,historical_swingshilo_alternation,完成了 90% 的工作。其余部分是一系列小函数,确保最后的摆动是相关的。乍一看这可能看起来有点冗长,所以我们将逐步介绍所有函数并解释它们的相关性。

历史摆动和高/低交替

让我们从下载历史价格开始。我们使用 SPY,这是标普 500 的一个代理交易所交易基金ETF),但如果您愿意,您可以尝试使用不同的代码:

# CHAPTER 5 Swing detection
ticker = 'SPY' 

start= '2016-12-31'
end = None
raw_data = round(yf.download(tickers= ticker,start= start, end = end,interval = "1d",
                 group_by = 'column',auto_adjust = True, prepost = True, 
                 treads = True, proxy = None),2)
ohlc = ['Open','High','Low','Close']
_o,_h,_l,_c = [ohlc[h] for h in range(len(ohlc))] 

接下来,我们将按顺序逐个呈现每个函数,并用图表或属性说明进展。我们从上一个函数结束的地方继续,并前进。最后,我们将一次性发布所有函数的完整总结,并发布一个图表:

#### hilo_alternation(hilo, dist= None, hurdle= None) ####
def hilo_alternation(hilo, dist= None, hurdle= None):
    i=0    
    while (np.sign(hilo .shift(1)) == np.sign(hilo)).any(): # runs until duplicates are eliminated
        # removes swing lows > swing highs
        hilo.loc[(np.sign(hilo.shift(1)) != np.sign(hilo)) & # hilo alternation test 
                 (hilo.shift(1)<0) &  # previous datapoint: high
                 (np.abs(hilo.shift(1)) < np.abs(hilo) )] = np.nan # high[-1] < low, eliminate low 

        hilo.loc[(np.sign(hilo.shift(1)) != np.sign(hilo)) &  # hilo alternation
                 (hilo.shift(1)>0) &  # previous swing: low
                 (np.abs(hilo ) < hilo.shift(1))] = np.nan # swing high < swing low[-1]

#### removed for brevity: check GitHub repo for full code ####
#### hilo_alternation(hilo, dist= None, hurdle= None) ####
#### historical_swings(df,_o,_h,_l,_c, dist= None, hurdle= None) #### 
def historical_swings(df,_o,_h,_l,_c, dist= None, hurdle= None):

    reduction = df[[_o,_h,_l,_c]].copy() 
    reduction['avg_px'] = round(reduction[[_h,_l,_c]].mean(axis=1),2)
    highs = reduction['avg_px'].values
    lows = - reduction['avg_px'].values
    reduction_target =  len(reduction) // 100

    n = 0
    while len(reduction) >= reduction_target: 
        highs_list = find_peaks(highs, distance = 1, width = 0)
        lows_list = find_peaks(lows, distance = 1, width = 0)
        hilo = reduction.iloc[lows_list[0]][_l].sub(reduction.iloc[highs_list[0]][_h],fill_value=0)

#### removed for brevity: check GitHub repo for full code ####
#### historical_swings(df,_o,_h,_l,_c, dist= None, hurdle= None) ####

df = raw_data.copy()
ohlc = ['Open','High','Low','Close']
_o,_h,_l,_c = [ohlc[h] for h in range(len(ohlc))]
rhs = ['Hi1', 'Lo1','Hi2', 'Lo2', 'Hi3', 'Lo3']
rt_hi,rt_lo,_hi,_lo,shi,slo = [rhs[h] for h in range(len(rhs))]

df= historical_swings(df,_o,_h,_l,_c,dist= None, hurdle= None)

df[[_c,rt_hi,rt_lo,_hi,_lo,shi,slo ]].plot(
    style=['grey','y.', 'c.','r.', 'g.', 'rv', 'g^'],
    figsize=(20,5),grid=True, title = str.upper(ticker))
df[[_c,shi,slo]].plot(style=['grey','rv', 'g^'],
        figsize=(20,5),grid=True, title = str.upper(ticker)) 

hilo_alternation 函数循环遍历减少的数据帧,直到系列被整齐地构成交替的高点和低点。它消除:

  1. 相邻相同方向的高点和低点:高点被赋予负号。低点有一个正号。当有两个连续的高点或低点时,最低值标记着极端点。

  2. 高于周围高点的低点。随机性无法消除:理论上,这不应该存在,但在实践中,异常仍然存在。

  3. 嘈杂的短距离高点和低点。距离测试并不完全相关,因为交替循环包含在更大的多级循环中。这是算法的分形部分,我们在缩小图像的同时寻找相同的模式。然而,该特征是一个优雅的选项,可以缩短循环的次数。

  4. 在每次迭代结束时,使用 dropna 方法减少 hilo df

historical_swings 函数采取以下步骤:

  1. 减少数据帧:复制主数据帧,并从高、低和平均值实例化一个新系列。

  2. 循环以减少数据帧。

  3. 计算两组高点和低点(通过给平均系列分配负号)。高点的唯一要求是前后的条必须较低,反之亦然。

  4. 运行 hilo_alternation 函数以减少数据帧。

  5. 填充减少的数据帧,并通过 dropna 方法进一步减少。

  6. 为每个级别填充主数据帧。当减少的长度<1% 的主数据帧,或者不再可能减少,或者经过 10 次迭代时停止。

以上代码返回了这个非常嘈杂的图表:

图 5.10:SPY 分形高点/低点 1 到 3 级

第一级是标有 Hi1 和 Lo1 的小点,位于收盘价的上方和下方。第 2 级是标有 Hi2 和 Lo2 的红色和绿色点。它不太频繁,但仍然相对嘈杂。接下来,我们真的需要识别有意义的转折点来进行分析。所以,我们上升一个级别。三角形是第 3 级。价格已经经过了两次筛选。原始数据帧已经减少了 99%。

以下图表只显示价格和 3 级数据:

图 5.11:SPY 历史摆动

最后一个三角形在最高收盘价下方。这显然是一个误报。高点显然不是最高点,也没有后跟一个低点。其余的函数将调整最后一个摆动。所以,让我们让这个误报消失:

  1. 波动高点:价格持续高于最新的波动高点。

  2. 波动低点:价格持续低于最新的波动低点。

cleanup_latest_swing() 函数从最新的波动高点和低点中移除了错误的阳性:

#### cleanup_latest_swing(df, shi, slo, rt_hi, rt_lo) ####
def cleanup_latest_swing(df, shi, slo, rt_hi, rt_lo): 
    '''
    removes false positives
    '''
    # latest swing
    shi_dt = df.loc[pd.notnull(df[shi]), shi].index[-1]
    s_hi = df.loc[pd.notnull(df[shi]), shi][-1]
    slo_dt = df.loc[pd.notnull(df[slo]), slo].index[-1] 
    s_lo = df.loc[pd.notnull(df[slo]), slo][-1] 
    len_shi_dt = len(df[:shi_dt])
    len_slo_dt = len(df[:slo_dt])

    # Reset false positives to np.nan
    for i in range(2):

        if (len_shi_dt > len_slo_dt) & ((df.loc[shi_dt:,rt_hi].max()> s_hi) | (s_hi<s_lo)):
            df.loc[shi_dt, shi] = np.nan
            len_shi_dt = 0
        elif (len_slo_dt > len_shi_dt) & ((df.loc[slo_dt:,rt_lo].min()< s_lo)| (s_hi<s_lo)):
            df.loc[slo_dt, slo] = np.nan 
            len_slo_dt = 0
        else:
            pass

    return df
#### cleanup_latest_swing(df, shi, slo, rt_hi, rt_lo) ####

df[[_c,shi,slo]].plot(style=['grey','rv', 'g^'],
        figsize=(20,5),grid=True, title = str.upper(ticker) + ' pre-adjustment')

df = cleanup_latest_swing(df, shi,slo,rt_hi,rt_lo)

df[[_c,shi,slo]].plot(style=['grey', 'rv', 'g^'],
        figsize=(20,5),grid=True, title = str.upper(ticker) + ' post-adjustment') 

代码执行以下步骤:

  1. 代码标识了最新的波动低点和高点。

  2. 识别最近的波动。

  3. 如果是错误的阳性,则指定为 N/A。

以下图表在调整前后说明了该函数从数据中移除了错误的阳性:

图 5.12:调整前的 SPY:最后的波动高点和低点是错误的阳性

图 5.13:调整后的 SPY:两个波动都被删除

这两个图表是不言自明的。最后两个三角形必须被移除。最后的波动低点由绿色三角形表示,高于前一个波动高点。此外,由于没有更低的波动低点,因此该波动高点无效。因此,当我们对最后两个波动进行一次循环时,两者都被移除。现在图表一直回溯到 2020 年 3 月的低点。接下来,我们将使用 latest_swing_variables() 函数实例化所有在后续过程中所需的变量。此函数计算将在接下来的几个函数中使用的变量。它们分别是:

  • ud: 方向,上升 +1,下降 -1

  • bs: 基础,要么是波动低点要么是高点。

  • bs_dt: 波动日期。

  • _rt: 将用于检测波动的系列名称。对于波动高点,为重新测试低位 rt_lo,对于波动低点,为重新测试高位 rt_hi

  • _swg: 用于赋值的系列;shi 表示波动高点,slo 表示波动低点。

  • hh_ll: 最低低点或最高高点。

  • hh_ll_dt: 最高高点或最低低点的日期。

我们将使用列表推导式声明变量:

#### latest_swings(df, shi, slo, rt_hi, rt_lo, _h, _l, _c, _vol) ####
def latest_swing_variables(df, shi, slo, rt_hi, rt_lo, _h, _l, _c):
    '''
    Latest swings dates & values
    '''
    shi_dt = df.loc[pd.notnull(df[shi]), shi].index[-1]
    slo_dt = df.loc[pd.notnull(df[slo]), slo].index[-1]
    s_hi = df.loc[pd.notnull(df[shi]), shi][-1]
    s_lo = df.loc[pd.notnull(df[slo]), slo][-1]

    if slo_dt > shi_dt: 
        swg_var = [1,s_lo,slo_dt,rt_lo,shi, df.loc[slo_dt:,_h].max(), df.loc[slo_dt:, _h].idxmax()]         
    elif shi_dt > slo_dt: 
        swg_var = [-1,s_hi,shi_dt,rt_hi,slo, df.loc[shi_dt:, _l].min(),df.loc[shi_dt:, _l].idxmin()]        
    else: 
        ud = 0
    ud, bs, bs_dt, _rt, _swg, hh_ll, hh_ll_dt = [swg_var[h] for h in range(len(swg_var))]   

    return ud, bs, bs_dt, _rt, _swg, hh_ll, hh_ll_dt
#### latest_swings(df, shi, slo, rt_hi, rt_lo, _h, _l, _c, _vol) ####

ud,bs,bs_dt,_rt,_swg,hh_ll,hh_ll_dt = latest_swing_variables(df,shi,slo,rt_hi,rt_lo,_h,_l,_c)

ud, bs, bs_dt, _rt, _swg, hh_ll, hh_ll_dt 

这将产生如下输出:

(1,
 213.43,
 Timestamp('2020-03-23 00:00:00'),
 'Lo1',
 'Hi3',
 452.6,
 Timestamp('2021-09-02 00:00:00')) 

上面声明的变量将在接下来的小节中使用。

确定趋势耗尽

到目前为止我们所做的工作有两个目标。我们已经检测到历史波动并对其进行了清理。然后,我们声明了我们将用于实时查找最新波动的变量。我们用于检测最终波动的方法称为重新测试。在 SPY 图表的背景下,市场从波动低点打印出最高的高点。价格稍微下跌然后回升但未能达到最高高点。价格然后穿过了最高点低位。重新测试实质上是犹豫不决。它们非常频繁。市场往往会犹豫不决。然而,当重新测试发生在持续移动的末尾时,这可能表明趋势耗尽并且可能会逆转市场方向。

此距离测试充当过滤器。此函数有两个内置测试:

  1. 表示为波动的多个波动。我们使用平均真实范围ATR)或标准偏差的度量。

  2. 作为固定百分比的距离。

函数的默认设置是没有距离测试,这将返回实际上的通过。一个成功的测试要么是-1(对于波动低点),要么是+1(对于波动高点),以及 0(对于失败的测试)。我们还将定义一个计算 ATR 的函数。这是由传奇人物威尔斯·怀尔德最初创建的经典波动性度量:

#### test_distance(ud, bs, hh_ll, vlty, dist_vol, dist_pct) ####
def test_distance(ud,bs, hh_ll, dist_vol, dist_pct): 

    # priority: 1\. Vol 2\. pct 3\. dflt
    if (dist_vol > 0):    
        distance_test = np.sign(abs(hh_ll - bs) - dist_vol)
    elif (dist_pct > 0):
        distance_test = np.sign(abs(hh_ll / bs - 1) - dist_pct)
    else:
        distance_test = np.sign(dist_pct)

    return int(max(distance_test,0) * ud)
#### test_distance(ud, bs, hh_ll, vlty, dist_vol, dist_pct) ####
#### ATR ####
def average_true_range(df, _h, _l, _c, n):
    '''
    http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:average_true_range_atr
    '''
    atr =  (df[_h].combine(df[_c].shift(), max) - df[_l].combine(df[_c].shift(), min)).rolling(window=n).mean()
    return atr

#### ATR ####

dist_vol = round(average_true_range(df,_h,_l,_c,n=63)[hh_ll_dt] * 2,2)
dist_pct = 0.05
_sign = test_distance(ud,bs, hh_ll, dist_vol, dist_pct)
_sign 

这将产生以下输出:

1 

这个距离测试验证了最新波动到最极端价格之间的距离,无论是以波动单位还是百分比点表示,都足够大以表明潜在的趋势耗尽。这个过滤器减少了虚假信号的出现。

重新测试波动

所有函数都引导我们到了这一刻:波动检测。这个小函数有着出人意料的效果。对于波动的高点或低点逻辑是对称的。因此我们将集中在波动的高点上:

  1. 检测从波动低点到最高高点。

  2. 从最高高点开始,识别最高的重新测试低点。

  3. 当价格收盘低于最高的重新测试低点时:波动高点 = 最高高点。

此方法同样适用于识别波动的低点。序列的展开如下:

  1. 检测从波动高点到最低低点。

  2. 从最低低点开始,识别最低的重新测试高点。

  3. 当价格收盘高于最低的重新测试高点时:波动低点 = 最低低点。

请注意,函数将始终重置为最高的重新测试低点。有时,价格会急剧下降,然后试图恢复一些镇定,只是后来失败了。当重置为最高的重新测试低点时,函数将毫不浪费时间地识别趋势可能已经逆转的最早时刻。

该函数还会创建系列rt(绝对值)或rrt(相对值),以显示用于检测波动的重新测试。如果你想可视化哪个重新测试被用于检测波动,这个可选功能可能会有用。

图 5.14中,这是黑点:

#### retest_swing(df, _sign, _rt, hh_ll_dt, hh_ll, _c, _swg) ####
def retest_swing(df, _sign, _rt, hh_ll_dt, hh_ll, _c, _swg):
    rt_sgmt = df.loc[hh_ll_dt:, _rt] 

    if (rt_sgmt.count() > 0) & (_sign != 0): # Retests exist and distance test met    
        if _sign == 1: # 
            rt_list = [rt_sgmt.idxmax(),rt_sgmt.max(),df.loc[rt_sgmt.idxmax():, _c].cummin()]

        elif _sign == -1:
            rt_list = [rt_sgmt.idxmin(), rt_sgmt.min(), df.loc[rt_sgmt.idxmin():, _c].cummax()]
        rt_dt,rt_hurdle, rt_px = [rt_list[h] for h in range(len(rt_list))]

        if str(_c)[0] == 'r':
            df.loc[rt_dt,'rrt'] = rt_hurdle
        elif str(_c)[0] != 'r':
            df.loc[rt_dt,'rt'] = rt_hurdle    

        if (np.sign(rt_px - rt_hurdle) == - np.sign(_sign)).any():
            df.at[hh_ll_dt, _swg] = hh_ll 
    return df
#### retest_swing(df, _sign, _rt, hh_ll_dt, hh_ll, _c, _swg) ####

df = retest_swing(df, _sign, _rt, hh_ll_dt, hh_ll, _c, _swg)
try:
    df['rt '] = df['rt'].fillna(method='ffill')
    df[bs_dt:][[_c, rt_hi, rt_lo,
        shi, slo,'rt']].plot(style=['grey', 'c.','y.',
        'rv', 'g^', 'ko'],figsize=(20,5),grid=True, title = str.upper(ticker))
except:
    df[bs_dt:][[_c, rt_hi, rt_lo,
        shi, slo]].plot(style=['grey', 'c.','y.',
        'rv', 'g^', 'ko'],figsize=(20,5),grid=True, title = str.upper(ticker)) 

在结果图表的最后一个黑点是最高的重新测试低点。请注意,当函数遇到新的高点或新的低点时会重置,因此如果运行函数时看不到它,不必担心。

图 5.14:从波动低点重新测试

只要价格持续创造新的高点,重新测试就会一路重置。途中会有虚假的信号,但这是旅程的一部分。

一些读者可能不同意重新测试的方法,无论原因是什么。因此,我们介绍了一种替代的波动检测方法。

回撤波动

这个函数是重新测试方法的一种替代。它完全依赖于从极值的回撤。这种方法的主要优点是概念上的简单性。一旦价格朝着相反的方向移动足够远,通常可以安全地得出波动已经出现的结论。然而,这个工具是比较直接的。它通常有效,但在横盘或者波动性很大的市场中失败:

  1. 计算从极值到极值的回撤,即从顶部的最小值或底部的最大值。

  2. 距离测试以波动率单位或百分点计算。

这个函数在重测不及时出现时充当救命稻草:

#### retracement_swing(df, _sign, _swg, _c, hh_ll_dt, hh_ll, vlty, retrace_vol, retrace_pct) 
def retracement_swing(df, _sign, _swg, _c, hh_ll_dt, hh_ll, vlty, retrace_vol, retrace_pct):
    if _sign == 1: #
        retracement = df.loc[hh_ll_dt:, _c].min() - hh_ll

#### removed for brevity: check GitHub repo for full code ####
#### retracement_swing(df, _sign, _swg, _c, hh_ll_dt, hh_ll, vlty, retrace_vol, retrace_pct) ####

vlty = round(average_true_range(df=df, _h= _h, _l= _l, _c= _c , n=63)[hh_ll_dt],2)
dist_vol = 5 * vlty
dist_pct = 0.05
_sign = test_distance(ud,bs, hh_ll, dist_vol, dist_pct)
df = retest_swing(df, _sign, _rt, hh_ll_dt, hh_ll, _c, _swg)
retrace_vol = 2.5 * vlty
retrace_pct = 0.05
df = retracement_swing(df,_sign,_swg,_c,hh_ll_dt,hh_ll, vlty,retrace_vol, retrace_pct)

df[[_c,_hi,_lo,shi,slo]].plot(
    style=['grey','r.', 'g.', 'rv', 'g^'],
    figsize=(20,5),grid=True, title = str.upper(ticker))

df[[_c,shi,slo]].plot(style=['grey','rv', 'g^'],
            figsize=(20,5),grid=True, title = str.upper(ticker)) 

这创建了以下图形:

图 5.15:回撤摆动函数等级 2 和 3

图 5.16:回撤摆动函数摆动高点和低点

这个最终函数在市场剧烈波动时起到了救命稻草的作用。两个函数(retest 和 retracement)可以同时使用。

因此,我们经历了所有这些冗长的代码,得出了一些有意义的数据点,称为摆动高点低点。接下来,我们将使用这些摆动作为制度检测的依据。

将所有内容汇总:制度检测

让我们通过所有功能进行快速回顾。为了展示功能的多样性,我们将稍微调整一下事物。首先,我们再次发布相对函数的代码。然后,我们将在绝对情况下运行 SPY,然后将其与 ONEQ(纳斯达克的代理 ETF)进行比较。

我们将绘制三个图表,显示最佳配置资金的位置:

### RELATIVE
def relative(df,_o,_h,_l,_c, bm_df, bm_col, ccy_df, ccy_col, dgt, start, end,rebase=True):
    '''
    df: df
    bm_df, bm_col: df benchmark dataframe & column name
    ccy_df,ccy_col: currency dataframe & column name
    dgt: rounding decimal
    start/end: string or offset
    rebase: boolean rebase to beginning or continuous series
    '''
#### removed for brevity: check GitHub repo for full code ####
### RELATIVE ###
bm_df = pd.DataFrame()
bm_col = 'ONEQ'
ccy_col = 'USD'
dgt= 3
bm_df[bm_col] = round(yf.download(tickers= bm_col,start= start, end = end,interval = "1d",
                 group_by = 'column',auto_adjust = True, prepost = True, 
                 treads = True, proxy = None)['Close'],2)
bm_df[ccy_col] = 1

df = raw_data.copy()
ohlc = ['Open','High','Low','Close']
_o,_h,_l,_c = [ohlc[h] for h in range(len(ohlc))]
rhs = ['Hi1', 'Lo1','Hi2', 'Lo2', 'Hi3', 'Lo3']
rt_hi,rt_lo,_hi,_lo,shi,slo = [rhs[h] for h in range(len(rhs))]
df= relative(df,_o,_h,_l,_c, bm_df, bm_col, ccy_df=bm_df, 
            ccy_col=ccy_col, dgt= dgt, start=start, end= end,rebase=True)

for a in np.arange(0,2):  
    df = historical_swings(df,_o,_h,_l,_c, dist= None, hurdle= None)
    df = cleanup_latest_swing(df, shi, slo, rt_hi, rt_lo)
    ud, bs, bs_dt, _rt, _swg, hh_ll, hh_ll_dt = latest_swing_variables(df, shi, slo,rt_hi,rt_lo,_h, _l,_c)
    vlty = round(average_true_range(df=df, _h= _h, _l= _l, _c= _c , n=63)[hh_ll_dt],2)
    dist_vol = 5 * vlty
    dist_pct = 0.05
    _sign = test_distance(ud,bs, hh_ll, dist_vol, dist_pct)
    df = retest_swing(df, _sign, _rt, hh_ll_dt, hh_ll, _c, _swg)
    retrace_vol = 2.5 * vlty
    retrace_pct = 0.05
    df = retracement_swing(df,_sign,_swg,_c,hh_ll_dt,hh_ll, vlty,retrace_vol, retrace_pct)
    rohlc = ['rOpen','rHigh','rLow','rClose']
    _o,_h,_l,_c = [rohlc[h] for h in range(len(rohlc)) ]
    rrhs = ['rH1', 'rL1','rH2', 'rL2', 'rH3', 'rL3']
    rt_hi,rt_lo,_hi,_lo,shi,slo = [rrhs[h] for h in range(len(rrhs))] 

让我们来看看此代码涉及的关键步骤:

  1. 我们实例化基准 ONEQ。货币是 USD

  2. 我们通过复制原始数据来实例化 df。我们运行两个列表推导式来声明变量。

  3. 我们运行相对函数以获取相对价格。

  4. for 循环将在绝对系列上运行一次。在第一次运行结束时,我们运行两个列表推导式来声明相对变量。

  5. 在第二个循环中,绝对变量被相对变量替换。一切都是对称的。参数保持不变。唯一改变的是输入系列。

最后,我们打印四张图表:

df[['Close','Hi1','Lo1','Hi2','Lo2','Hi3','Lo3']].plot(style=['grey','y.', 'c.','r.', 'g.', 'rv', 'g^'],
    figsize=(20,5),grid=True, title = str.upper(ticker))
df[['Close','Hi3','Lo3']].plot(
    style=['grey', 'rv', 'g^'],
    figsize=(20,5),grid=True, title = str.upper(ticker))

df[['Close','Hi3','Lo3',_c,shi,slo]].plot(
    style=['grey','rv', 'g^','k:','mv','b^'],
            figsize=(20,5),grid=True, title = str.upper(ticker)+' vs '+str.upper(bm_col))
rohlc = ['rOpen','rHigh','rLow','rClose']
_o,_h,_l,_c = [rohlc[h] for h in range(len(rohlc)) ]

df[[_c,shi,slo]].plot(
    style=['k:','mv','b^'],
            figsize=(20,5),grid=True, title = str.upper(ticker)+' vs '+str.upper(bm_col)) 

第一个是圣诞树状的图表,有很多小点:

图 5.17:带有高/低等级 1 到 3 的 SPY

所有信息都在。图表很杂乱。第二个是一个干净的 SPY 图表:

图 5.18:带有摆动高点和低点的 SPY

这是一张干净的 SPY 图表。误报已被清除。现在是时候进行大结局了;SPY 对比 ONEQ

图 5.19:SPY 的绝对和相对 ONEQ

SPY 明显表现不及 ONEQ,这意味着标准普尔 500 指数连续几年表现不及纳斯达克。相对价值的波动往往与绝对价值的波动相呼应。有趣的是,看第四张也是最后一张图表,似乎相对价值已经触底,意味着最后的摆动低点似乎明显高于最低点:

图 5.20:SPY 是否最终触底对 ONEQ?

当我们打印相对图表时,似乎最后一个波动低点可能要高于最低点。这意味着相对图表可能已经触底。这可能是标普 500 可能开始跑赢纳斯达克的早期迹象。这很好地引导我们进入下一节关于地板/天花板制度定义的内容。

制度定义

熊市在新低显著高于最低点时结束。在某一点上,市场将会出现底部。随后的每一个低点都会定格得更高。将所有低点与底部进行比较。一旦以波动调整单位或甚至百分点来表达的距离足够宽,市场就找到了一个支撑。在执行交易员的英文中,如果所有卖方的悲观情绪都无法突破最低点,那么市场就不再是熊市。

牛市在所有涨势都回落到顶部以下时结束。在某一点上,市场将会出现顶部。如果每次后续的涨势都在顶部以下落定,市场就找到了天花板。在执行交易员的英文中,如果所有的看涨情绪都无法达到高点,那么这个牛市就结束了。当找到天花板时,市场可能会转为横盘或熊市。相反,当找到地板时,市场可能会转为横盘或牛市。

公式是从峰值/谷底到随后波动高点/低点的距离的z-分数。z-分数是以波动性单位(ATR、标准偏差、已实现或隐含)表示的增量。下面的代码可能看起来有点冗长。然而,原则上是概念上简单的。

经典的牛市制度定义如下:

  1. 寻找天花板:搜索窗口从地板开始。

  2. 测量当前波动与天花板的距离:ceiling_test = (swing_high[i]-top)/stdev[i]

  3. 如果到天花板的距离小于x个标准偏差,那么制度已经转为熊市。

经典的熊市制度定义如下:

  1. 寻找地板:搜索窗口从天花板开始。

  2. 测量当前波动与底部的距离:floor_test = (swing_low[i]-bottom)/stdev[i]

  3. 如果到地板的距离大于x个标准偏差,那么制度已经转为牛市。

地板/天花板函数的代码是本章的精华部分。该函数如下:

#### regime_floor_ceiling(df, hi,lo,cl, slo, shi,flr,clg,rg,rg_ch,stdev,threshold) ####
def regime_floor_ceiling(df, _h,_l,_c,slo, shi,flr,clg,rg,rg_ch,stdev,threshold):
    # Lists instantiation
    threshold_test,rg_ch_ix_list,rg_ch_list = [],[], []
    floor_ix_list, floor_list, ceiling_ix_list, ceiling_list = [],[],[],[]

    ### Range initialisation to 1st swing
    floor_ix_list.append(df.index[0])
    ceiling_ix_list.append(df.index[0])

    ### Boolean variables
    ceiling_found = floor_found = breakdown = breakout = False

    ### Swings lists
    swing_highs = list(df[pd.notnull(df[shi])][shi])
    swing_highs_ix = list(df[pd.notnull(df[shi])].index)
    swing_lows = list(df[pd.notnull(df[slo])][slo])
    swing_lows_ix = list(df[pd.notnull(df[slo])].index)
    loop_size = np.maximum(len(swing_highs),len(swing_lows))

    ### Loop through swings
    for i in range(loop_size): 

        ### asymetric swing list: default to last swing if shorter list
#### removed for brevity: check GitHub repo for full code ####

         ### CLASSIC CEILING DISCOVERY
#### removed for brevity: check GitHub repo for full code ####

        ### EXCEPTION HANDLING: price penetrates discovery swing
#### removed for brevity: check GitHub repo for full code ####
        ### CLASSIC FLOOR DISCOVERY        
#### removed for brevity: check GitHub repo for full code ####

        ### EXCEPTION HANDLING: price penetrates discovery swing
#### removed for brevity: check GitHub repo for full code #### 
    ### POPULATE FLOOR,CEILING, RG CHANGE COLUMNS
#### removed for brevity: check GitHub repo for full code ####

#### regime_floor_ceiling(df, hi,lo,cl, slo, shi,flr,clg,rg,rg_ch,stdev,threshold) ####
ohlc = ['Open','High','Low','Close']
_o,_h,_l,_c = [ohlc[h] for h in range(len(ohlc))]
rg_val = ['Hi3','Lo3','flr','clg','rg','rg_ch',1.5]
slo, shi,flr,clg,rg,rg_ch,threshold = [rg_val[s] for s in range(len(rg_val))]
stdev = df[_c].rolling(63).std(ddof=0)
df = regime_floor_ceiling(df,_h,_l,_c,slo, shi,flr,clg,rg,rg_ch,stdev,threshold)

df[[_c,'Hi3', 'Lo3','clg','flr','rg_ch','rg']].plot(    style=['grey', 'ro', 'go', 'kv', 'k^','c:','y-.'],     secondary_y= ['rg'],figsize=(20,5),    grid=True, title = str.upper(ticker)) 

在这个令人生畏的冗长代码背后是简单的逻辑。让我们来看看它的主要表达。基本上有两种逻辑:

  1. 经典地板和天花板发现:我们循环遍历波动,以识别高点和随后下降的波动高点,以及低点和上升的波动低点。这种设置在代码内部被称为经典地板和天花板发现。

  2. 异常处理:当价格穿透发现波动时发生:

    • 初始穿透:对于地板,我们寻找自发现波动低点以来的最低点。对于天花板,我们寻找自发现波动高点以来的最高点。制度被重置为以前的主导制度。

    • 回归:有时价格会反弹。这种来回异常处理确保了制度对随机性的良好响应。

  3. 循环结束后,列将被填充。

在做出这些澄清之后,啊哈!地板/天花板制度是次要* y *轴上的虚线水平线。这种制度方法是稳定的定义:

图 5.21:SPY 收盘价和地板/天花板看涨制度

制度在整个时期内保持看涨状态。市场“遇到了一个软弱期”,在 2020 年初。制度甚至没有眨眼。这并不意味着这种制度定义没有响应。这并不意味着市场参与者应该“买了就盼望”。这只是制度没有改变。这种稳定性使市场参与者能够以冷静、镇定的方式表达策略并管理风险。

方法比较

“学会选择是困难的。学会做出好选择更困难。而在一个选择无限可能性的世界中学会做出好选择更加困难。”

– 巴里·施瓦茨关于选择悖论的看法

2004 年,巴里·施瓦茨用我们一直以来直觉感受到的事情震惊了世界。我们已经概述了一些方法。让我们用图形方式进行比较,并希望赢家会在视觉上脱颖而出。

首先,让我们单独打印地板/天花板。小点是一级。大点是二级。黑色三角形是地板。阴影是制度的长度。它从第一个摆动低点开始一直延伸到右边。即使是大流行的“软弱期”也没有对此造成影响。这是尽可能稳定的:

图 5.22:SPY 地板/天花板看涨制度永远

这可能被认为对市场的波动没有响应,而在某种程度上确实如此。在 2020 年第一季度,世界似乎正在以 AC/DC 的谚语“通往地狱的高速公路”为目标。然而,这种制度并没有动摇。它可能在 2020 年 5 月底的上升期间闪烁着熊市的迹象,但很快又恢复成罗伯特·德尼罗式的“暴牛”市场。这既不是好事也不是坏事。这只是这种制度方法的运作方式。绝大多数市场参与者都是长期的趋势追随者。他们想要购买的东西,是要将来与他们的菲利普·帕特克手表收藏一起传给子孙后代的。

这并不意味着他们在接下来的十年里什么都不做。市场参与者经常在市场崩盘时加仓,这被称为弱势买入。这是实现这一完美制度定义方法的绝佳途径。这种制度检测方法的无与伦比的稳定性为长期背景环境设定了基调。制度要么是看涨的,要么是看跌的。然后,市场参与者可以根据主导制度叠加各种策略,无论是“在弱势买入”还是“在强势卖出”。

更重要的是,沃伦·巴菲特说过,当街上流血时我们应该买入。当市场像石头一样下跌,我们的边缘脑感到困惑时,这并不容易做到。这就是这种制度方法带来的所需的安心感,以便采取行动。

其次,我们打印出移动平均和范围突破的制度方法:

ohlc = ['Open','High','Low','Close']
_o,_h,_l,_c = [ohlc[h] for h in range(len(ohlc))]
mav = [20, 50, 200]
ma_st,ma_mt,ma_lt = [df[_c].rolling(mav[t]).mean() for t in range(len(mav))]

bo = [50, 252]
st_lo,lt_lo = [df[_l].rolling(bo[t]).min() for t in range(len(bo))]
st_hi,lt_hi = [df[_h].rolling(bo[t]).max() for t in range(len(bo))]

rg=lo=hi=slo=shi=clg=flr=rg_ch = None
graph_regime_combo(ticker,df,_c,rg,lo,hi,slo,shi,clg,flr,rg_ch,ma_st,ma_mt,ma_lt,lt_lo,lt_hi,st_lo,st_hi)

rg_combo = ['Close','rg','Lo3','Hi3','Lo3','Hi3','clg','flr','rg_ch']
_c,rg,lo,hi,slo,shi,clg,flr,rg_ch =[rg_combo[r] for r in range(len(rg_combo)) ]

graph_regime_combo(ticker,df,_c,rg,lo,hi,slo,shi,clg,flr,rg_ch,ma_st,ma_mt,ma_lt,lt_lo,lt_hi,st_lo,st_hi) 

这将产生以下两个图表:

图 5.23:SPY 制度突破和移动平均线交叉

变量故意比普通市场参与者的耐心长得多。范围突破设置为 252 天突破和 50 天止损。三重移动平均线具有著名的黄金交叉和 20 天入场/出场。这些变量是故意校准的,用于长期趋势。它们不应像参议员那样来回摇摆。然而,在路上还是有一些变化。

第二个图表叠加了地板/天花板方法。这是从第一个波动到图表结束的最浅的蓝色:

图 5.24:SPY 地板/天花板、突破和移动平均线交叉制度

上述图表将所有三种方法结合在一个简洁的可视化中。地板/天花板是最浅的蓝色。请注意,地板/天花板制度优先于所有其他方法。除非地板/天花板制度改变,否则使用范围突破或移动平均线交叉方法的看跌阶段不会反映出来。

最重要的一点是,地板/天花板方法提供了建立策略的稳定基础。知道市场仍然看涨并且应该买入低点有巨大的价值。其他任何方法都不提供这种稳定水平。机构投资者进行大额交易。进出会侵蚀盈利能力。这就是为什么他们会重视稳定性而不是准确性。当条件改变时,他们改变主意。在那之前,这是正常的戏剧。市场参与者可以根据自己的意愿制定策略。它可以是波动检测、移动平均线、范围突破或风险反转。唯一重要的是知道市场仍然处于看涨领域。

对于更喜欢行动而不是耐心的市场参与者,有两种方法可以加速地板/天花板方法。它依赖于波动。增加波动次数,制度就会机械地更紧张。

  • 方法 1:使用 2 级而不是 3 级波动。3 级过滤掉很多噪音。这也使其不太敏感。如果你不介意噪音,就继续

  • 方法 2:更快的周期性。这些数据是在日间柱状图时间段上处理的。保持相同的三级别,但将周期性加速到 4 小时。这第二种方法给出了一些迷人的结果。尝试以 1-5 分钟的间隔下载数据。处理摆动检测序列,并观察分形图在日间柱状图上绘制出几乎完美的图像。警告:这种方法对历史数据效果很好,但会产生大量错误的正面结果。因此,我们没有生成数据来推广这种方法

上述股票是做多的一个例子。在一本关于卖空的书中看起来有点不协调。然而,来自多头的市场参与者更容易传达这个信息。这种方法在卖空方面严谨对称。因此,现在是重新审视我们所钟爱的富国银行例子的时候了。我们将在绝对和相对于标普 500 的情况下运行该序列,并发布相应的图表:

params = ['2014-12-31', None, 63, 0.05, 0.05, 1.5, 2]
start, end, vlty_n,dist_pct,retrace_pct,threshold,dgt= [params[h] for h in range(len(params))]

rel_var = ['^GSPC','SP500', 'USD']
bm_ticker, bm_col, ccy_col = [rel_var[h] for h in range(len(rel_var))]
bm_df = pd.DataFrame()
bm_df[bm_col] = round(yf.download(tickers= bm_ticker,start= start, end = end,interval = "1d",
                 group_by = 'column',auto_adjust = True, prepost = True, 
                 treads = True, proxy = None)['Close'],dgt)
bm_df[ccy_col] = 1

ticker = 'WFC'
df = round(yf.download(tickers= ticker,start= start, end = end,interval = "1d",
                 group_by = 'column',auto_adjust = True, prepost = True, 
                 treads = True, proxy = None),2)
ohlc = ['Open','High','Low','Close']
_o,_h,_l,_c = [ohlc[h] for h in range(len(ohlc))]
df= relative(df=df,_o=_o,_h=_h,_l=_l,_c=_c, bm_df=bm_df, bm_col= bm_col, ccy_df=bm_df, 
            ccy_col=ccy_col, dgt= dgt, start=start, end= end,rebase=True)

df[['Close','rClose']].plot(figsize=(20,5),style=['k','grey'],
                           title = str.upper(ticker)+ ' Relative & Absolute') 

这将生成如下图表:

图 5.25:富国银行绝对和相对于标普 500 的情况

上述代码是我们在前面章节已经见过的重复内容。接下来,我们将运行该序列。值得注意的一点是,关于基准和货币的计算优先于单只股票的计算。如果您想在整个投资范围内运行相同的计算,只需插入一个循环以迭代股票代码。

接下来,我们将摆动检测和制度定义运行两次。首先,我们在绝对系列上运行它。在循环结束时,我们将变量重新初始化为相对系列。然后我们在相对系列上运行序列:

swing_val = ['rg','Lo1','Hi1','Lo3','Hi3','clg','flr','rg_ch']
rg,rt_lo,rt_hi,slo,shi,clg,flr,rg_ch = [swing_val[s] for s in range(len(swing_val))]

for a in np.arange(0,2):    
    df = round(historical_swings(df,_o,_h,_l,_c, dist= None, hurdle= None),2)
    df = cleanup_latest_swing(df,shi,slo,rt_hi,rt_lo)
    ud, bs, bs_dt, _rt, _swg, hh_ll, hh_ll_dt = latest_swing_variables(df, 
            shi,slo,rt_hi,rt_lo,_h,_l, _c)
    vlty = round(average_true_range(df,_h,_l,_c, n= vlty_n)[hh_ll_dt],2)
    dist_vol = 5 * vlty
    _sign = test_distance(ud,bs, hh_ll, dist_vol, dist_pct)
    df = retest_swing(df, _sign, _rt, hh_ll_dt, hh_ll, _c, _swg)
    retrace_vol = 2.5 * vlty
    df = retracement_swing(df, _sign, _swg, _c, hh_ll_dt, hh_ll, vlty, retrace_vol, retrace_pct)
    stdev = df[_c].rolling(vlty_n).std(ddof=0)
    df = regime_floor_ceiling(df,_h,_l,_c,slo, shi,flr,clg,rg,rg_ch,stdev,threshold)    

    rohlc = ['rOpen','rHigh','rLow','rClose']
    _o,_h,_l,_c = [rohlc[h] for h in range(len(rohlc)) ]
    rswing_val = ['rrg','rL1','rH1','rL3','rH3','rclg','rflr','rrg_ch']
    rg,rt_lo,rt_hi,slo,shi,clg,flr,rg_ch = [rswing_val[s] for s in range(len(rswing_val))] 

我们之前已经解释了所有这些功能。现在,序列被打包在一个代码块中。在附录中,我们将以更加优雅的方式重新打包这一点,使用一个函数。最后,我们打印色彩缤纷的图表,以表示绝对和相对的制度:

ma_st = ma_mt = ma_lt = lt_lo = lt_hi = st_lo = st_hi = 0

rg_combo = ['Close','rg','Lo3','Hi3','Lo3','Hi3','clg','flr','rg_ch']
_c,rg,lo,hi,slo,shi,clg,flr,rg_ch =[rg_combo[r] for r in range(len(rg_combo)) ]
graph_regime_combo(ticker,df,_c,rg,lo,hi,slo,shi,clg,flr,rg_ch,ma_st,ma_mt,ma_lt,lt_lo,lt_hi,st_lo,st_hi)

rrg_combo = ['rClose','rrg','rL3','rH3','rL3','rH3','rclg','rflr','rrg_ch']
_c,rg,lo,hi,slo,shi,clg,flr,rg_ch =[rrg_combo[r] for r in range(len(rrg_combo)) ]
graph_regime_combo(ticker,df,_c,rg,lo,hi,slo,shi,clg,flr,rg_ch,ma_st,ma_mt,ma_lt,lt_lo,lt_hi,st_lo,st_hi) 

所有其他参数都已经静音。代码将打印两个图表。我们只想查看绝对和相对的地板/天花板制度。首先,我们将打印绝对系列:

图 5.26:富国银行的绝对地板/天花板制度

这张图是一个很好的例子,因为它显示了这个制度并不是万能的。地板/天花板方法并不是对随机性的通用治疗方法。在多头阶段有亏损期。这意味着制度定义并不能替代风险管理。接下来,我们打印富国银行相对于标普 500 的情况:

图 5.27:富国银行相对于标普 500 的地板/天花板制度

再次强调,富国银行并非长期表现不佳。它有着短暂的辉煌时刻,在夕阳下“升起和闪耀”,然后再次滑入漫长的下降。正如最后一个摆动低点所示,制度甚至可能已经转为看涨。也许这一次,超额表现可能更具可持续性。

在底部或顶部后时间最佳入场点的时机

“投资者为了修正,或试图预测修正而损失的资金远远超过了修正本身的损失。”

– 彼得·林奇

第一个问题是,想要通过预期体制变化来保护自己收益的市场参与者长期来看往往会亏钱。如果有一位“专家”走到你面前说:“你下周会生病。你将生病三个月。你将在这一天痊愈。”你可能会觉得他们已经丢失了 L 码的锡箔帽子!

然而,在市场上,我们注意到这种不断的“金钱狂欢”(记住我们在第二章中的关键字,“关于做空的 10 个经典神话”)。市场大师擅长顶部和底部的时机。事实上,他们已经 39 次无误地掌握了最近的 2 次熊市!然而,预测顶部和底部是愚人的游戏。在底部和顶部之间有成千上万的日子。你可以错过头 50 天,仍然能抓住大行情。地板/天花板方法不会在顶峰时让你离场。它将以合理的准确度使你在可能的最高点进入空头头寸。

看穿基本新闻流

第二个问题出现在基本新闻流跟上市场走势时。基本信息在市场顶部看起来强劲,在市场底部看起来疲软。它报告过去的数字,如月销售额、订单等。与此同时,市场往往是前瞻性的。市场参与者会陷入“确认偏见”:他们已经拥有了他们需要加倍头寸或放弃的所有基本证据。

这种地板和天花板方法是一种客观的评估是否是时候保持乐观态度还是采取更为防御性立场的方式。这种方法有几个优点。首先,稳定性带来可靠性。例如,自 2008 年危机爆发以来的十多年里,标普 500 指数的体制只在两次转变为多头至横盘熊市。每次,不到 3 个月后,体制就恢复为多头。

将此与价格在 200 日移动平均线附近翻转了 20 多次的情况相比。这种稳定水平为市场参与者带来了更高的信心。在体制改变之前,每次回调都是一个买入机会。

这种方法还带来了清晰度。它让我们免受我们的理性愚蠢之苦。在某些时候,我们都遇到过一支股票,我们认为:“这个涨得太多了,是时候做空了。”嗯,这往往发生在多头体制的股票上。或者,我们可能会说:“这跌得太多了,是时候买入了。”这也往往发生在熊市股票上。体制带来了清晰度:买入多头并对冲,卖出空头并对冲。

识别转折点

地板/天花板方法的优势在于转折点。我们长期以来认为,牛市需要结束才能开始熊市,反之亦然。通过这种方法,熊市在牛市结束时开始,反之亦然。其中的微妙之处是昂贵的。它允许市场参与者在一个制度过渡到下一个制度时定位自己。

兴奋的市场参与者常常在顶峰过后仍保持乐观,而在谷底过后仍感沮丧。在我们左右耳垂之间的尖叫声中,我们常常无法听到市场悄悄地低语。

最难确定的是何时清算盈利头寸。这种方法足够强大,可以让尤利西斯系在理性的桅杆上,越过市场的塞壬。好消息是,这种方法在逻辑上是准确的。熊市在新的进展回落到地板以下时开始。牛市在新的低点保持在天花板以上时开始。

让市场制度决定最佳策略。

“当你排除了一切不可能的情况,那么无论剩下的是多么不可能,都必须是真相。”

——阿瑟·柯南·道尔

多年来,我逐渐相信绩效的两个主要决定因素是头寸规模和市场制度。交易过大可能会让你破产。交易过小则没有生意可做。其次,经验丰富的市场参与者通常有几种策略来应对不同的市场类型。

困难在于何时使用哪种策略,更重要的是何时淡化它们。这归结于制度的定义。地板/天花板方法可能会改变你交易市场的方式。

有两种类型的策略:均值回归和趋势跟踪。均值回归在范围限定的市场中效果最好。价格以一种半可预测的方式围绕均值波动。均值回归策略在趋势市场中表现不佳。趋势跟踪策略在牛市或熊市中表现良好,但在横向市场中会失去收益。

在牛市结束时,当找到天花板时,市场可以横向或熊。并非所有的夏季牛市者都会在同一天醒来穿上他们的冬季熊市服装。假设市场将会横向运行,直到“黄金交易者”(那些智商比黄金还要厚重的落后者)意识到熊市占据主导地位。相反,当找到地板时,需要时间来处理熊市的创伤经历,并为新生的牛市做好定位。

一旦找到地板或天花板,假设市场会横向运行,或者在一个范围内交易,直到有证据表明它走向熊市或恢复其牛市趋势。暂停趋势交易,开始均值回归。一旦有证据表明新的趋势出现,并且市场创出低点/高点或突破范围,重新激活趋势交易,暂停均值回归。

对于长期持有者来说,对称通常是一个陌生的概念。市场参与者都以对称为理想出发,但很快意识到他们的多头规则在空头方面表现不佳。毕竟,多头方向行动缓慢且通常安静,而空头方向则快节奏且易变。然后,他们开始制定两套规则,分别应对每一方。通常,这在两个规则同时有效且股票可能是多头或空头的最糟糕的时候发生。这通常发生在最糟糕的时候:当绩效开始下降时。绩效下降不利于清晰思考。在这一点上,市场参与者倾向于坚定信念、故事或复杂的风险管理。对称避免了冲突的规则。它要么是多头,要么是空头,绝不会两者兼而有之。

让市场制度决定策略。地板/天花板方法为每个制度变化提供了客观的起点和终点:天花板、范围和地板。一旦你知道更广泛的制度应该是看涨、看跌还是横盘,就更容易设计适合每个篮子的策略。通过正确的制度定义和头寸大小,即使是一种平庸的策略也可以有积极的优势。

总结

我们已经研究了几种市场制度方法,这些方法将帮助你捕捉到市场上升或下降的信号。制度突破和移动平均线交叉是趋势跟踪交易员工具箱中的基本工具。持续时间与风格一样重要,就像市场恰好奖励的内容一样。然后,我们介绍了地板/天花板方法。这种制度定义方法适用于绝对和相对系列。它是对称的,最重要的是比任何其他方法更稳定。因此,它超越了一切。

然而,制度定义方法并不是互斥的。例如,地板/天花板方法可以用于确定交易的方向,多头或空头。然后,制度突破可以用于在整理或横盘市场后进入。最后,移动平均线交叉可以用于退出持仓。

有信号是一回事。将其转化为具有强大统计优势的盈利策略是另一回事。在卖空方面没有盈利等价物的"买入并持有"心态。卖空就像综合格斗。那个腰带会索取一部分代价。因此,我们将在第二部分,外部游戏:打造强大的交易优势中的其余时间里努力实现这一目标;建立强大的交易优势。