Dual Thrust交易策略

介绍

Dual Thrust系统是 Michael Chalek 在80 年代开发的 Dual Thrust。在自动化交易排名中,目前为止,仍然排名第二左右。Dual Thrust系统具有简单易用、适用度广的特点,其思路简单、参数很少,配合不同的参数、止盈止损和仓位管理,可以为投资者带来长期稳定的收益,被投资者广泛应用于股票、货币、贵金属、债券、能源及股指期货市场等。
在Dual Thrust交易系统中,对于震荡区间的定义非常关键,这也是该交易系统的核心和精髓。Dual Thrust系统使用Range = Max(HH-LC,HC-LL)来描述震荡区间的大小。其中HH是N日High的最高价,LC是N日Close的最低价,HC是N日Close的最高价,LL是N日Low的最低价。
它的逻辑原型是较为常见的日内交易策略之一开盘区间突破策略,以今日开盘价加减一定比例的昨日振幅,确定上下轨。日内突破上轨时平空做多,突破下轨时平多做空。

开盘区间突破策略基本原理

1. 在今天的收盘,计算两个值:最高价-收盘价,和收盘价-最低价。然后取这两个值较大的那个,乘以k值0.7。把结果称为触发值。
2. 在明天的开盘,记录开盘价,然后在价格超过(开盘+触发值)时马上买入,或者价格低于(开盘-触发值)时马上卖空。
3. 没有明确止损。这个系统是反转系统,也就是说,如果在价格超过(开盘+触发值)时手头有一口空单,则买入两口。同理,如果在价格低于(开盘-触发值)时手上有一口多单,则卖出两口。

首先计算:
(1)N日High的最高价HH, N日Close的最低价LC;
(2)N日Close的最高价HC,N日Low的最低价LL;
(3)Range = Max(HH-LC,HC-LL)
(4)BuyLine = Open + K1*Range
(5)SellLine = Open + K2*Range
构造系统:
(1)当价格向上突破上轨时,如果当时持有空仓,则先平仓,再开多仓;如果没有仓位,则直接开多仓;
(2)当价格向下突破下轨时,如果当时持有多仓,则先平仓,再开空仓;如果没有仓位,则直接开空仓;

Dual Thrust在开盘区间突破策略上进行了相关改进:

1、在范围(range)的设置上,引入前N日的四个价位,使得一定时期内的范围相对稳定,可以适用于日间的趋势跟踪;
2、Dual Thrust对于多头和空头的触发条件,考虑了非对称的幅度,做多和做空参考的Range可以选择不同的周期数,也可以通过参数K1和K2来确定。当K1<K2时,多头相对容易被触发,当K1>K2时,空头相对容易被触发。
因此,在使用该策略时,一方面可以参考历史数据测试的最优参数,另一方面,则可以根据自己对后势的判断,或从其他大周期的技术指标入手,阶段性地动态调整K1和K2的值。
就是一个典型的观望、等待信号、进场、套利、离场的套路,却效果卓著。

海龟交易法则

我说过很多次,你可以把我的交易法则登在报纸上,但没人会遵守它们。关键是统一性和纪律性。几乎每一个人都可以列出一串法则,而且不比我们的那些法则差多少。但他们不能给别人信心,而唯有对法则充满信心,你才会坚持这些法则,即使遭遇逆境。
—— 理查德·丹尼斯,摘自杰克·D·施瓦格(Jack D. Schwager)的《金融怪杰》(Market Wizards)

如果你有一个有效的交易系统,而且能坚定不移地遵守它,你的行动就会更具统一性,尽管连续的损失或巨大的赢利也会激起内心的思想斗争。一个千锤百炼的机械性交易系统能赋予你信心、统一性和纪律性,这就是许多顶尖交易者的成功要诀。
—— (美)费思.海龟交易法则(珍藏版)

市场:买卖什么?

海龟们只选流动性最高的市场。

头寸规模:买卖多少?

波动性:N的含义

海龟们用一个特殊的概念来衡量一个市场的潜在波动性,理查德·丹尼斯和比尔·埃克哈特称之为N。N就是真实波动幅度的20日指数移动平均值,现在更常见的名称是真实波动幅度均值(或ATR)。从理论上说,N代表着一个市场在一天内的平均波动幅度,包括开盘跳空的情况在内。N的单位是点数,也就是这个市场的价格点数。
每一天的真实波动幅度是用下列关系式计算的:

真实波动幅度=Max(H–L,H–PDC,PDC–L)

其中:
H=当日最高价
L=当日最低价
PDC=前一日收盘价
N的计算公式如下:

   19 X PDN + TR
N=----------------
        20

其中:
PDN=前一日的N值
TR=当日的真实波动幅度
由于公式中需要前一日的N值,你在首次计算N的时候不能用这个公式,只能计算真实波动幅度的20日简单平均值。

