技术分析与量化交易实践
作者:互联网
全文字数 5406 字,建议阅读时长 15 分钟。
在金融科技高速发展中,区块链、数字货币等都是非常热门的话题,区块链是数字货币得以实现的基础,而数字货币的相关知识不只有数字货币的产生,还有数字化资产的交易,数字化资产的交易中最让我们所熟悉的就是证券的交易,为了了解数字货币的基础知识,我们先从其交易知识入手,这些知识对数字货币以外的很多交易也都有很高的应用价值。
第一部分——技术分析基础知识及常用指标
我们经常能在证券市场的交易中看到下面这种价格变动图:
我们首先看其中红色或绿色的矩形部分,这就是K线,一种现代化反映价格变动的工具,每一根K线都能反应它所包含的时间范围内的最高价、最低价、开盘价、收盘价,不同的K线所隐含的时间周期也有不同,主要有1M、15M、30M、1H、4H、1D、1WEEK、1MON、1YEAR等,不同的K线分别能对不同的时间周期起价格参考作用,而短周期K线则能反映出单根长周期K线内部被隐藏的变化。于是我们引入了一个新的概念——趋势,趋势在这里指的是一段时间内价格变化的方向趋同性,比如牛市的价格趋向于上涨等,而一根或几根长周期K线,其内部包含的短周期K线可能有几百根,随之隐藏的还有这些短周期趋势。
上图中我们可以看到,整个图中包含了一个向上的趋势,但是如果我们单独观察内部小部分的价格走势,可能会发现,在向上趋势中包含了许多向下的短周期趋势,所以观察到长周期趋势时盲目入场,在短时间内看到的很可能是下跌的情况。这样来看,对于短周期的分析也是十分有必要的。既观察到长周期趋势,也能看到短周期趋势,进行高价卖出、低价买入的滚动交易方式,可以获取到更多的利益。
而对于第一幅图中的一些折线,则是另一种技术分析指标——均线,均线简单来说就是将一段连续时间的价格进行平均,并且将不同时间点计算的平均值相连就得到了均线。图中不同颜色的均线表示了不同时间周期的均线,比如五日均线就是将最近五个交易日的收盘价进行平均再相连得到的,不同时期不同走势的均线也都有各自的作用。
均线反映了市场持仓成本的变化情况,其斜率变化反映了上涨和下跌的能量变化,价格偏离均线越多,均线和价格之间的吸引力就越大,两者趋近的可能性就越大;此外,均线存在金叉与死叉的情况,金叉就是短周期均线上穿长周期均线,代表上涨惯性的出现,而死叉就是短周期均线下穿长周期均线,代表下跌惯性的出现,这样来看,金叉死叉可以作为趋势开始的信号或者趋势结束的信号。
K线、趋势、均线等都只是技术分析中非常基础的部分,技术分析还有许多效果不同、反映价格变动能力不同的指标。
下面我们按照从简到难的顺序讲解其中主要的几种指标。
唐奇安通道
首先我们讲述其中最简单的唐奇安通道,唐奇安通道是用于交易的最古老、最简单的技术指标之一,它由三条线组成,分别是上阻力线、下支撑线、中心线,上阻力线是过去N天的最高价的最大值形成的、下支撑线则是由过去N天的最低价的最小值形成的、中心线为上阻力线和下支撑线的平均值。一般来说,唐奇安通道的宽度越宽,市场波动就越大,而唐奇安通道越窄,市场波动性就越小。
通过图中我们可以看出,指数从最高点下降时,唐奇安通道在一段时间延迟后宽度增加,体现为波行情波动率升高,后续价格变化趋于稳定,通道宽度明显降低。目前来看,唐奇安通道的上阻力线和下支撑线可以为阻力支撑位作参考、它的宽度也可以为行情的波动率提供参考,但是具有一定的时间延搁,如今一般作为新指标的基础,而不直接使用唐奇安通道指标,但其对于支撑阻力位的作用仍有很大的价值。
成交量
成交量是一个比较简单的指标,与唐奇安通道不同,成交量在目前仍具有很高的价值。顾名思义,成交量就是一个时间单位内对某项交易成交的数量,是一种供需的表现。当供不应求时,人潮汹涌,都期望得以交易,成交量的放大也成为必然;反之供过于求时,市场冷清,成交量缩小。事实上根据前面趋势的知识我们可以了解到,成交量对于趋势有很好的反映能力,它关乎能否突破阻力位或是支撑位,是市场上涨或下跌动能的表现。
这里选择一部分成交量波动较大的价格K线序列,我们可以看到,价格快速下跌时,成交量也非常大,下跌动能较强,此时人们的卖出需求非常大,可以看到价格也经历了连续两次跌停板,随后成交量明显缩小,逐渐止跌回升。可以看出成交量的作用时效性非常强,能够及时反映情况给投资者提供参考。
平均真实波幅ATR
平均真实波幅(ATR)是提取一定时间周期内的股价波动幅度的移动平均值,是显示市场变化率的指标.
ATR的计算公式为:真实波幅均值(ATR):ATR=TR的N根K线简单移动平均,其中真实波幅(TR):TR=MAX(|当前K线最高价-当前K线最低价|,|当前K线最高价-前一根K线收盘价|,|前一根K线收盘价-当前K线最低价|)
ATR可以看作是唐奇安通道的进阶版,二者功能较为接近,都是判断行情的波动率,但是ATR的参考意义要比唐奇安通道大很多,而且从图中我们可以看到,ATR可以直接通过数值反映出波动情况,且更新更快,受指标敏感性造成延搁的影响较小。
布林带BOLL
布林带(BOLL)是根据统计学中标准差原理设计出来的一种非常实用的技术指标。它由三条轨道线组成,其中上下两条线分别可以看成是价格的压力线和支撑线,在两条线之间是一条价格平均线,一般情况价格线在上下轨道组成的带状区间游走,而且随价格的变化而自动调整轨道的位置。
布林带的计算实际上并不困难,可以看作是均线的一种衍生指标,布林带分为上轨、中轨和下轨,首先计算周期为N的收盘价的标准差和简单移动平均值,布林带上轨的值=简单移动平均值+2*收盘加标准差;布林带中轨的值=简单移动平均值;布林带下轨的值=简单移动平均值-2*收盘价标准差。
布林带考虑了前一段时间收盘价变动的标准差,所以布林带的上下轨反映了价格的波动情况。相对于ATR或是唐奇安通道,布林带的中轨对于近期价格的参考效果更好,且布林带的上下轨开口变大缩小能够为运动惯性的确认提供参考,是非常常用的指标。图中示例选择了一个非常极端的部分,可以更加明显的看出,价格明显波动时,布林带上下轨开口增大,震荡波动时开口缩小,价格波动性降低。
抛物线SAR
抛物线(SAR)也称为停损点转向,是一种较简单、比较准确的中短期技术分析工具。在一定程度上,SAR的信号具有与支撑阻力位类似的作用,但是更加准确且有意义。
SAR的计算相对来讲更为复杂,其中表示第N日的SAR值、代表加速因子、为极点价,若是看涨一段时间,则EP为这段时期的最高价,若是看跌一段时间,则EP为这段期间的最低价。
在SAR的实际使用中,主要是可以找到趋势反转的时间点,当SAR信号出现前处于上涨时应立即卖出止盈,或是当SAR信号出现前处于下跌时应立即买入等待反弹。结合上图来看,当SAR出现绿色止盈信号后,短期内有一次下跌调整,后续信号转为止跌买入,虽然相对于最低点有一定时间延后,但信号所反应的信号比较明显。可以看出,SAR具有与支撑阻力位类似但是更加准确的效果。
相对强弱指标RSI
在前文中我们了解了许多关于止损止盈等的技术分析指标,很显然市场的技术分析并不只有止损止盈位置分析,下面我们简单了解其他指标中两种,分别是相对强弱指标RSI和顺势指标CCI。相对强弱指标RSI是根据一定时期内上涨点数和下跌点数的比率制作出的一种技术曲线,能够反映出市场在一定时期内的景气程度,本质上是一种衡量买入卖出动量的指标。
对于RSI的计算方法,,其中RS=N根K线内收盘价上涨的价格点数之和的平均值/N根K线内收盘价下跌的价格点数之和的平均值,RSI的取值范围为0-100。
RSI在使用时可以根据其数值判断市场的强弱,如RSI>50表示为强势市场,反之为弱势市场,RSI一般在30-70之间波动,但是当RSI<20时,表示价格有超卖现象,若是继续下降,则极有可能止跌回升,同样当RSI>80时,表示价格有超买现象,价格极有可能转跌。
虽然RSI可以从数值上非常准确直观的判断价格情况和市场的景气程度,但是其缺点也非常明显,对于超级极端行情中,RSI的参考意义会降低,被称为RSI的钝化,我们将通过图例进行讲解。
图中为一段极端强势上涨行情,国外市场中一般以绿色作为上涨,在该行情中,RSI在行情刚开始不久就达到80,按RSI的使用方法来看,此时已经达到了超买情况,行情可能反转,事实上此后行情涨幅更大,但是RSI的实际上涨量非常少,这就是RSI的钝化,所以对于超级极端行情中,RSI的参考价值会减弱。
顺势指标CCI
最后我们讲一下另一个判断超买超卖指标中的顺势指标CCI,CCI是一种专门测量股价、外汇或者贵金属交易是否已超出常态分布范围。与大多数单一利用股票的收盘价、开盘价、最高价或是最低价而发明出的各种技术分析指标不同,CCI是根据统计学原理,引进价格与固定期间的股价平均区间的偏离程度的概念,强调股价平均绝对偏差在股市技术分析中的重要性,是一种比较独特的技术指标。CCI波动于正无穷大和负无穷大之间,但是,又不需要以0为中轴线,这一点也和波动于正无穷大到负无穷大的指标不同。
CCI的计算稍有复杂:
CCI在使用中,数值在-100~100中,CCI没有参考意义;当CCI从100以上或是-100以下转到-100~100中时,说明了动能的减少,可以为反转作参考;当CCI大于100并且持续增加,可以为上涨惯性作确认,当CCI小于-100并且持续减少,可以为下跌惯性作确认。在下图中,黄色线为-100线,红色则是+100线,可以看到当CCI值突破100时,后续有上涨波段,CCI也被称为生命线,正体现了它的参考价值非常高。
可以看出,CCI可以判断价格趋势反转等趋势作参考,它也可以判断上涨和下跌惯性及能量大小,所以CCI的作用范围非常广,可以在许多分析中起作用,得到了广泛的使用。
第二部分——发明者区块链量化平台基础运用
现在我们了解了许多基础的或是进阶的技术分析指标的具体内容,但是日常交易中,很显然,我们几乎不可能自己观察到所有的信号,或是观察到多个信号的重叠时机,也不可能无时无刻盯盘,那么通过平台和适当的程序进行程序化量化交易就显得很有必要。
在这里我们介绍发明者(FMZ)平台,FMZ发明者是一个集成了很多区块链交易所接口的量化平台,同时提供了相对全面的功能。平台支持python javascript c++等语言进行量化开发。发明者平台简单易用,学习成本低,是入门区块链量化,以及为后续高阶内容打下基础的最佳路径。
首先我们可以进入发明者平台,在发明者官网www.fmz.com免费注册完成后,新建策略,我们就可以编辑策略了。
对于发明者的策略模板,分为四个部分,与程序语言编辑程序类似,分为包的引用、全局变量声明、函数的使用(在这里一般称为ONTICK函数)、main函数(主程序)。在发明者策略的运行机制中,一切策略都从main()函数中开始,策略逻辑需要定周期运行,以根据市场最新情况来做出相应,所以使用一个有时间延迟的while(TRUE)死循环,所谓的while(TRUE)死循环,也就是设置一个循环,循环没有停止条件,将持续运行下去,这个过程中将会重复使用预先设定好的多个ONTICK函数,对于ONTICK函数我们后续再进行细致讲解,由于前期设置了死循环,所以策略需要一个sleep()作为策略的运行时间间隔,相当于进行每次循环时的间隔时常,一般设置在3-10秒之间。
下面我们讲述ONTICK函数,ONTICK函数是单独的策略模块,比如发生均线金叉等就买入操作的模块,每个ONTICK函数都代表了一个类似的模块,我们介绍几种交易模块和重要函数。
首先是进场信号模块,作用是判断当前行情是否符合既定策略的进场条件,同样也有类似的出场模块,另外是进场交易模块,也就是进场信号确认后,执行具体进场交易操作方式的模块,同样也有出场交易模块。
但这些都只是概括性的模块,其中有很多的具体函数,我们接下来介绍其中主要的几种函数。
首先是账户情况获取函数exchange.GetAccount,将会了解到自己的账户情况,盈利亏损账户额度等信息,此外还有exchange[N].GetAccount()函数,它的使用方法则是,返回标的列表里第N+1个标的的资金状况。
对于历史K线获取函数exchange.GetRecords(period),将会返回某个K线历史,这个函数会累积K线数据,最多到2000根,当有新的K线加入时,最早的K线就会删除。
另外有获取市场行情函数exchange.GetTick()、获取市场深度函数exchange.GetDepth()、买入函数exchange.Buy(Price,Amount)、卖出函数exchange.Sell(Price,Amount)、获取已有挂单信息exchange.GetOrders()、撤单函数exchange.CancelOrder(ID)都经常使用,通过与判断条件(也就是满足预定的情况时进行某种操作)相结合,就可以形成需要的ONTICK函数。
下面我们举例一个比较简单,但是具有完全结构的发明者量化交易策略模型。
#设置全局变量
ontick_switch1=0 #ontick的空仓判断
ontick_switch2=0 #ontick的进场信号判断
ontick_switch3=0 #ontick的进场操作完成情况
ontick_switch4=0 #ontick的出场信号判断
#定义策略模块
def ontick():
global ontick_switch1 #引用全局变量
global ontick_switch2
global ontick_switch3
global ontick_switch4
price=exchange.GetRecords(PERIOD_M15)
ma_fast=TA.MA(price,14)
ma_slow=TA.MA(price,30)
if ma_fast[-1]>ma_slow[-1] and ma_fast[-2]<ma_slow[-2] and ontick_switch1==0: #进场信号判断模块
ontick_switch1=1 #转为非空仓
ontick_switch2=1 #进场信号已判断
if ontick_switch2==1:
Log(“金叉进场了”)
exchange.Buy(-1,1) #执行买入一个btc
ontick_switch2=0 #完成进场交易后进场信号删除
ontick_switch3=1 #进场交易已完成
if ma_fast[-1]<ma_slow[-1] and ma_fast[-2]>ma_slow[-2] and ontick_switch3==1:
ontick_switch3=0 #防止重复发出出场信号
ontick_switch4=1 #出场信号已判断
if ontick_switch4==1:
Log(“死叉出场了”)
exchange.Sell(-1,1) #卖出一个btc
ontick_switch1=0 #所有全局变量归零进入空仓状态
ontick_switch2=0
ontick_switch3=0
ontick_switch4=0
#定义main函数
def main():
while(True): #死循环持续运行策略
ontick()
Sleep(1000*60*15) #运行程序的周期
以上即为金叉死叉量化交易策略的代码内容,主要功能为,当出现金叉时,也就是MA(14)对MA(30)金叉时进场,死叉时出场的交易策略。
下面我们对一副K线图使用上述策略检验其收益率:
可以看到按照我们举例的策略来看,应该在白色均线上穿黄色均线时买入,反之卖出,通过计算,经过图中的两次买入卖出操作最终收益率为12.45%。需要注意的是,虽然在这里看来收益率非常可观,但是我们将两次交易分开来分析,第一次实际收益率为-5.03%,第二次实际收益率为17.48%,这是因为我们举例的策略非常简单,实际应用中需要更多的限制条件,虽然会降低交易频率,但是可以显著降低单个指标分析出现问题的风险
此外,发明者平台还有许多更加高级的用法,比如抓取数据到本地等,可以在点宽学院课程中进行更加深度的学习。
- 本文作者 -
版权说明:
本文章为投稿文章,文中观点及内容来自原作者,点宽学院为授权首发平台。
标签:RSI,ontick,实践,唐奇安,指标,CCI,量化,交易,函数 来源: https://blog.51cto.com/u_14793075/2847338