量化交易之策略开发学习 (一)
策略逻辑
有了以上策略想法和思路,我们就可以试着构建策略逻辑了。这里的逻辑并不是 让你计算天体运行规律,它没有那么复杂。无非就是把之前的策略想法,用文字 表现出来。
多头开仓:如果当前没有仓位,并且收盘价大于短期均线,并且收盘价大于长期 均线,并且短期均线大于长期均线,并且长期均线是上升的。
空头开仓:如果当前没有仓位,并且收盘价小于短期均线,并且收盘价小于长期 均线,并且短期均线小于长期均线,并且长期均线是下降的。
多头平仓:如果当前持有多单,并且收盘价小于长期均线,或者短期均线小于长 期均线,或者长期均线是下降的。
空头平仓:如果当前持有空单,并且收盘价大于长期均线,或者短期均线大于长 期均线,或者长期均线是上升的。
以上就是整个量化交易策略的逻辑部分,那么如果我们把文字版的策略逻辑转换 成代码,它将包括:获取行情、计算指标、下单买卖,这三个步骤。
“设计你的策略,交易你的思想。”从这个角度讲,量化交易的核心仍是交易思 想。作为一名量化交易者,不仅需要掌握策略编写平台的基本语法和函数,更需 要在实战中体会交易理念。量化只是体现不同交易理念的工具和载体而已。
麦语言设计策略:
MA10 := MA(CLOSE,10);
MA50 := MA(CLOSE,50);
MA10_1 := REF(MA10, 1); // 获取上根K线的10周期均线,并把结果保存在MA10_1
MA50_1 := REF(MA50, 1);
MA10_2 := REF(MA10, 2);
MA50_2 := REF(MA50, 2);
MA50_ISUP := MA50 > MA50_1 AND MA50_1 > MA50_2;
MA50_ISDOWN := MA50 < MA50_1 AND MA50_1 < MA50_2;
CLOSE > MA10 AND CLOSE > MA50 AND MA10 > MA50 AND MA50_ISUP,BK; // 多头开仓
CLOSE < MA10 AND CLOSE < MA50 AND MA10 < MA50 AND Ma50_ISDOWN,SK; // 空头开仓
CLOSE < MA50 OR MA10 < MA50,SP; // 多头平仓
CLOSE > MA50 OR MA10 > MA50,BP; // 空头平仓
麦语言
什么是麦语言?所谓的麦语言就是从早期的股票技术指标延伸出来的一套程序 化函数库。把算法封装到一个个函数里,用户只需要像拼“积木式”一样调用一 行行函数,实现策略逻辑。
它采用"小语法,大函数"的构建模式,大幅提高编写效率,其他语言 100 多句的 策略,用麦语言一般 10 几句就可以编出来。配合发明者量化工具的金融统计函 数库和数据结构,同样也能支持部分复杂的交易逻辑。
布林带指标
BOLL 又称布林带指标,也是利用统计学原理,先根据 N 日移动平均线计算出中 轨,再根据标准差,计算出上轨和下轨。当 BOLL 通道由宽变窄,说明价格逐渐 向均值回归。当 BOLL 通道由窄变宽,意味着行情开始发生变化,如果价格上穿 上轨,表明买力增强,如果价格下穿下轨,表明卖力增强
。
在所有的技术指标中,BOLL 的计算方法是最复杂之一,其中引进了统计学中的 标准差概念,涉及到中轨线(MB)、上轨线(UP)和下轨线(DN)的计算。
MACD 指标
MACD 指标是运用快速(短期)和慢速(长期)移动平均线及其聚合与分离的征 兆,加以双重平滑运算。而根据移动平均线原理发展出来的 MACD,一则去除了 移动平均线频繁发出假信号的缺陷,二则保留了移动平均线的效果,因此,MACD 指标具有均线趋势性、稳重性、安定性等特点,是用来研判买卖股票的时机,预 测股票价格涨跌的技术分析指标 。
MACD指标是股票技术分析中一个重要的技术指标,由两条曲线和一组红绿柱线组成。
两条曲线中波动变化大的是DIF线,通常为白线或红线,相对平稳的是DEA线(MACD线),通常为黄线。当DIF线上穿DEA线时,这种技术形态叫做MACD金叉,通常就是买入信号。
MACD指标的使用相对要简单且出错几率较小。特别是在判断长期趋势中,长周期K线的MACD指标准确率更高。
周K线MACD指标对中长线转折的判断的准确性较高,可以作为中长线投资者的首选参考指标。
策略编写
沃伦 · 巴菲特的导师本杰明 · 格雷厄姆曾经在《聪明的投资者》一书中, 曾经提到过一种股票债券动态平衡的交易模式。
这种交易模式非常简单:
把手中 50% 的资金投资于股票基金,剩下 50% 投资于债券基金。即股票和债券 两者各占一半。
根据固定间隔时间或市场变化进行一次资产再平衡,使股票资产和债券资产的比 例恢复到初始的 1:1。这就是整个策略的全部逻辑,包含了什么时候买卖,以及 买卖多少。够简单吧!
在这个方法中,债券基金的波动率其实很小,远远低于股票波动率,所以债券在 这里被当做『 参照锚 』,也就是说,用债券来衡量股票究竟是涨得太多了, 还是涨得太少了。
如果,股票价格上涨,会使得股票的市值大于债券的市值,当两者市值比率超过 设定的阈值时,则对总仓位进行重新调整,卖出股票,并且买入债券,使股债市 值比例恢复至初始的 1:1。
反之,股票价格下跌,会使得股票的市值小于债券的市值,当两者市值比率超过 设定的阈值时,则对总仓位进行重新调整,买入股票,并且卖出债券,使股债市 值比例恢复至初始的 1:1。
就这样,在动态平衡股票和债券之间的比例,就够享受到股票成长的果实,并且 减少了资产波动率。作为价值投资的先驱,格雷厄姆为我们提供了一个很好的思 路。
策略逻辑
按照当前的 BTC 的价值,账户余额保留¥5000 现金和 0.1 个 BTC,即现金和 BTC 市值的初始比例是 1:1。
如果 BTC 的价格上涨至¥6000,即 BTC 市值大于账户余额,并且其之间的差超 过设定的阈值,就卖掉(6000-5000)/6000/2 个币。说明 BTC 升值了,把钱兑换 回来。
如果 BTC 的价格下跌至¥4000,即 BTC 市值小于账户余额,并且其之间的差超 过设定的阈值,就买入(5000-4000)/4000/2个币。说明 BTC 贬值了,把 BTC 买 回来。
就这样,不管 BTC 是升值还是贬值,始终动态保持账户余额和 BTC 的市值相等。 如果 BTC 贬值了就买一些,等再涨回来,就再卖一些,就好像天平一样。
买入条件:如果当前持仓市值减去当前可用余额小于负当前可用余额 5%,就开 仓买入。 卖出条件:如果当前持仓市值减去当前可用余额大于当前可用余额的 5%,就平。
卖出条件:如果当前持仓市值减去当前可用余额大于当前可用余额的 5%,就平仓卖出。
前提必要条件
当前行情
当前资产
币总市值
资产差
唐奇安通道策略
在众多交易策略中,唐奇安通道策略应该是最为经典的突破类策略之一,早在 1970 年就已经大名远扬,当时国外有家公司专门对主流的程序化交易策略进行 模拟测试和研究,结果表明,在所有策略测试中,唐奇安通道策略最为成功。
后来,在美国又发生了一件交易历史上最著名的“海龟”交易员培训,造就了巨 大的成功。当时“海龟们”的交易方法是保密的,但过了十几年,《海龟交易法 则》公之于众,人们才发现“海龟们”用的正是改进版的唐奇安通道策略。
突破型交易策略
适应于走势比较流畅的交易品种,最常见的突破交易方式就是, 利用价格与支撑和阻力的相对位置关系,来判断具体交易买卖点位。本节的唐奇 安通道策略也正是基于这个原理。
唐奇安通道策略规则
唐奇安通道属于趋势型指标,它的外表与信号与布林带指标有点相像。但是唐奇 安的价格通道是根据一定期间内的最高价格与最低价格构建的。比如:在计算最 近 50 根 K 线最高价的最大值,形成上轨;计算最近 50 根 K 线最低价的最小值, 形成下轨。
该指标由 3 条不同颜色的曲线组成的,默认是 20 个周期内的最高价和最低价来 显示市场价格的波动性,当其通道窄时表示市场波动较小,反之通道宽则表示市 场波动比较大。
如果价格升破上轨时,就是买入信号;反之,如果价格跌破下轨时,就是卖出信 号。由于其上轨和下轨是用最高价和最低价计算出来的,所以一般情况下,价格 很少同时升破和跌破上下通道线。大多数情况下,价格是沿着上轨或下轨单边运 动,或者在上轨和下轨之间运动的。
在发明者量化工具中,唐奇安通道的计算方法很简单,直接使用获取指定周期内 的最高价或最低价就可以了,如下图所示:第 5 行就是获取 50 周期最高价的最 大值,第 6 行就是获取 50 周期最低价的最小值。
策略逻辑
唐奇安通道的使用方法有很多,可以单独使用,也可以和其他指标结合在一起使 用。本节课程我们将采用最简单的使用方法。即:当价格自下而上突破上轨,即 突破上方压力线时,我们认为多方力量正在走强,一波上涨行情已经形成,买入 开仓信号产生;当价格自上而下跌破下轨,即跌破支撑线时,我们认为空方力量 正在走强,一波下跌趋势已经形成,卖出开仓信号产生。
如果买入开仓后,价格又重新跌回到了唐奇安通道中轨,我们认为多方力量正在 走弱,或者空方力量正在加强,卖出平仓信号产生;如果卖出开仓后,价格又重 新涨回到唐奇安通道中轨,我们认为空方力量正在走弱,或者多方力量正在加强, 买入平仓信号产生。
买卖条件
多头开仓:如果无持仓,并且收盘价大于上轨
空头开仓:如果无持仓,并且收盘价小于下轨
多头平仓:如果持多单,并且收盘价小于中轨
空头平仓:如果持空单,并且收盘价大于中轨
策略代码实现
实现策略的第一步是先获取数据,因为数据是组成交易策略的前提部分,想象一 下,我们都需要哪些数据呢?以及如何获取这些数据?然后再根据这些数据计算 设计交易逻辑;最后就是配合交易逻辑买卖下单交易。具体步骤如下:
第一步:使用交易类库
你可以把交易类库想象成一个功能模块,使用交易类库的好处是,可以让你把精 力放到编写策略逻辑上面。举个例子:当我们使用交易类库时,开平仓的时候, 直接使用交易类库中的下单 API 就行了;但如果不使用交易类库,开平仓的时候, 需要获取盘口价格、需要考虑报单却不成交的问题、需要考虑撤单的问题等等。
上图就是使用发明者量化工具的 CTA 策略框架。这是一个固定的代码格式,所有 的交易逻辑代码从第 4 行开始编写。其他地方不用任何修改。
交易深度
GetDepth
获取挂单深度信息。虽然GetTicker中包含了买一卖一,但如果要查询更深的挂单,可以用这个接口,一般可以查到上下200个挂单。可以使用这个接口计算冲击价格。下面是一个真实的返回结果。其中Asks表示卖单挂单,数组中分别是“卖一”、“卖二”...所以价格也依次上升。Bids表示买单挂单,数组中分别是“买一”、“买二”...价格依次下降。
{
"Info":null,
"Asks":[
{"Price":5866.38,"Amount":0.068644},
{"Price":5866.39,"Amount":0.263985},
......
]
"Bids":[
{"Price":5865.13,"Amount":0.001898},
{"Price":5865,"Amount":0.085575},
......
],
"Time":1530241857399
}
使用深度获取买单卖单例子:
function main() {
var depth = exchange.GetDepth()
Log('买一价个: ', depth.Bids[0].Price, '卖一价格: ', depth.Asks[0].Price)
}
为者常成,行者常至
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)