美元波动幅度

决定头寸规模的第一个步骤就是计算绝对波动幅度,而绝对波动幅度是根据市场的价格波动性(N值)算出的。这听起来复杂,实际上很简单。
绝对波动幅度的计算公式就是:

绝对波动幅度=N×每一点数所代表的美元

波幅调整后的头寸单位

海龟们把头寸分为一个个单位,我们称之为头寸单位。头寸单位的大小要根据市场的波动性进行调整,目的是让一个N相当于账户净值的1%。
因此,一个特定市场或产品的头寸规模单位可以用下列公式算出:

                  帐户的1%
头寸规模单位=------------------
             市场的绝对波动幅度

或者:

                     帐户的1%
头寸规模单位=------------------------
             N X 每一点数所代表的美元

由于期货合约是不能拆分的,当计算出来的结果不是整数时,我们舍去小数,只取整数数值。

头寸规模的重要性

前面说过,分散化旨在将风险分散到多种不同工具中,同时通过提高成功交易的概率来提高赢利水平。恰当的分散化要求交易者在多种不同工具上投入类似甚至相同的赌注。
海龟系统用市场波动性来衡量每一个市场的风险水平。然后,我们会根据这个风险准绳来逐步建立风险量(或波幅)相同的头寸。这增强了分散化的效果,提高了赢利交易弥补亏损交易的概率。
请注意,如果你没有足够的资金,这样的分散化是很难实现的。对小账户来说,调整的精确性太低,这会大大降低分散化的效果。

风险与头寸单位

由于海龟们用头寸单位来衡量头寸的大小,而这样的头寸单位要根据波动性风险进行调整,头寸单位实际上就成了单个头寸和整个头寸组合的一个风险衡量指标。
海龟资金管理法则在4个不同层面上限制了我们的交易量。从本质上说,这些法则控制了交易者的总体风险水平。无论是在没完没了的亏损时期还是翻天覆地的价格动荡中,这些限制都能把损失最小化。
单个市场:每一个市场中的头寸单位不得超过4个。
高度关联的多个市场:在紧密关联的市场中,我们在某一个方向上的头寸单位不得超过6个(也就是说,空头单位最多6个,多头单位也最多6个)。高度关联的市场组合包括:民用燃料油与原油,黄金和白银,所有外汇,像短期国债和欧洲美元这样的利率类期货等。
松散关联的多个市场:对松散关联的市场来说,我们在某一个方向上的头寸单位不得超过10个。松散关联的市场包括黄金与铜,白银与铜,以及海龟们因为法定头寸限制而无法交易的许多谷类组合。
单个方向(多头或空头):任何一个方向上的总头寸单位都不得超过12个。因此,一个海龟从理论上说可以同时持有12个空头单位和12个多头单位。
海龟们用“满仓”这个词来表示他们已经达到了某个层面上的头寸规模上限。因此,日元满仓是指已经持有4个单位的日元合约,完全满仓是指某个方向上的头寸单位已经达到12个,诸如此类。

调整交易规模

有时候,市场会连续多个月没有趋势出现。在这种情况下,你的账户净值有可能遭受巨大的损失。
而在一场场大捷之后,你可能想扩大账户规模,进而扩大头寸规模。
海龟们的账户并不是那种在初始净值的基础上逐笔结算的普通账户。我们拿到的是名义账户,大小是指定的,初始净值为零。例如,当我们在1983年2月刚刚开始实战时,许多海龟拿到的是一个100万美元的名义账户。账户规模每年年初调整一次。上调还是下调要看里奇对交易者的评价。调整幅度一般与这个账户上一年度的盈亏状况紧密相关。
每当我们损失了初始账户的10%时,里奇都会把我们的账户规模缩减20%。这样,如果我们的100万美元初始账户损失了10%,也就是10万美元,我们的账户规模将会下调到80万美元,直到账户净值恢复到年初水平。如果我们又一次损失了10%(80万美元的10%,也就是8万美元,这样总损失达到了18万美元),我们就得把账户再压缩20%,这样就只剩下了64万美元的名义账户。
根据盈亏状况调整账户规模可能还有更好的方法。以上只是海龟们的方法。

入市:什么时候买卖?

入市策略

交易者大多从入市信号的角度来评判一个特定的交易系统。他们相信,入市策略是一个交易系统最重要的一个环节。
所以他们可能想不到,海龟们使用的是一个以理查德·唐奇安的通道突破系统为基础的非常简单的入市系统。
海龟们使用两个有所差异但也彼此相关的入市系统,我们称为系统1和系统2。我们可以自由决定如何在这两个系统之间分配资金。有的海龟只用系统2,有的在两个系统上各投入50%的资金,还有的采用其他组合。这两个系统分别是:
系统1:以20日突破为基础的短期系统
系统2:以55日突破为基础的长期系统

