- 量化投资技术分析实战:解码股票与期货交易模型
- 濮元恺
- 902字
- 2020-08-28 01:08:19
第2章 快速驾驭编程语言知识
2.1 TB基本编程——基础知识
我们将这部分知识放在模型讲解之前,是因为交易开拓者TradeBlazer使用的Easy Language编程语言简单易懂,掌握这种语言也是进入量化研究领域的敲门砖。很多量化交易初学者都是通过期货CTA开始的,一方面是国家政策允许对期货进行程序化交易,另一方面更核心的因素是编程门槛低,各大商业软件公司开发了自己的交易平台和交易语言,内置了大量方便的函数可供调用。
考虑到交易开拓者TradeBlazer的语言不可能完全没有门槛,所以新进入量化领域的读者,需要付出一定的时间和精力来记忆理解这套系统的编程语言。
首先要肯定的是,在期货可编程量化软件里,交易开拓者TradeBlazer(以下简称TB)开发的语言系统是接近于理想编程环境的,它将大量的底层控制封装起来。用户只关心交易的逻辑,将精力集中在交易方面即可,并且它的代码格式和结构类似C语言一般工整。这类软件的数据质量和程序准确度很高,部分机构也使用它作为开发平台,尽管实盘可能有自己的IT系统,但是在开发策略阶段为保证效率和精力分配的侧重点,自有IT平台往往不如TB和MC之类的平台方便。具体代码如下。
// 定义参数 Params Numeric FastLength(5); Numeric SlowLength(20); // 定义变量 Vars NumericSeries AvgValue1; NumericSeries AvgValue2; // 模型语句开始 Begin // 定义两条均线,并通过AverageFC求出均线值 AvgValue1 = AverageFC(Close, FastLength); AvgValue2 = AverageFC(Close, SlowLength); // 绘制两条均线 PlotNumeric("MA1", AvgValue1); PlotNumeric("MA2", AvgValue2); // 集合竞价和小节休息过滤 If(! CallAuctionFilter()) Return; // 当目前模型没有持有多仓且短期均线上穿长期均线 If(MarketPosition <>1 && AvgValue1[1] > AvgValue2[1]) { // 买入开仓1手,在open价格 Buy(1, Open); } // 当目前模型没有持有空仓且短期均线下穿长期均线 If(MarketPosition <>-1 && AvgValue1[1] < AvgValue2[1]) { // 卖出(做空)开仓1手,在open价格 SellShort(1, Open); } END
普通用户搞清楚数据定义、函数调用、条件、循环等语句控制,基本上可以编写自己的交易程序,几乎没有障碍,遇到不懂的函数随时启动帮助系统查询,有详细的定义、参数说明和使用案例。
交易模型运行在TB软件所说的Bar数据上。每一个Bar数据,就是我们所说的一根K线,它可以是各种周期的K线。公式代码从上至下运行,在每个K线图表上,从左到右执行,判断每一根Bar是否满足开仓或平仓条件,这就是历史数据的回测逻辑。如图2-1所示。
图2-1 公式执行按照代码从上至下,Bar数据(K线)从左到右的顺序
在实盘交易中,如果接收到新的Tick数据,则每个Tick会驱动程序在最后一根Bar上运行一次,而最新接收到的这个价格值就是Close(如果这个Tick是本Bar的最高价或最低价,那么这个Tick值同时还是High和Low),所以在编程时一定不要直接使用Close,也不要在Close上发出交易指令,这是典型的引用当前信息,会造成TB用户常说的“信号闪烁”问题。
Tick是交易所传来的每个时间单位数据,一般是每秒两Tick,国内商品期货最细粒度就是每秒两Tick(即每500毫秒一个Tick),股指期货每秒四Tick(即每250毫秒一个Tick),时间以毫秒计算。所以这决定了,我们的开平仓交易指令最好以上一个Bar的信息作为计算基础。但是突破类模型,可以用当前的High和Low,然后在回测时,也对比本Bar的Open和High谁最高(或Open和Low谁最低)来发交易单,回测就不会产生偏差(后文会有大量类似代码)。
信号会显示在K线图表上,这是这类软件比起股票程序化在线式平台更好的地方,只要你调用了这个模型到K线上,买卖开平等信息都会直接显示在K线上。
一个模型,具体分为声明参数、声明变量、程序脚本正文(也就是调用函数计算,并发交易单)。如图2-2所示。在正文最后部分,一般是开多、开空、平多、平空这4个指令。然后是止损或者追踪止损指令。TB软件除用户函数以外,内建了400多个系统函数,均可在软件帮助文档(F1键)的索引里找到具体的说明以及使用方法。各位读者要付出大量时间阅读资料,理解记忆,才能提升自己的投资能力,真正驾驭期货CTA量化投资,开始自己的程序化模型开发。
图2-2 模型(或函数)有3部分组成——参数、变量、正文
系统函数分类如下。
◎ 数学函数Abs
◎ 字符串函数Text
◎ 时间函数Time、CurrentTime
◎ 数据函数Barcount、High
◎ 属性函数BarType、MinMove最小变动量
◎ 行情函数Q函数
◎ 账户函数A函数
◎ 枚举函数Enum_Buy
◎ 交易函数EntryPrice
我们必须记忆的常用交易函数如下。
◎ Buy(多头开仓)
◎ Sell(多头平仓)
◎ Sellshort(空头开仓)
◎ BuyToCover(空头平仓)
◎ A_SendOrder[Buy Or Sell(买入/卖出), Entry(开仓)/Exit(平仓)/ExitToday(平今), fLot(发送委托单量), fPrice(交易价格)]
常用数据函数如下。
◎ BarStatus:当前Bar的状态值。
◎ Close或C:当前Bar的收盘价。
◎ Open或O:当前Bar的开盘价。
◎ High或H:当前Bar的最高价。
◎ Low或L:当前Bar的最低价。
◎ Vol或V :当前Bar的成交量。
◎ Time或T:当前Bar的时间。
常用数学函数如下。
◎ Waverage:求加权平均。
◎ Xaverage:求指数平均。
◎ AvgPrice:求平均价格。
◎ CrossOver:求是否上穿。
◎ CrossUnder:求是否下穿。
◎ Highest:求最高。
◎ Lowest:求最低。
◎ Summation:求和。
其他常用语法如下。
◎ MarketPosition:获得当前持仓状态。
◎ BarStatu:当前Bar位置状态。
◎ SetStopLoss:在亏损达到设定条件时产生平仓。
◎ ExitPosition:True所有仓位平仓False单独对每个建仓位置进行平仓。
◎ Numeric:表达单个变量。
◎ NumericSeries:表达与Bar数量等长的数组变量。
我们现在看到的是所有必须记忆的函数,因为它们太常见于每一个交易模型的代码,如果这些函数看不懂,未来自己读代码、写代码都无法顺利进行。主要有4类函数,第一类是交易函数,就是4个交易信号+1个A——SendOrder(这个函数可以先略过),先用4个简单的交易信号指令来编写代码。第二类是数据函数,比如开盘价、收盘价、成交量和时间。第三类是常用数学函数,比如均线。第四类是其他常见语法,比如下单时要看目前的持仓状态、止损和平仓、变量的声明和数组变量声明。
关系运算符是计算过程中所需要的符号,即大于、小于、等于这样的关系如何编写,大家对算数运算符应该更加了解,它类似于Excel的单元格操作语言。如表2-1和表2-2所示。
表2-1 关系运算符
表2-2 算术运算符
这是一个引用参数的案例,名称是定义了一个用户函数MyFunc,该函数首先定义3个参数Price、mHigher和mLower,初始值都是0,然后定义了一个变量Tmp,初始值也是0。程序开始,Tmp值是以10为周期的Price的移动平均价格,mHigher是先比较Tmp和当前Bar最高价谁更高,就等于谁,mLower同理。
用户函数MyFunc,如图2-3所示,代码如下。
图2-3 在TB“公式管理器”中,可看到自己编写的公式,其他模型都可调用
Params NumericSeries Price(0); NumericRef mHigher(0); NumericRef mLower(0); Vars Numeric Tmp(0); Begin Tmp = Average(Price,10); mHigher = IIf(Tmp > High, Tmp, High); mLower = IIf(Tmp < Low, Tmp, Low); Return Tmp; End
用户函数可以通过参数传入,返回函数的计算结果。我们可以在自己的模型中不仅调用TB官方封装好和写好的函数,也可以自定义很多常用函数。在股票模型中,类似Ta-Lab的库也完成了这项工作,大部分技术指标都已经被编写好,不用开发者自己撰写一行行晦涩的数学公式。
TB系统提供的交易指令是开多、平多、开空、平空,即Buy(多头开仓)、Sell(多头平仓)、Sellshort(空头开仓)、BuyToCover(空头平仓)。以Buy函数为例,常规使用方法有3个控制因子在括号里,分别是买入数量、买入价格、是否有买入延迟和延迟多久。
TB系统还支持全局变量功能,可以标记不同的模型逻辑和开平仓方式,这部分知识大家可以在其官方网站下载更详细的教程了解。