突破

突破是指价格超越了过去一定时期内的最高点或最低点。所以,20日突破就是指价格超越了过去20天内的最高或最低点。
海龟们总是在突破发生时立即入市交易,不会等到当日收盘或次日开盘时。在跳空开盘的情况下,假如开盘价已经跳过了突破价,海龟们就在开盘时入市。

系统1入市法则

只要价格超越20日最高或最低点一个最小单位,海龟们就马上行动。如果价格超越了20日高点,海龟们就买入1个头寸单位,开始做多。如果价格跌破了20日低点,海龟们就卖出1个头寸单位,开始做空。
但是,假如上一次突破是一次赢利性突破(也就是可以带来一次赢利的交易),那么系统1的当前入市信号将被忽略。注意:对这一法则来说,上一次突破就是指市场的上一次实际突破,不管交易者当时采取了突破交易还是根据这一法则而忽略了那次突破。那么什么是亏损型的突破呢?如果突破日之后的价格在头寸有机会退出获利(根据10日突破退出法则)之前发生了2N幅度的不利变动,这就被视为一次亏损性的突破。
对这一法则来说,上一次突破的方向并不重要。因此,无论上一次突破是向上突破还是向下突破,只要是亏损型突破,那么目前的新突破(无论是向上还是向下突破)就会被视为有效的入市信号。
不过,如果一次突破因为这条法则而被忽略,那么交易者将在55日突破点入市,这是为了避免错过重大趋势。这个55日突破点被视为一个保障性突破点。
在任何时候,如果一个交易者处于离场等待的状态,那么总有某个价位能引发空头入市信号,也总有某个更高的价位能引发多头入市信号。如果上一次突破是亏损性的,那么新突破点(也就是20日突破点)将更接近于当前价格;如果上一次突破是赢利性的,那么新突破点可能离当前价远得多,因为那有可能是个55日突破点。

系统2入市法则

只要价格超越55日最高或最低点一个最小单位,我们就入市。如果价格超越了55日高点,海龟们就买入1个头寸单位,开始做多。如果价格跌破了55日低点,海龟们就卖出1个头寸单位,开始做空。
对系统2来说,所有突破都被视为有效信号,无论上一次突破是亏损性还是赢利性的。

逐步建仓

海龟们首先在突破点建立1个单位的头寸,然后按1/2*N的价格间隔一步一步扩大头寸。这个1/2*N的间隔以上一份定单的实际成交价格为基础。所以,如果最初的突破交易发生了1/2*N的成交价偏差,那么新定单的价格将与突破点相差1N,也就是最初1/2*N的偏差加上1/2*N的标准间隔。
这个过程将继续下去,一直到头寸规模达到上限。如果市场足够活跃,我们有可能在一天内加满4个头寸单位。
请看下面的例子:

黄金
N=2.50
55日突破价=310.00
第一个单位:310.00
第二个单位:310.00+1/2×2.5=311.25
第三个单位:311.25+1/2×2.5=312.50
第四个单位:312.50+1/2×2.5=313.75
原油
N=1.20
55日突破价=28.30
第一个单位:28.30
第二个单位:28.30+1/2×1.20=28.90
第三个单位:28.90+1/2×1.20=29.50
第四个单位:29.50+1/2×1.20=30.10

统一性里

奇要求海龟们坚定不移地遵守入市信号,因为一整年的大部分利润很有可能就来自于两三次大的赢利交易。哪怕你只忽略或错过了一个信号,这一年的回报率也可能大打折扣。表现最好的海龟们都是入市法则的坚定信徒。
表现最差的海龟和那些被淘汰出海龟计划的人都不能始终如一地坚持法则。

止损:什么时候放弃一个亏损的头寸?

止损

交易行业里有这么一句话:“有老交易者,也有不怕死的交易者,但是没有不怕死的老交易者。”不用止损点的交易者十有八九会破产。海龟们一定会用止损点。
面对一个亏损的头寸,你可以坚守阵地,寄希望于失而复得;也可以割肉退出,承认这次交易不成功。对大多数人来说,前者远比后者要容易。
我可以明明白白地告诉你:遵守系统法则的命令退出亏损的头寸是一个生死攸关的要点。不会甩掉损失的交易者在长期内都不会成功。包括巴林银行和长期资本管理基金的灾难在内,几乎所有失去控制的致命交易行为都与不能防微杜渐地及时控制损失有关。
要控制损失,最重要的一件事就是在入市之前就确定退出的标准。一旦价格到达了你的止损标准,你必须退出——坚定不移,无一例外。犹豫和动摇终将酿成灾难。

海龟止损点

海龟们会使用止损点,但这并不意味着我们真的会向经纪人下止损单(stop order)。
由于海龟们手中的头寸非常庞大,我们不愿意下止损单,因为这有可能暴露我们的头寸状况或交易策略。我们会事先确定一个特定的止损价位,当市场达到这个价位,我们将通过限价定单或市价定单来退出我们的头寸。
这些止损价位就是雷打不动的退出点。只要市场到达了止损价位,我们就毫不迟疑地坚决退出。

止损标准

海龟们根据头寸风险来设定止损标准。任何一笔交易的风险程度都不得超过2%。
由于1N的价格变动代表着账户净值的1%,在2%的风险限制下,价格变动的上限就是2N。海龟们止损标准就是2N:对多头头寸来说,止损价比入市价低2N;对空头头寸来说,止损价比入市价高2N。
为了把整体头寸风险控制在最低水平,如果我们(按1/2*N的价格间隔)后续补充了头寸单位,那么之前头寸单位的止损点将相应地调整1/2*N。一般来说,这意味着整个头寸的止损点将与最新添加的头寸单位相距2N的距离。不过,如果头寸补充的价格间隔因为市场变化过快或开盘跳空等情况而大于1/2*N,止损标准也会有所变化。
下面是一个例子:

原油:
N=1.2055
日突破价=28.30
           入市价  止损价
第一个单位  28.30   25.90
           入市价  止损价
第一个单位  28.30   26.50
第二个单位  28.90   26.50
           入市价  止损价
第一个单位  28.30   27.10
第二个单位  28.90   27.10
第三个单位  29.50   27.10
           入市价  止损价
第一个单位  28.30   27.70
第二个单位  28.90   27.70
第三个单位  29.50   27.70
第四个单位  30.10   27.70
假如第四个单位因为市场跳空高开在每股30.80美元成交,那么结果将变为:
           入市价  止损价
第一个单位  28.30   27.70
第二个单位  28.90   27.70
第三个单位  29.50   27.70
第四个单位  30.80   28.40

备选止损策略:双重损失

海龟们也学习了另外一种叫作双重损失(the whipsaw)的止损策略。这种策略可以实现更高的利润率,但更难执行,因为它所制造的损失要比一般策略多得多,胜负比率会大大降低。
在双重损失策略下,每一笔交易的风险上限不是2%,而是0.5%。也就是说,价格波动的上限是1/2*N。在一个头寸单位止损退出后,交易者将在价格恢复到最初的入市价时重新建立这个单位。有几个海龟很成功地运用了这种策略。
双重损失策略还有一个好处:它不需要随着新头寸单位的补充而调整之前单位的止损点,因为我们最多只能有4个单位,总风险水平不可能超过2%。
比如,如果采用双重损失止损策略,上述原油交易将变成下面的样子:

原油:
N=1.2055
日突破价=28.30
           入市价  止损价
第一个单位  28.30   27.70
           入市价  止损价
第一个单位  28.30   27.70
第二个单位  28.90   28.30
           入市价  止损价
第一个单位  28.30   27.70
第二个单位  28.90   28.30
第三个单位  29.50   28.90
           入市价  止损价
第一个单位  28.30   27.70
第二个单位  28.90   28.30
第三个单位  29.50   28.90
第四个单位  30.10   29.50

海龟止损策略的优势

由于海龟止损点以N为基础,它们与市场的波动性息息相关。更具波动性的市场有更大的止损范围,但每个头寸单位的合约数量也相对较少。这便统一了所有交易的风险水平,加强了分散化的效果和风险管理的稳健性。

退出:什么时候退出一个赢利的头寸?

退出

交易行业里还有一句老话:“落袋为安的人永远也不会破产。”但海龟们不会同意这种论调。趋势跟踪者们最常犯的错误之一就是过早地退出赢利的头寸,也就是过早地“落袋为安”。价格永远也不会直上直下,没有波动。因此,要想抓住一次趋势,你必须允许价格偶尔向不利的方向变动。在趋势的初期,这往往意味着10%~30%的利润在你眼前化为乌有,反而转为小小的损失。在趋势的中期,你或许会眼睁睁地看着80%~100%的利润跌去三四成。在这些情况下,放掉包袱、“锁定利润”的诱惑是很强大的。
海龟们知道,赢利的时机问题足以决定你的胜败。
海龟系统在突破点入市,但大多数突破点都不会引发趋势。这意味着海龟们的大多数交易都是亏损的。如果少数赢利的交易赚不到足够多的钱来弥补这些损失,海龟们会是输家。每一个有效的交易系统都有自己的最佳退出点。
考虑一下海龟交易系统:如果你总是在1N的利润水平下退出赢利的交易,却在2N的止损点退出亏损的交易,你的赢利次数必须是亏损次数的两倍才能做到盈亏平衡。
交易系统的各个成分之间有着复杂的关系。因此,如果你不考虑入市点、资金管理和其他因素,你就没法去考虑正确的退出策略。
赢利头寸的退出策略是最重要的问题之一,但也是最不受重视的问题之一。然而,它完全可以决定一笔交易的成败得失。

海龟退出策略

系统1采用10日突破退出法则:对多头头寸来说,在价格跌破过去10日最低点时退出;对空头头寸来说,在价格超过10日最高点时退出。总之,如果价格发生了不利于头寸的10日突破,所有头寸单位都要退出。
系统2则采用20日突破退出法则:对多头来说是20日向下突破,对空头来说是20日向上突破。只要价格发生了不利于头寸的20日突破,所有头寸单位都会退出。
就像入市策略一样,海龟们一般不会通过止损单而退出,而是会紧密观察市场的动向,在价格达到退出突破点时马上下单退出。

退出不易

对大多数交易者来说,海龟系统的退出策略可能是整个系统中最难忍受的一个环节。你必须等待市场创下10日或20日新低才能退出,这往往意味着目睹20%、40%甚至100%的巨额利润瞬间蒸发。
所以,交易者总有一种提早退出的强烈冲动。你需要极强的纪律性才能坚守阵地,忍受利润的蒸发,直到抓住真正的大趋势。在大的赢利交易中遵守纪律和法则的能力就是经验丰富的成功交易者们的标志。

战术:怎么买卖?

战术

著名建筑师密斯·凡德罗(Mies van der Rohe)在谈到建筑设计时曾说过这么一句话:“细节就是上帝。”对交易系统来说,同样如此。在使用海龟交易法则的过程中,有些重要的细节对你的赢利水平有举足轻重的影响。

下单

前面说过,理查德·丹尼斯和比尔·埃克哈特建议海龟们不要使用止损单,而是随时观察市场动向,在价格到达止损价位的时候再行动。他们还告诉我们,限价定单总的来说要强于市价定单。相比起市价定单,限价定单更容易以更有利的价格成交,成交价偏差也要小一些。
任何时候的任何市场都有买入价和卖出价这两个报价。买入价就是买者们愿意接受的买价,卖出价就是卖者们愿意接受的卖价。只要买入价超过了卖出价,交易就会发生。如果市场的成交量足够大,市价定单总能在买入价位或卖出价位成交,不过大定单的成交价有时候也会稍差一些。
一般来说,市场总会发生一定幅度的相对随机性波动,这有时候被称为反弹(bounce)。之所以使用限价定单,就是为了把价格定在反弹区域的底端,而不是简简单单地接受当前的市价。一个小的限价定单不会触动市场,即使定单较大,它对市场的触动也小于市价定单。
确定限价定单的最佳定价是需要一定技巧的。不过,只要多做练习,你完全能学会用接近市价的限价定单获得比市价定单更好的成交价。

急变市场

有时候,市场变化速度太快,顷刻之间就会跳过你的定单价。如果你用的是限价单,你根本没机会成交。在这类急变市场中,每份合约的价值可能在短短几分钟之内涨跌数千美元之多。
在这种情况下,海龟们的原则是保持冷静,等市场稳定下来再做打算。但大多数新手都很难做到这一点。他们会惊慌失措,手忙脚乱地发出市价单。他们十有八九是在最差的时机下单的,到头来一算,他们的成交价是一天内最差的价格,不是最高点就是最低点。
在一个急变市场中,流动性会暂时固定。如果市场露出急变的迹象,卖者会停手观望,等待价格继续上涨,而且在飙升趋势停止之前不会再卖。这样一来,卖出价会急剧上升,而且买卖价差会有所扩大。
随着卖者不断抬高要价,买者们也被迫抬高出价,于是价格的上涨越来越快,最终引来更多的卖者。随着卖者越来越多,价格会平稳下来,往往还会快速逆转,大幅回调。
到头来,市价定单的成交点通常就是上行趋势的最高点,也就是市场开始止升企稳的时候。
在这类情况下,海龟们会一直等到市场出现逆转迹象(至少是暂时逆转)的时候再行动,这时候的成交价通常要比市价定单下的成交价好得多。如果市场趋于稳定后的价格已经超过了我们最初的止损价,我们会退出市场,但不会惊慌失措。

同步入市信号

在很多时候,市场非常平稳,波澜不惊,所以海龟们除了监控手头的头寸之外基本上无事可做,有可能在很长一段时间内没有任何动作。有的时候也会有点忙碌,几个小时内陆陆续续地出现多个信号,我们会按部就班地行动,直到达到相应市场的头寸上限。
但也有的时候,似乎所有的事情都在同一时间发生,我们个个忙得昏天黑地,在一两天之内就从两手空空变成了满仓。而且相互关联的市场上常常会同时发出信号,令疯狂的节奏变得更加疯狂。
如果各个市场一开盘就跳空越过了入市信号,那就更不用说了。你可能在同一天内看到原油、民用燃料油和无铅汽油市场的跳空开盘入市信号。对期货合约来说,同一个市场的多个不同月份的合约同时出现信号也是司空见惯的事。在这种情况下,你必须高效、快速地行动,而且不能惊慌,不能乱下市价定单,否则你的成交价必然会大大恶化。

买强卖弱

如果多个信号在同一时间出现,我们会在同一类市场中选择最强势的市场买入,选择最弱势的市场卖空。
另外,我们在同一时间只会选择一个月份的合约,而且只会建立一个头寸单位。比如,我们不会同时买入2月份、3月份和4月份的民用燃料油合约,而是会选择最强势而且有足够高的成交量和流动性的合约。
这一点极其重要。在同一类相互关联的市场中,最好的多头交易都存在于最强势的市场中(这些市场的表现几乎必然强于较弱的同类市场)。同样,最好的空头交易都存在于最弱势的市场中。
海龟们用多种不同的衡量标准来判断市场的强弱。最简单也最常用的一种方法就是察看图表,根据视觉判断来选出“看起来”更强(或更弱)的市场。
有些海龟的衡量标准是N:他们会比较一下各个市场自发生突破之后已经变化了多少个N,然后在变动幅度最大(以N来衡量)的市场中买入。还有一些海龟把不同市场的变化标准化了:他们用当前价减去3个月之前的价格,然后再除以N值。结果值最高的就是最强的市场,最低的就是最弱的市场。
这些方法都很有效。总而言之,要点在于在最强的市场上做多,在最弱的市场上做空。

合约滚动

当一期合约到期时,你在转向后期新合约之前需要注意两个因素。
首先,在很多时候,近期的合约虽然有很好的趋势,但较远期的合约并没有表现出同样的势头。除非新合约的趋势同样符合你的要求,否则不要向新合约滚动。
其次,你必须赶在现有合约的成交量和未平仓量(open interest)大幅萎缩之前滚向新合约。什么叫“大幅萎缩”要看头寸单位有多大。一般来说,海龟们会在合约到期之前几个星期将现有头寸滚向后期新合约,除非现有合约的表现远好于后期的新合约。

摘录于:(美)费思. 海龟交易法则(珍藏版) Kindle 版本.

nginx ssl设置详解

SSL 协议

SSLv2是不安全的,绝对不能用,SSLv3 能不用则不用,正常情况下用不到的,推荐使用 TLSv1 TLSv1.1 TLSv1.2,附配置代码:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

加密算法

RC4不要用,再就是 OpenSSL 记得更新到最新版,可以避免很多麻烦。别的也没什么了,附代码:

ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

ssl_prefer_server_ciphers on;

ECDHE+AESGCM 加密是首选的。它们是 TLS 1.2 加密算法,现在还没有广泛支持。当然也没有破解的方案。
PFS 加密套件好一些,首选 ECDHE,然后是 DHE
AES 128 要好于 AES 256AES 256 会造成更大的性能消耗,但是带来的安全提升是有限的。反之还能承受更大压力。
在向后兼容的加密套件里面,AES 要优于 3DES。在 TLS 1.1及其以上,减轻了针对 AES 的野兽攻击(BEAST)的威胁,而在 TLS 1.0上则难以实现该攻击。在非向后兼容的加密套件里面,不支持 3DES
RC4 整个不支持了。3DES 用来向后兼容。
强制丢弃的算法
aNULL 包含了非验证的 Diffie-Hellman 密钥交换,这会受到中间人(MITM)攻击
eNULL 包含了无加密的算法(明文)
EXPORT 是老旧的弱加密算法,是被美国法律标示为可出口的
RC4 包含使用了已弃用的 ARCFOUR 的加密算法
DES 包含使用了弃用的数据加密标准(DES)的加密算法
SSLv2 包含了定义在旧版本 SSL 标准中的所有算法,现已弃用
MD5 包含了使用已弃用的 MD5 的所有算法
但是 ECC 证书的部署不大一样,加密套件和 RSA 不一样,用错之后会影响向前安全性(Forward secrecy)。
加密套件应该这么改:

ssl_ciphers "EECDH+CHACHA20 EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";

而根据https://cipherli.st/的推荐,可以进一步改为:

ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

前向安全性(Forward Secrecy)

首先 Nginx 配置上如下代码:

ssl_dhparam /your/path/to/dhparam.pem;

pem 文件是这样生成的:

openssl dhparam -out dhparam.pem 4096

然后会显示:

This is going to take a long time  
.......+...........................+............................+............................+............++*++*++*

这真的会”take a long time”.但根据每台机器的性能不同而花费的时间不同.

dhparam 算法是在 2^4096 个数字中找出两个质数,所以需要的时间挺长。….. 意思是有可能的质数,+ 是正在测试的质数,* 是已经找到的质数。

前向安全性(Forward Secrecy)的概念很简单:客户端和服务器协商一个永不重用的密钥,并在会话结束时销毁它。服务器上的 RSA 私钥用于客户端和服务器之间的 Diffie-Hellman 密钥交换签名。从 Diffie-Hellman 握手中获取的预主密钥会用于之后的编码。因为预主密钥是特定于客户端和服务器之间建立的某个连接,并且只用在一个限定的时间内,所以称作短暂模式(Ephemeral)。
如果使用前向安全机制,攻击者取得了一个服务器的私钥,他是不能解码之前的通讯信息的。这个私钥仅用于 Diffie Hellman 握手签名,并不会泄露预主密钥。Diffie Hellman 算法会确保预主密钥绝不会离开客户端和服务器,而且不能被中间人攻击所拦截。
所有版本的 nginx 都依赖于 OpenSSL 给 Diffie-Hellman 的输入参数。如果不特别声明,将使用 OpenSSL 的默认设置,1024 位密钥。这绝壁是不安全的,因为我们正在使用 2048 位证书,所以要有一个更强大的 DH

HTTP 严格传输安全(HSTS)(HTTP Strict Transport Security)

HTTP严格传输安全(英语:HTTP Strict Transport Security,缩写:HSTS)是一套由互联网工程任务组发布的互联网安全策略机制。网站可以选择使用HSTS策略,来让浏览器强制使用HTTPS与网站进行通信,以减少会话劫持风险。
HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";

includeSubDomains是可选的,用来指定是否作用于子域名。支持HSTS的浏览器遇到这个响应头,会把当前网站加入HSTS列表,然后在max-age指定的秒数内,当前网站所有请求都会被重定向为https。即使用户主动输入http://或者不输入协议部分,都将重定向到https://地址。

X-Frame-Options 响应头

X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在 <frame>, <iframe> 或者 <object> 中展现的标记。网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。
X-Frame-Options 有三个值:
DENY:表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
SAMEORIGIN:表示该页面可以在相同域名页面的 frame 中展示。
ALLOW-FROM uri:表示该页面可以在指定来源的 frame 中展示。
换一句话说,如果设置为 DENY,不光在别人的网站 frame 嵌入时会无法加载,在同域名页面中同样会无法加载。另一方面,如果设置为 SAMEORIGIN,那么页面就可以在同域名页面的 frame 中嵌套。

X-Content-Type-Options 响应头

互联网上的资源有各种类型,通常浏览器会根据响应头的Content-Type字段来分辨它们的类型。例如:”text/html”代表html文档,”image/png”是PNG图片,”text/css”是CSS样式文档。然而,有些资源的Content-Type是错的或者未定义。这时,某些浏览器会启用MIME-sniffing来猜测该资源的类型,解析内容并执行。
例如,我们即使给一个html文档指定Content-Type为”text/plain”,在IE8-中这个文档依然会被当做html来解析。利用浏览器的这个特性,攻击者甚至可以让原本应该解析为图片的请求被解析为JavaScript。通过下面这个响应头可以禁用浏览器的类型猜测行为:

add_header X-Content-Type-Options nosniff;

这个响应头的值只能是nosniff,可用于IE8+和Chrome。

配置 OCSP 装订

ssl_stapling on;  
ssl_stapling_verify on;  
ssl_trusted_certificate /you/path/to/domain.chain.pem;  
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 10s;

domain.chain.pem 里面是域名证书到 ROOT 证书的一个链。
连接到一个服务器时,客户端应该使用证书吊销列表(CRL)或在线证书状态协议(OCSP)记录来校验服务器证书的有效性。CRL 存在一个问题,它已经增长的太快,永远也下载不完。
OCSP 更轻量一些,只需发一个请求。但是副作用是访问一个站点时必须对第三方 OCSP 响应服务器发起 OCSP 请求,这就增加了延迟带来的潜在隐患。事实上,CA 所运营的 OCSP 响应服务器非常不可靠,浏览器如果不能及时收到答复,就会静默失败。攻击者通过 DDoS 攻击一个 OCSP 响应服务器可以禁用其校验功能,这样就降低了安全性。
解决方法是允许服务器在 TLS 握手中发送缓存的 OCSP 记录,以绕开 OCSP 响应服务器。这个机制减少了客户端和 OCSP 响应服务器之间的通讯,称作 OCSP 装订。
客户端会在它的 CLIENT HELLO 中告知其支持 status_request TLS 扩展,服务器仅在客户端请求它的时候才发送缓存的 OCSP 响应。
大多数服务器最长会缓存 OCSP 48 小时。服务器会按照常规的间隔连接到 CA 的 OCSP 响应服务器来获取刷新的 OCSP 记录。OCSP 响应服务器的位置可以从签名的证书中 Authority Information Access 字段中获得。

nginx里边SSL的完整配置

    ssl on;
    #文件位置
    ssl_certificate /path/to/pem;
    ssl_certificate_key /path/to/key;
    ssl_dhparam /path/to/dhparams.pem;
    #会话进程设置
    ssl_session_cache shared:SSL:10m;
    ssl_session_tickets off;
    ssl_session_timeout 5m;
    #加密套件设置
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_prefer_server_ciphers on;
    ssl_ecdh_curve secp384r1;
    #OCSP配置
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 216.69.185.17 208.109.255.17 valid=300s;
    resolver_timeout 5s;
    #HTTP安全配置
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;

文章拼凑来源:
https://cipherli.st/
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/X-Frame-Options
https://okwoo.com/open-the-hsts-http-strict-transport-security-the-importance-of
https://www.pupboss.com/nginx-add-ssl/
https://imququ.com/post/web-security-and-response-header.html

用acme-tiny自动更新Let’s Encrypt HTTPS证书

Let’s Encrypt 证书不但免费,还非常简单,虽然每次只有 90 天的有效期,但可以通过脚本定期更新,配好之后一劳永逸。

ACME 全称是 Automated Certificate Management Environment,直译过来是自动化证书管理环境的意思,Let’s Encrypt 的证书签发过程使用的就是 ACME 协议。

acme-tiny是用python写的自动申请/更新Let’s Encrypt HTTPS的工具。

以下是记录Let’s Encrypt HTTPS证书申请部署的全部过程。

1.生成RSA私钥:

	    (umask 077;openssl genrsa 2048 > private.key)
	    (umask 077;openssl genrsa 4096 > private.key)

2.生成CSR请求文件:

        1).RSA 私钥(兼容性好)
	(umask 077; openssl genrsa 2048 > yoursite.key)
	(umask 077; openssl genrsa 4096 > yoursite.key)
        2).ECC 私钥(部分老旧操作系统、浏览器不支持。优点是证书体积小)
	(umask 077;openssl ecparam -genkey -name secp256r1 | openssl ec -out yoursite_ec.key)
	(umask 077;openssl ecparam -genkey -name secp384r1 | openssl ec -out yoursite_ec.key)

然后就可以生成 CSR 文件了。在 CSR 中推荐至少把域名带 www 和不带 www 的两种情况都加进去,其它子域可以根据需要添加,部分系统的openssl.cnf文件所有位置可能有所不同:

	openssl req -new -sha256 -key yoursite.key -subj "/" -reqexts SAN -config <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:yoursite.com,DNS:www.yoursite.com")) > yoursite.csr

3.配置自动认证目录:

	mkdir -pv /your/wwwroot/challenges

然后配置一个 HTTP 服务,以 Nginx 为例:

	server {
	    server_name yoursite.com www.yoursite.com;
	    location ^~ /.well-known/acme-challenge/ {
	        alias /your/wwwroot/challenges/;
	        try_files $uri =404;
	    }
	    location / {
	        rewrite ^/(.*)$ https://yoursite.com/$1 permanent;
	    }
	}

以上配置优先查找challenges目录下的文件,如果找不到就重定向到 HTTPS 地址。这个验证服务以后更新证书还要用到,建议一直保留。

4.脚本自动获取证书:
1).脚本下载与证书获取:

		wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py
		python acme_tiny.py --account-key ./private.key --csr ./yoursite.csr --acme-dir /your/wwwroot/challenges/ > ./signed.crt

2).Let’s Encrypt的”中间证书”与”网站证书”合在一起:

		wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
		cat signed.crt intermediate.pem > chained.pem

3).Let’s Encrypt的”根证书”和”中间证书”合在一起:

		wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem
		cat intermediate.pem root.pem > full_chained.pem

5.网站nginx使用的证书

	ssl_certificate     /path/to/chained.pem;
	ssl_certificate_key /path/to/yoursite.key;

6.自动更新证书脚本
Let’s Encrypt 签发的证书只有 90 天有效期,推荐使用脚本定期更新。脚本范例如下:

cd /path/to/nginx/ssl
python acme_tiny.py --account-key ./private.key --csr ./yyfilmtechcom.csr --acme-dir /your/wwwroot/challenges/ > ./signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem
wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem
cat intermediate.pem root.pem > full_chained.pem
service nginx reload

把脚本放进crontab,每个月定时执行一次:

0 0 1 * * sh /path/to/renew.sh >/dev/null 2>&1

原谅地址:https://imququ.com/post/letsencrypt-certificate.html#toc-0
参考地址:https://github.com/diafygi/acme-tiny