Ta-Lib安装及使用教程

TaLib官网:http://ta-lib.org/

Python wrapper for TA-Lib:http://mrjbq7.github.io/ta-lib/doc_index.html

一、TaLib简介

TaLib是一个Python金融指数处理库。包含了很多技术分析里的常用参数指标,例如MA、SMA、WMA、MACD、ATR等。

二、TaLib安装

注:TaLib是一个pyhon库,故在安装TaLib前需要安装Python。

1.        pip安装

(官方安装教程文档:https://mrjbq7.github.io/ta-lib/install.html

  • 在命令行下输入命令(在线安装):

pip install Ta-Lib

  • (注意:使用pip安装可能会出现这个问题:
    error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools”: https://visualstudio.microsoft.com/downloads/
    此时就需要手动安装。这个问题在安装其他python第三方包时也可能出现,解决方法与此相同)

2.        手动安装

A. 找到并下载自己需要的对应版本的whl格式文件。
(如:若本机安装是32位的python3.6,则选TA_Lib‑0.4.17‑cp36‑cp36m‑win32.whl下载;
若本机安装的是64位的python2.7,则选择TA_Lib‑0.4.17‑cp27‑cp27m‑win_amd64.whl,其他同理)

下载地址在:
https://www.lfd.uci.edu/~gohlke/pythonlibs/

B. 在命令行中(命令行的打开方式在文章最后的Tips里),进入此whl文件所在的目录,执行命令:

pip install 下载的whl文件名
如:pip install TA_Lib-0.4.17-cp37-cp37m-win_amd64.whl

C. 或不进入所在目录,直接执行命令:

pip install 文件所在的绝对路径+文件名
如:pip install D:\my_packages\ TA_Lib-0.4.17-cp37-cp37m-win_amd64.whl

3.        检测安装成功

在包安装成功后,命令行界面会有“ Successfully installed TA-Lib ”的提示。

也可通过在命令行输入命令“ pip install ta-lib ”进行检测,如果出现“ Requirement already satisfied: ta-lib in …”(”…“为安装此文件的目录),即表示安装成功。

三、TaLib函数介绍

1.        几个指标及其用法演示

注意:talib函数的输入数据需要是Numpy的ndarray 类型,如果数据不是这个类型就需要提前进行类型转换。(“Every function takes the same input, passed as a dictionary of Numpy arrays”)。

在使用tqsdk时,K线及tick序列可以使用to_dataframe()函数将数据序列转化为pandas.DataFrame,即可直接取用其close字段作为talib函数的输入数据了(例如:df_klines=klines.to_dataframe())。

  • SMA (简单移动平均线)(参数1:收盘价序列,参数2:时间周期(均线的计算长度 即 几日均线))

real = SMA(close, timeperiod=30)

例:双均线策略中使用SMA的实例:

https://github.com/shinnytech/tqsdk-python/blob/master/tqsdk/demo/doublema.py

  • ATR(平均真实波幅)
    (参数1:最高价序列,参数2:最低价序列,参数3:收盘价序列,参数4:时间周期)

real = ATR(high, low, close, timeperiod=14)

例:海龟策略中使用ATR的实例:

https://github.com/shinnytech/tqsdk-python/blob/master/tqsdk/demo/turtle.py

  • MACD(异同移动平均线)

macd, macdsignal, macdhist = MACD(close, fastperiod=12, slowperiod=26, signalperiod=9)

  • BBANDS (布林带)

upperband, middleband, lowerband = BBANDS(close, timeperiod=5, nbdevup=2, nbdevdn=2, matype=0)

2.        talib中所有指标函数

A. 按照首字母排序:

官方函数列表:http://ta-lib.org/function.html

B. 按照类型分组(点击超链接进入官方文档查看函数用法):

C. 每组的指标函数:

(可在页面内按 Ctrl+f 键搜索到指标后,点击其所在组别的超链接查看函数的使用方法)

  • 重叠研究
    BBANDS          —          Bollinger Bands (布林带)
    DEMA          —          Double Exponential Moving Average (双指数移动平均线)
    EMA          —          Exponential Moving Average (指数移动平均)
    HT_TRENDLINE          —          Hilbert Transform – Instantaneous Trendline
    KAMA          —          Kaufman Adaptive Moving Average
    MA          —          Moving average (移动平均线)
    MAMA          —          MESA Adaptive Moving Average (自适应移动平均)
    MAVP          —          Moving average with variable period (变周期移动平均)
    MIDPOINT          —          MidPoint over period
    MIDPRICE          —          Midpoint Price over period
    SAR          —          Parabolic SAR
    SAREXT          —          Parabolic SAR – Extended
    SMA          —          Simple Moving Average (简单移动平均线)
    T3          —          Triple Exponential Moving Average (T3)
    TEMA          —          Triple Exponential Moving Average (三重指数移动平均线)
    TRIMA          —          Triangular Moving Average
    WMA          —          Weighted Moving Average (加权移动平均线)
  • 动量指标
    ADX          —          Average Directional Movement Index (平均趋向指数)
    ADXR          —          Average Directional Movement Index Rating
    APO          —          Absolute Price Oscillator
    AROON          —          Aroon
    AROONOSC          —          Aroon Oscillator
    BOP          —          Balance Of Power
    CCI          —          Commodity Channel Index
    CMO          —          Chande Momentum Oscillator
    DX          —          Directional Movement Index
    MACD          —          Moving Average Convergence/Divergence (平滑异同移动平均线)
    MACDEXT          —          MACD with controllable MA type
    MACDFIX          —          Moving Average Convergence/Divergence Fix 12/26
    MFI          —          Money Flow Index
    MINUS_DI          —          Minus Directional Indicator
    MINUS_DM          —          Minus Directional Movement
    MOM          —          Momentum
    PLUS_DI          —          Plus Directional Indicator
    PLUS_DM          —          Plus Directional Movement
    PPO          —          Percentage Price Oscillator
    ROC          —          Rate of change : ((price/prevPrice)-1)*100
    ROCP          —          Rate of change Percentage: (price-prevPrice)/prevPrice
    ROCR          —          Rate of change ratio: (price/prevPrice)
    ROCR100          —          Rate of change ratio 100 scale: (price/prevPrice)*100
    RSI          —          Relative Strength Index (相对强弱指数)
    STOCH          —          Stochastic
    STOCHF          —          Stochastic Fast
    STOCHRSI          —          Stochastic Relative Strength Index
    TRIX          —          1-day Rate-Of-Change (ROC) of a Triple Smooth EMA
    ULTOSC          —          Ultimate Oscillator
    WILLR          —          Williams’ %R
  • 成交量指标
    AD          —          Chaikin A/D Line
    ADOSC          —          Chaikin A/D Oscillator
    OBV          —          On Balance Volume
  • 波动率指标
    ATR          —          Average True Range (平均真实波幅)
    NATR          —          Normalized Average True Range
    TRANGE          —          True Range (真实波幅)
  • 价格指标
    AVGPRICE          —          Average Price
    MEDPRICE          —          Median Price
    TYPPRICE          —          Typical Price
    WCLPRICE          —          Weighted Close Price
  • 周期指标
    HT_DCPERIOD          —          Hilbert Transform – Dominant Cycle Period
    HT_DCPHASE          —          Hilbert Transform – Dominant Cycle Phase
    HT_PHASOR          —          Hilbert Transform – Phasor Components
    HT_SINE          —          Hilbert Transform – SineWave
    HT_TRENDMODE          —          Hilbert Transform – Trend vs Cycle Mode
  • 形态识别
    CDL2CROWS          —          Two Crows (两只乌鸦)
    CDL3BLACKCROWS          —          Three Black Crows (三只乌鸦)
    CDL3INSIDE          —          Three Inside Up/Down (三内部上涨和下跌)
    CDL3LINESTRIKE          —          Three-Line Strike (三线打击)
    CDL3OUTSIDE          —          Three Outside Up/Down (三外部上涨和下跌)
    CDL3STARSINSOUTH          —          Three Stars In The South (南方三星)
    CDL3WHITESOLDIERS          —          Three Advancing White Soldiers (三白兵)
    CDLABANDONEDBABY          —          Abandoned Baby (弃婴形态)
    CDLADVANCEBLOCK          —          Advance Block (前方受阻(大敌当前))
    CDLBELTHOLD          —          Belt-hold (捉腰带线)
    CDLBREAKAWAY          —          Breakaway (脱离)
    CDLCLOSINGMARUBOZU          —          Closing Marubozu (收盘缺影线)
    CDLCONCEALBABYSWALL          —          Concealing Baby Swallow (藏婴吞没)
    CDLCOUNTERATTACK          —          Counterattack (反击线)
    CDLDARKCLOUDCOVER          —          Dark Cloud Cover (乌云压顶)
    CDLDOJI          —          Doji (十字)
    CDLDOJISTAR          —          Doji Star (十字星)
    CDLDRAGONFLYDOJI          —          Dragonfly Doji (蜻蜓十字/T形十字)
    CDLENGULFING          —          Engulfing Pattern (吞噬模式)
    CDLEVENINGDOJISTAR          —          Evening Doji Star (十字暮星)
    CDLEVENINGSTAR          —          Evening Star (暮星)
    CDLGAPSIDESIDEWHITE          —          Up/Down-gap side-by-side white lines (向上/下跳空并列阳线)
    CDLGRAVESTONEDOJI          —          Gravestone Doji (墓碑十字/倒T十字)
    CDLHAMMER          —          Hammer (锤头线)
    CDLHANGINGMAN          —          Hanging Man (上吊线)
    CDLHARAMI          —          Harami Pattern
    CDLHARAMICROSS          —          Harami Cross Pattern
    CDLHIGHWAVE          —          High-Wave Candle
    CDLHIKKAKE          —          Hikkake Pattern (陷阱)
    CDLHIKKAKEMOD          —          Modified Hikkake Pattern
    CDLHOMINGPIGEON          —          Homing Pigeon (家鸽)
    CDLIDENTICAL3CROWS          —          Identical Three Crows
    CDLINNECK          —          In-Neck Pattern
    CDLINVERTEDHAMMER          —          Inverted Hammer
    CDLKICKING          —          Kicking (反冲形态)
    CDLKICKINGBYLENGTH          —          Kicking – bull/bear determined by the longer marubozu
    CDLLADDERBOTTOM          —          Ladder Bottom
    CDLLONGLEGGEDDOJI          —          Long Legged Doji
    CDLLONGLINE          —          Long Line Candle
    CDLMARUBOZU          —          Marubozu
    CDLMATCHINGLOW          —          Matching Low (相同低价)
    CDLMATHOLD          —          Mat Hold
    CDLMORNINGDOJISTAR          —          Morning Doji Star (十字晨星)
    CDLMORNINGSTAR          —          Morning Star (晨星)
    CDLONNECK          —          On-Neck Pattern
    CDLPIERCING          —          Piercing Pattern (刺透形态)
    CDLRICKSHAWMAN          —          Rickshaw Man
    CDLRISEFALL3METHODS          —          Rising/Falling Three Methods
    CDLSEPARATINGLINES          —          Separating Lines
    CDLSHOOTINGSTAR          —          Shooting Star
    CDLSHORTLINE          —          Short Line Candle
    CDLSPINNINGTOP          —          Spinning Top(纺锤)
    CDLSTALLEDPATTERN          —          Stalled Pattern
    CDLSTICKSANDWICH          —          Stick Sandwich
    CDLTAKURI          —          Takuri (Dragonfly Doji with very long lower shadow)
    CDLTASUKIGAP          —          Tasuki Gap
    CDLTHRUSTING          —          Thrusting Pattern
    CDLTRISTAR          —          Tristar Pattern
    CDLUNIQUE3RIVER          —          Unique 3 River
    CDLUPSIDEGAP2CROWS          —          Upside Gap Two Crows
    CDLXSIDEGAP3METHODS          —          Upside/Downside Gap Three Methods
  • 统计函数
    BETA          —          Beta (贝塔系数)
    CORREL          —          Pearson’s Correlation Coefficient (r)
    LINEARREG          —          Linear Regression
    LINEARREG_ANGLE          —          Linear Regression Angle
    LINEARREG_INTERCEPT          —          Linear Regression Intercept
    LINEARREG_SLOPE          —          Linear Regression Slope
    STDDEV          —          Standard Deviation
    TSF          —          Time Series Forecast
    VAR          —          Variance
  • 数学变换
    ACOS          —          Vector Trigonometric ACos
    ASIN          —          Vector Trigonometric ASin
    ATAN          —          Vector Trigonometric ATan
    CEIL          —          Vector Ceil
    COS          —          Vector Trigonometric Cos
    COSH          —          Vector Trigonometric Cosh
    EXP          —          Vector Arithmetic Exp
    FLOOR          —          Vector Floor
    LN          —          Vector Log Natural
    LOG10          —          Vector Log10
    SIN          —          Vector Trigonometric Sin
    SINH          —          Vector Trigonometric Sinh
    SQRT          —          Vector Square Root
    TAN          —          Vector Trigonometric Tan
    TANH          —          Vector Trigonometric Tanh
  • 数学运算符
    ADD          —          Vector Arithmetic Add
    DIV          —          Vector Arithmetic Div
    MAX          —          Highest value over a specified period
    MAXINDEX          —          Index of highest value over a specified period
    MIN          —          Lowest value over a specified period
    MININDEX          —          Index of lowest value over a specified period
    MINMAX          —          Lowest and highest values over a specified period
    MINMAXINDEX          —          Indexes of lowest and highest values over a specified period
    MULT          —          Vector Arithmetic Mult
    SUB          —          Vector Arithmetic Substraction
    SUM          —          Summation

四、Tips

  1. 命令行打开方式

方法一:按下Win + R 键,弹出运行窗口,输入“cmd”后点击确定。

方法二:在电脑左下角的搜索框搜索“cmd”或“命令提示符”,点击检索结果“命令提示符”。

方法三:打开“开始”,点击“运行”,弹出运行窗口,输入“cmd”后点击确定。

  • 运行窗口如图所示:

海龟交易法则在期货中的python代码实现

一、什么是海龟交易法则

海龟交易法是著名的公开交易系统,1983年著名的商品投机家理查德. 丹尼斯在一个交易员培训班上推广而闻名于世。其法则覆盖了交易的各个方面,并且不给交易员留下一点主观想象决策的余地。它是一套非常完整的趋势跟随型的自动化交易策略,具备一个完整的交易系统的所有成分。.这个复杂的策略在入场条件、仓位控制、资金管理、止损止盈等各个环节,都进行了详细的设计,它基本上可以作为复杂交易策略设计和开发的模板。对于币市的大涨大跌行情,海龟交易法则正是应付这种极端行情的利器。

二、策略的实现方法

  1. 趋势信号的捕捉

    在趋势信号的扑捉上,海龟交易法则使用了一个非常重要的技术指标——唐奇安通道(Donchian channel)。这个通道很类似布林通道(Bollinger Bands),只是在具体计算方式上有些不一样。 唐奇安通道指标是Richard Donchian发明的,由3条不同颜色的曲线组成,该指标用周期(一般都是20,可以进行修改)内的最高价和最低价来显示市场价格的波动性,当其通道窄时表示市场波动较小,反之通道宽则表示市场波动比较大。

    当价格冲破该通道的上轨道时,就是可能的买信号;反之,冲破下轨时就是可能的卖信号。唐奇安通道的各项指标的计算方法为:

    • 上轨 = Max(最高价,n), n日最高价的最大值
    • 下轨 = Min(最低价,n),n日最低价的最小值
    • 中轨 = ( 上轨 + 下轨 ) / 2
  2. 仓位的基本单位Unit

    海龟法则的加仓原则是定义好一个小单位(Unit),使得该仓位的预期价值波动与总净资产的1%对应。也就是说,如果买入了这1个小单位的资产,那当天该仓位的市值变动幅度不会超过总净资产的1%。

    那么,如何定义这个小单位?又如何预估这个小单位能带来的价值波动呢?首先,在预估这个小单位带来的价值波动(该价值波动被称为N)上,海龟策略使用了对历史的价格波动进行统计的方法。具体计算公式如下:

    • TrueRange = Max( High − Low, High − PreClose, PreClose − Low )
    • N = ( 前19日的N值之和 + 当时的TrueRange ) / 20
      其中,High表示当日最高价,Low表示当日最低价,PreClose表示前一日收盘价。
      我们可以从定义上看出,N值确实能很恰当地表达该资产在价格上的最近波动幅度。
      这样,一个Unit就应该是这样计算出来的:
    • Unit = ( 1% * Total_net ) / N
      其中total_net就是总资产净值。
      可以看出,一个Unit的资产的价格波动幅度 = 总净资产的1%。
  3. 建仓

    建仓的动作来自于趋势突破信号的产生。如果当前价格冲破唐奇安通道上轨,就产生了一个买的建仓信号,如果当前价格跌破下轨,就产生了一个卖空的建仓信号。初始建仓的大小为1个Unit。

  4. 加仓

    • 如果开的底仓是多仓,且行情最新价在上一次建仓(或者加仓)的基础上又上涨了0.5N,就再加一个Unit的多仓。
    • 如果开的底仓是空仓,且行情最新价在上一次建仓(或者加仓)的基础上又下跌了0.5N,就再加一个Unit的空仓。
    • 我们看到,海龟策略其实是一个追涨杀跌的策略的。
  5. 止损

    • 如果开的底仓是多仓,且行情最新价在上一次建仓(或者加仓)的基础上又下跌了2N,就卖出全部头寸,平仓止损。
    • 如果开的底仓是空仓,且行情最新价在上一次建仓(或者加仓)的基础上又上涨了2N,就买入全部头寸,平仓止损。
    • 当然,也可以自定义止损方案,使止损策略更符合所选的合约、适应自定义的个性化策略优化方案。
  6. 止盈

    • 如果开的底仓是多仓,且行情最新价跌破了10日唐奇安通道的下轨,就清空所有头寸结束策略。
    • 如果开的底仓是空仓,且行情最新价升破了10日唐奇安通道的上轨,就清空所有头寸结束策略。
    • 当然,可以自定义动态止盈方案。

三、代码实现

  • 工具:

模拟、实盘交易开源框架 TqSdk

(TqSdk文档: http://doc.shinnytech.com/pysdk/latest/index.html

Python 金融指数处理库Ta-Lib

(Talib文档:https://mrjbq7.github.io/ta-lib/doc_index.html

  1. 指标计算

    获取K线序列,根据定义计算出唐奇安通道上下轨。

    把K线转为pandas.DataFrame便于计算;使用talib库的ATR函数计算出N值(即平均真实波幅),然后根据账户权益的1%计算买卖单位unit。

  2.  建仓

    在净持仓数为0时:获取最新行情价,如果当前最新价大于唐奇安通道的上轨,则买入一个unit(此时持多仓);如果当前最新价小于唐奇安通道的下轨,则卖出一个unit(此时持空仓)。

  3. 加仓、止损、止盈

    在净持仓数不为0时:判断是持多仓还是空仓,获取最新行情价,根据加仓、止损、止盈策略的条件进行相应的仓位操作。

  4. 策略源代码

    https://github.com/shinnytech/tqsdk-python/blob/master/tqsdk/demo/turtle.py

四、回测

  1. 回测初始参数设置

    • 初始账户资金:100万
    • 回测日期:2018.9.10 —— 2018.11.12
    • 唐其安通道开仓天数周期:20
    • 唐其安通道止盈天数周期:10
    • 计算ATR所用天数:20
    • 允许下单的最高风险度:50%
    • 回测时盘口行情quote的更新频率:和K线分钟线的更新频率一致
  2. 回测结果

    海龟策略回测结果
    合约代码 合约品种 收益率 风险度 最大回撤 年化夏普率
    SHFE.hc1901 热卷 16.01% 44.64% 10.70% 2.1534
  3. 上表回测合约的累积收益走势图

    策略参考:https://www.douban.com/group/topic/104900172/

R-Breaker策略在期货中的python代码实现

一、策略简介

在外汇交易系统中,枢轴点 (Pivot Points) 交易方法是一种经典的交易策略。Pivot Points是一个非常单纯的阻力支撑体系,根据昨日的最高价、最低价和收盘价,计算出七个价位,包括一个枢轴点、三个阻力位和三个支撑位。R-Breaker是在Pivot Points上发展出来的一种短线交易策略,它结合了趋势和反转两种交易方式。

二、策略的基本原理

  1. 根据前一个交易日的收盘价、最高价和最低价数据通过一定方式计算出六个价位,从大到小依次为:突破买入价、观察卖出价、反转卖出价、反转买入、观察买入价、突破卖出价。以此来形成当前交易日盘中交易的触发条件。

  2. 追踪盘中价格走势,实时判断触发条件。具体条件如下:
    1. 突破
      • 在空仓条件下,如果盘中价格超过突破买入价,则采取趋势策略,即在该点位开仓做多。
      • 在空仓条件下,如果盘中价格跌破突破卖出价,则采取趋势策略,即在该点位开仓做空。
    2. 反转
      • 持多单,当日内最高价超过观察卖出价后,盘中价格出现回落,且进一步跌破反转卖出价构成的支撑线时,采取反转策略,即在该点位反手做空。
      • 持空单,当日内最低价低于观察买入价后,盘中价格出现反弹,且进一步超过反转买入价构成的阻力线时,采取反转策略,即在该点位反手做多。

  3. 设定止损条件。当亏损达到设定值后,平仓。
  4. 设定是否隔夜留仓。

三、代码实现

  1. 实现步骤

    1. 只要新产生一条日线,即可判断为新交易日的开始,则重新计算七条指标线;
    2. 根据策略的交易规则,依据当前的持仓信息以及行情最新价突破信息进行加减仓操作;
    3. 如果设置了非隔夜留仓,在策略进行过程中判断当前时间是否临近交易日结束,即当前行情时间已到达设定的平仓时间,若是则平仓;
    4. 设置止损点,每次调仓后记录调仓时的行情价,当调仓价与当前行情价之差大于止损点则平仓止损。
  2. 策略代码实现工具

  3. 策略源代码

四、回测

  1. 回测初始设置

    • 初始账户资金:100万
    • 回测日期:2018.11.14 —— 2018.12.25
    • 策略参数:平仓时间:14:50 ;止损点:35
    • 多、空头开仓手数:20手
    • 合约:INE.sc1905
    • 是否隔夜留仓:隔夜不留仓: 在每日收盘前,对所持合约进行平仓
    • 回测时盘口行情quote的更新频率:和K线分钟线的更新频率一致
  2. 回测结果

    R-Breaker策略回测结果
    合约代码 合约品种 收益率 风险度 最大回撤 年化夏普率
    INE.sc1905 原油 37.32% 0.00% 2.78% 6.1229
  3. 上表回测结果中累计收益走势图

Dual Thrust策略在期货中的python代码实现

一、Dual Thrust策略介绍

Dual Thrust是一个趋势跟踪系统,由Michael Chalek在20世纪80年代开发,曾被Future Thruth杂志评为最赚钱的策略之一。Dual Thrust系统具有简单易用、适用度广的特点,其思路简单、参数很少,配合不同的参数、止盈止损和仓位管理,可以为投资者带来长期稳定的收益,被投资者广泛应用于股票、货币、贵金属、债券、能源及股指期货市场等。

在Dual Thrust交易系统中,对于震荡区间的定义非常关键,这也是该交易系统的核心和精髓。它的逻辑原型是较为常见的日内交易策略之一开盘区间突破策略,以今日开盘价加减一定比例的昨日振幅,确定上下轨。日内突破上轨时平空做多,突破下轨时平多做空。Dual Thrust系统使用Range = Max(HH-LC,HC-LL)来描述震荡区间的大小。其中HH是N日High(最高价)的最高价,LC是N日Close(收盘价)的最低价,HC是N日Close的最高价,LL是N日Low(最低价)的最低价。

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

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

三、策略实现

1.计算

  • HH:N日High的最高价
  • LC:N日Close的最低价
  • LL:N日Close的最高价HC,N日Low的最低价
  • 范围:Range = Max( HH – LC , HC – LL )
  • 上轨(买入):BuyLine = Open + K1 * Range ;(其中Open为开盘价)
  • 下轨(卖出):SellLine = Open + K2 * Range

2.构造系统

  • 当价格向上突破上轨时,如果当时持有空仓,则先平仓,再开多仓;如果没有仓位,则直接开多仓。
  • 当价格向下突破下轨时,如果当时持有多仓,则先平仓,再开空仓;如果没有仓位,则直接开空仓。

3.策略代码实现工具

模拟、实盘交易开源框架:TqSdk

TqSdk文档:http://doc.shinnytech.com/pysdk/latest/index.html

4.策略源代码

https://github.com/shinnytech/tqsdk-python/blob/master/tqsdk/demo/dualthrust.py

四、回测

1.回测初始设置

  • 初始账户资金:100万
  • 回测日期:2018.11.13 —— 2018.11.28
  • 策略参数:过去N日天数:5; 上轨K1:0.2; 下轨K2:0.5
  • 多头、空头开仓手数:30手
  • 回测时盘口行情quote的更新频率:和订阅的tick的更新频率一致

2.回测结果

Dual Thrust 策略回测结果
合约代码 合约品种 收益率 风险度 最大回撤 年化夏普率
SHFE.au1812 13.71% 84.95% 2.04% 8.87
SHFE.rb1812 螺纹钢 11.50% 6.30% 4.99% 5.93

3.上表回测结果中SHFE.au1812的累计收益走势图

策略参考:https://xueqiu.com/5256769224/32429363

VWAP算法(成交量加权平均价格)在期货中的代码实现

VWAP介绍

根据各个算法交易中算法的主动程度不同,可以把算法交易分为被动型算法交易、主动型算法交易、综合型算法交易三大类。而成交量加权平均价格(VWAP)属于被动型算法交易,它也是在日常算法交易中应用最为广泛的交易策略算法,国外机构有一半的算法交易量是采取VWAP策略及其衍生算法交易完成的。

成交量加权平均价格(VWAP)算法就是将大额报单按照规定期限内预测的交易量分布比例拆分成多个小额订单进行委托交易。即先将交易时间分成等时长的时间片,然后根据历史各时间片的交易情况来预测当日内各时间片交易量在全天交易量的占比;最后根据预测的交易占比拆分总交易量到各个时间片执行交易。

其基本思路是从历史交易模式出发,统计归纳历史成交时间、成交量、价格分布等的规则,并将这些规则应用于之后的交易。原则是每一个时间单元完成交易的总量占这段计划交易时段内市场总交易的比例恒定,这一算法交易实现的成交价格的比较基准为一段时间内的市场成交量加权均价。

该策略不是最优的算法策略,将大额报单分拆成较小的报单在一段时间内分开交易,主要是为了降低大额报单对市场短时间的冲击成本,并达到隐藏交易行为的目的, 并不寻求最小化所有成本。理论上,在没有额外的信息,也没有针对价格趋势预测的情况下,VWAP是最优的算法交易策略。

VWAP代码实现

本VWAP策略代码使用Pandas及TiaQin Python SDK实现预测拆单计算和交易。

Pandas文档:http://pandas.pydata.org/pandas-docs/stable/index.html

TqSdk文档:http://doc.shinnytech.com/pysdk/latest/index.html

本策略代码实现与标准VWAP策略的定义在交易时间上有所不同,标准VWAP策略按照日内交易量分布预测,日内交易量分布即某一时间区间内的交易量占整个交易日交易量的比例。本代码实现将交易时段设置为一个交易日内可选的的任何时段,长度可手动修改设置。使策略的运用更加灵活。

另外,因为成交量占比是小数,成交量为整数,则每个成交量预测值为占比预测值乘以预设的目标手数后进行四舍五入得到,这可能会导致此时所有时间单元的成交量预测值的总和与目标手数不同。初始解决方案为把误差的手数修改到成交量最大的时间单元上,但它并非是一个确定能将误差减小的方法,因此选择另一种解决方案。此解决方案为,设置剩余手数初值为总目标手数,剩余占比值初值为1,循环所有时间单元的占比预测值:当前时间单元的成交量预测值为:剩余手数*(当前时间单元占比预测值/剩余占比值),然后将总占比值减去当前时间单元的占比值,将剩余成交量减去当前时间单元的成交量预测值。

本VWAP策略的实现可分为以下4个步骤:

  • 设定时间单元的长度、目标交易手数、用于计算成交量预测占比的样本长度(即过去交易日的天数)、计划交易时段的起止时间等参数;
  • 将过去每个交易日划分为若干等长时间单元,取出每个交易日的所有时间单元中包含在计划交易时段内的所有时间单元;
  • 计算每个选定时间单元的成交量在此交易时段内总成交量的占比,然后将所有交易日中处于同一时间的时间单元的占比求平均值(即为预测的每个时间单元的成交量占比值),用每个时间单元的占比预测值计算其成交量预测值;
  • 到达交易时段的起始时间即按照预测值进行等时长下单。

源代码

https://github.com/shinnytech/tqsdk-python/blob/master/tqsdk/demo/vwap.py

 

网格交易策略在期货中的Python代码实现

一、什么是网格交易策略

网格交易又名渔网交易,就是跌买涨卖。它适合震荡市,震荡市就是行情价围着一个数字上下浮动的,这个数字就是设置的价格中轴线。

设定中枢价格后,对投资标的进行机械式操作,下跌时,进行分档买入,上涨时,进行分档卖出。网格法不依赖人为的思考,完全是一种程序行为,像渔网一样,利用行情的波动在网格区间内低买高卖。通过反复循环差价赚取利润。

二、策略优缺点

优点: 网格交易策略适合价格在一个范围内波动的投资标的,能够在震荡市里不断积累利润,降低长线投资的成本……

缺点: 网格策略只适合震荡市;收益率较低;资金利用率低;操作时间长;长时间的浮亏……

三、网格交易实现过程

1.制定网格计划

在策略开始之前先设置中枢价格,在多头、空头方向分别建立网格系统(设置网格档位(格子)数量、每个网格的触发价格、持仓手数)。
(注: 各参数的具体值是根据策略使用者的经验以及对应不同合约进行调整、优化;网格的价格档位等参数可手动填入也可用计算机按一定比例计算出)

2.多头方向交易

  • 买入
    如果行情最新价跌过下一个网格档位(多头的档位价格依次下跌)的价格时,则买入下一个档位对应的手数。
  • 卖出
    如果行情最新价涨过上个网格档位的价格(因为多头希望在一定价格买入后在更高的价格卖出,所以价格跌过一格就买入那一格的手数,涨过上一格才卖出当前格买入的手数),则进行减仓操作卖出当前档位对应的手数(如果当前在网格第一个档位,价格涨过起始价才能触发减仓的卖出操作)。

3.空头方向交易

  • 卖出
    如果行情最新价涨过下一个网格档位(空头的档位价格依次上涨)的价格时,卖出下一个档位对应的手数。
  • 买入
    如果行情最新价跌过上个网格档位的价格(因为空头希望在一定价格卖出后在更低的价格买入,所以价格涨过一格就卖出那一格的手数,跌过上一格才买入当前格卖出的手数),则进行减仓操作买入当前档位对应的手数(如果当前在网格第一个档位,价格跌过起始价才能触发减仓的买入操作)。

4.实例说明(以多头方向为例)

网格序号 价格 买入持仓手数 卖出持仓手数
0 4047.00 1
1 4026.77 1 2
2 4006.63 2 3
3 3986.60 3 4
4 3966.67 4 5
5 3946.83 5 6
6 3927.10 6 7
7 3907.46 7 8
8 3887.92 8 9
9 3868.49 9 10
10 3849.14 10
  1. 设置网格参数:如上表。假设:总资金100万,起始价格为4047元,建立多头方向的10个档位,包含4047到14元的10个价格。
  2. 开始策略
    如果行情最新价每跌过一个价格档位,就买入对应的手数;最新价每涨过上一个档位,就卖出当前档位的持仓手数。如果当前档位是第一档, 则最新价在涨过起始价格时才卖出第一档买入的手数。

四、代码实现

工具:PyCharm,TqSdk
( TqSdk文档:http://doc.shinnytech.com/pysdk/latest/index.html )

方法:递归

1.设定网格计划参数

  • 网格起始价格(中枢价格);
  • 网格在多、空头的档位数量(即网格格子数量);
  • 多、空头网格每个档位的价格列表;
  • 多、空头每格的持仓手数列表。

2.实现方法

本策略使用递归实现,递归函数(wait_price(layer))的参数“layer”为当前所在的档位。策略初始参数为0,表示从起始价格开始进入判断最新价所在的网格方向、档位,此时持仓手数为0。

递归函数的逻辑为:

    • 先判断当前是处于多头的网格档位还是空头的网格档位:
      1. 如果价格在网格的多头方向,则进入多头的循环:获取最新行情价格,判断价格是否穿越到网格的其他档位:
        1. 如果当前档位还未到达最大档位并且最新价小于等于下一个档位的价格(如果当前档位已经等于最大档位,价格再跌也不会再加仓,也就不用再判断价格是否小于下一个档位了),那么就调整持仓手数为下一个档位对应的持仓手数,并进入下一层递归函数;如果从下一层递归函数返回到当前档位层次,则将持仓手数调整回下一个档位的手数(因为可能在下一档位中持仓手数已经被修改了)。
        2. 如果最新价大于当前档位的价格,则返回到上一档位层次,递归函数返回。
      2. 如果价格在网格的空头方向,则进入空头的循环:获取最新行情价格,判断价格是否穿越到网格的其他档位:
        1. 如果当前档位还未到达最大档位,并且最新价大于等于下一个档位的价格,则调整持仓手数为下一个档位对应的持仓手数,并进入下一层递归函数;如果从下一层递归函数返回到当前档位层次,则将持仓手数调整回下一个档位的手数
        2. 如果最新价小于当前档位的价格,则返回到上一档位层次,递归函数返回。

3.策略源代码

https://github.com/shinnytech/tqsdk-python/blob/master/tqsdk/demo/gridtrading.py

五、回测

1.回测参数设置

  • 初始账户资金:100万
  • 回测日期:2018.9.10——2018.11.16
  • 每跳动一档位手数变化:6手
  • 起始价位:4944.63
  • 多、空头每格涨跌幅(网格密度):0.005
  • 回测时盘口行情quote的更新频率:和K线分钟线的更新频率一致

2.回测结果

网格交易策略回测结果
合约代码 合约品种 收益率 风险度 最大回撤 年化夏普率
CZCE.SR811 白糖 25.42% 4.65% 2.43% 6.6779

3.上表回测结果的累计收益走势图

为何需要 TqSdk

通常一个交易系统的演化流程如下图所示:

整个流程可能会迭代多次,最初可能只是一个简单的想法,这时需要能快速实现一个原型,具体细节不需太在意,但是需要能尽快实现并付诸测试, 然后根据测试结果修改设计,调整代码,再重新测试,迭代多次后就从一个简单的想法逐步细化为一个完整的交易系统。

作为一套程序化交易框架,重点解决的是实现和测试这两个阶段,最好能直观的将交易逻辑转变为代码,能快速的检验交易逻辑,能尽可能少的修改代码以实现调整后的交易逻辑。 目前市面上现有的框架很少有能将这几点都做好的,因此才有了 TqSdk,接下来介绍 TqSdk 是如何处理这几个问题的。

直观的将交易逻辑转变为代码

如果不能直观的编码交易逻辑,会导致写出来的代码很难说和预期的交易逻辑是等价的,代码中的bug不容易被发现,也不好修复,因为很难确认修改后的代码就能符合预期的交易逻辑, TqSdk 没有使用目前市面上流行的回调框架(OnBar/OnTick/OnOrder…)就是为了能直观的体现交易逻辑,减少编码环节引入的坑。

典型程序框架

以一个通常的策略流程为例:判断开仓条件,开仓,判断平仓条件,平仓,使用 TqSdk 写出的伪代码:

from tqsdk import TqApi, TqSim, TargetPosTask

api = TqApi(TqSim())
klines = api.get_kline_serial("SHFE.rb1901", 60)
target_pos = TargetPosTask(api, "SHFE.rb1901")

while True:
    api.wait_update()
    if 开仓条件:
        target_pos.set_target_volume(1)
        break

while True:
    api.wait_update()
    if 平仓条件:
        target_pos.set_target_volume(0)
        break

第一行代码:

api = TqApi(TqSim())

是使用模拟交易(TqSim)创建一个 api 实例,该实例负责和服务器通讯,获取行情数据,发送报单指令等等,TqSdk 的各个功能模块都是围绕该 api 实例运转的

第二行代码:

klines = api.get_kline_serial("SHFE.rb1901", 60)

使用 get_kline_serial 获取 SHFE.rb1901 的分钟线数据

接下来:

target_pos = TargetPosTask(api, "SHFE.rb1901")

这行代码是创建一个负责调整 SHFE.rb1901 的任务。考虑到实际的下单流程比较复杂,下单之后可能无法立即成交,需要撤单重下,还需处理部分成交的情况, 因此 TqSdk 提供了 TargetPosTask 用来调整持仓,使用时只需指定目标仓位,之后的下撤单都由 TargetPosTask 负责完成

之后就是判断开仓条件的主循环:

while True:
    api.wait_update()
    if 开仓条件:
        target_pos.set_target_volume(1)
        break

wait_update 是等待业务数据更新。只要有任何业务数据变更(行情、账户资金、持仓、委托等),wait_update 就会返回,接下来就是判断是否会触发开仓条件。 如果没有触发则继续等待下次业务数据更新后再判断;如果触发了,则通过 target_pos 将 SHFE.rb1901 的目标持仓设置为多头 1 手, 具体的调仓工作则由 target_pos 在后台完成,然后跳出开仓循环,进入下面的平仓循环:

while True:
    api.wait_update()
    if 平仓条件:
        target_pos.set_target_volume(0)
        break

这段代码的结构和上面的开仓循环很相似,只是开仓条件换成了平仓条件,以及触发平仓条件后将 SHFE.rb1901 的目标持仓设置为 0 手(即空仓)

至此就完成一次完整的开平仓流程,如果平仓后还需再判断开仓条件可以把开仓循环和平仓循环再套到一个大循环中。

使用业务数据

TqSdk 的另一个特点是使用了 DIFF 协议,所有业务数据都在内存中,并可随时使用,以获取账户资金为例:

account = api.get_account()

get_account 只需调用一次,之后任何时刻都可以使用 account[“balance”] 获得最新的账户权益。类似的 get_quote 返回行情报价, get_kline_serial 返回K线数据等等。这些数据构成了业务信息截面,而业务截面的更新则是通过调用 wait_update 完成的, 当 wait_update 返回时业务截面即完成了从上一个时间截面推进到下一个时间截面。如果不调用 wait_update 则业务截面也不会更新, 因此在其他事情处理完后应第一时间调用 wait_update

这么做的好处是不需要策略手动保存感兴趣的业务数据。例如:策略希望在K线变化的时候使用盘口数据,如果使用 OnBar/OnTick 模型的话则需要策略在 OnTick 回调时手动保存 tick,然后在 OnBar 的时候再使用;另外用户无法控制 OnBar 和 OnTick 的回调顺序,因此可能出现没有触发 OnTick 就直接触发 OnBar, 导致访问不存在的 tick 数据。由于回调模型打乱了执行流程,因此这类问题并不是显而易见的,可能需要用户踩了坑之后才会意识到。

策略如果想知道 wait_update 到底更新了哪些业务数据可以调用 is_changing 函数判断感兴趣的业务对象是否有更新,例如:

if api.is_changing(account):
    print("账户资金变化")

就会在任何账户资金信息变化的时候打出 “账户资金变化”。如果只关心其中某些账户信息,可以在调用 is_changing 时传入感兴趣的字段:

if api.is_changing(account, "balance"):
    print("账户权益变化")

以上代码只会在账户权益发生变化的时候才会打出 “账户权益变化”。

快速的检验交易逻辑

使用 TqSdk 编写的策略,不需要修改策略代码,只需要调整创建 api 时填写的参数就可以进行历史回测或历史复盘。

历史回测

在创建 api 实例时传入 TqBacktest 策略就会进入历史回测模式:

from datetime import date
from tqsdk import TqApi, TqSim, TqBacktest

api = TqApi(TqSim(), backtest=TqBacktest(start_dt=date(2018, 5, 1), end_dt=date(2018, 10, 1)))

TqSdk 会自动根据策略所用到的数据自动选择回测的行情采样频率,例如:

klines = api.get_kline_serial("SHFE.rb1901", 60)

获取了 SHFE.rb1901 的分钟线,因此 SHFE.rb1901 的行情更新频率就是每分钟更新一次,如果使用:

ticks = api.get_tick_serial("SHFE.rb1901")

获取了 tick 数据的话,行情就是逐 tick 更新的。另外回测框架的设计保证了从 api 取出的数据不会出现未来函数。

回测结束后会输出交易记录和每日收盘时的账户资金情况,以及最大回撤、夏普比率等指标,这些数据可以导入到 excel 中或使用其他分析工具进一步处理。

历史复盘

上面提到的回测解决的是用来评价一个策略整体是否有效,但在回测过程中可能还会遇到交易时点和预期的不符,或者极端行情下策略表现异常等问题。 这个时候可能需要看看当时的行情具体是怎么走的,策略具体是怎么执行的,或者在策略实现阶段需要在非交易时间调试,这时就可以使用由天勤终端提供的历史复盘功能。 只需指定任一交易日,天勤终端将回到那一天,并完整重演全天的行情变化。在此过程中,使用 TqSdk 对接到天勤终端之后获取的数据都是所指定日期的数据, 一切都有如真正回到那天一样。并可在回放过程中可以任意暂停或加减速。

首先打开天勤终端并进入复盘模式,然后在创建 api 实例时帐号填写为 “SIM” 策略就会进入历史复盘模式:

api = TqApi("SIM")

之后策略的所有交易操作都可以在天勤终端中看到,并会标注到行情图上。同时也可以加减速或暂停行情回放,仔细分析策略执行情况。

尽可能少的修改代码以实现调整后的交易逻辑

TqSdk 的目标是能尽可能减少编码环节引入的坑,而交易逻辑本身的坑则需要用户自己填,如果每次调整交易逻辑都需要大规模的代码重构会严重阻碍交易系统的演化。

TqSdk 鼓励使用线性的编码风格,因此可以做到小调交易逻辑只需小改,只有大调交易逻辑时才需要大改。以 R-Breaker 策略为例, 第一版是留仓过夜,回测下来可能发现留仓过夜引入了很大的风险,却没有获得与风险对应的收益,因此修改交易策略,收盘前清仓离场, 对应代码的修改只需在主循环中加入判断是否接近收盘并平仓:

if api.is_changing(quote, "datetime"):
    now = datetime.strptime(quote["datetime"], "%Y-%m-%d %H:%M:%S.%f")
    if now.hour == close_hour and now.minute >= close_minute:  # 到达平仓时间: 平仓
        print("临近本交易日收盘: 平仓")
        target_pos.set_target_volume(0)  # 平仓
        deadline = time.time() + 60
        while api.wait_update(deadline=deadline):  # 等待60秒
            pass
        api.close()
        break

上述代码在行情时间变化时判断是否接近收盘,如果是的话则将目标持仓设为0(即空仓)。由于下单之后不一定能立即成交,价格变化后可能还需撤单重下, 因此等待一分钟后再退出,通常交易的合约不是太冷门的话一分钟应该足够了,如果不放心的话可以改为判断持仓手数是否为0。

更多的用例可以参见: http://doc.shinnytech.com/pysdk/latest/demo.html

为什么我们的K线不一样?

某些细心的用户已经发现了,我们软件的K线与其它软件的K线有点不一样。那么,究竟有什么不一样,为什么要这样做,这个问题比较有意思, 我们下面来详细的讲一讲。

首先我们要知道的是, K线图并不是市场原始数据。市场中,一个合约一天交易真正的原始数据是这个样子的:

成交时间 成交价 成交量 买单单号 卖单单号
2017/01/03 09:00:00.135000 3501.2 3 13748392 13744382
2017/01/03 09:31:20.345000 3501.2 3 15643244 15643242
2017/01/03 09:31:20.347000 3501.4 10 15643262 15643270
2017/01/03 09:31:20.352000 3502.0 8 15643282 15643283
2017/01/03 15:00:00.000000 3610.4 2 59020390 59020320

上面这个表,叫做“逐笔成交表”,市场中每发生一笔撮合成交,交易所都会把当时的时间,成交的价格,成交量,以及成交的双方是哪两个报单都记下来。拿到了这张表格,就能完全掌握一个合约每天成交价格的全部情况。但遗憾的是,这个表格的数据,交易所从来没有对外公开过,你也不可能在任何软件里面看到这套数据(这里有的同学要说了,行情软件右下角那里不就有一个“逐笔成交”板块么?呵呵,那个板块的数据并不是这个表的数据,具体是什么,下面会讲到)。

交易所真正对外发送的数据,学名叫“定时行情截面快照”,俗称tick数据。 什么意思呢?就像一个人拿着照相机,每隔一段时间(国内期货交易所一般是半秒),对着上面那张表的最后一行拍个照片,并且去掉了买卖双方的信息。

图1:从逐笔数据变为截面数据的原理,每隔半秒,交易所按照最近一次的成交价格,输出一笔行情数据。

这个数据是行情软件从交易所能拿到的最详细的数据表了。行情软件里面的Tick图和“分笔成交”板块里面的数据就是用的这套数据。从“逐笔成交表”到“定时行情截面快照”的过程中,损失了很多成交细节,同时制造了一个绝大多数用户都没有意识到的误区:用户在交易所公开数据里面所能拿到的所有成交价,其时间标注都是滞后的。如果你在软件中看到时间为09:30:01的价格是3500, 并不代表09:30:01这一时刻的成交价是3500,而是代表09:30:01之前,最后一笔成交价是3500。至于这笔成交的真实时间是多少,对不起,除了交易所没人知道。

图2:行情软件中的“分笔成交”板块,其中的每行并非代表一笔成交,时间也不是真实成交时间。两行之间也可能出现过其它的成交价格,在这里也都看不到。

了解了所谓Tick数据的真相以后,我们再来看K线图。K线图(除日线以外)并不是交易所发布的官方数据,只是行情软件为了方便用户做技术分析而构造的。与多数软件相比,我们的K线生成算法有两个特征:

  • 1、连续交易时段内生成K线时,对于正好处于K线分界位置的Tick数据,同时用作为前一根K线的收盘价和下一根K线的开盘价。
  • 2、连续交易时段内用K线填满。例如1个小时总是有60根分钟线,即使其中有几分钟没有成交,也不会把整根K线取消。

但是Why?为啥这样做就有道理呢?咱们一个一个分别说。

先来说第一条,有的同学特别不理解,你这么一搞,K线图上不就没有跳空缺口了么?确实是的。但是值得考虑的是,为什么你要在K线图上寻找跳空缺口呢?因为技术分析的教材教我们了,跳空缺口表示市场瞬间发生了巨大的价格变化。那么这句话有没有问题呢?有问题。只有在交易时段分断的地方(比如每天的收盘和第二天的开盘),这种说法是对的。在连续交易时段中,这个说法并不成立。让我们举个栗子:

图3:大多数行情软件在生成K线时,将正好处于K线边际的Tick数据作为前一根K线的收盘价,而不用作后一根K线的开盘价。

在上面这张图里面,可以看得很清楚,市场中一共发生了两次实际跳空事件,仅仅是因为成交时间的区别,一个在K线图上画成了跳空缺口,一个没有。有的同学以为,跳空缺口和大阳线的区别,表示一个是突然上涨,一个是持续上涨形成的,这其实都是幻觉。你以为你在观察市场突变的信号,其实只是在观察市场突变时交易所的钟是不是刚好在整点附近罢了。而且,交易品种的成交越活跃,你所看K线的周期越长,市场价格突变在K线图上体现为缺口的概率就越低。假定某个品种每秒有1笔成交,在任一笔成交价格暴涨的概率都相等,那当你看 3秒线时,每次暴涨有1/3的概率体现为跳空缺口,如果看的是一分钟线,那每次暴涨只有1/60的概率体现为跳空缺口。如果盯着跳空缺口去找交易机会,那每找到一次的同时,就漏掉了其它的59次。事实上,无论采取何种K线算法,都不可能正确的将连续交易过程的价格突变体现成K线图上的缺口形态。那么应该怎样处理较好呢?我们相信技术分析的基本原理:本质相同或相似的市场行为,应该表现为相同或相似的图表特征;本质不同的市场行为,应该表现为明显不同的图表特征。因此,我们在设计K线时,并不鼓励用户使用交易时段内的跳空缺口作为判断市场价格突变的分析和决策依据,特意消除了这种盘中的缺口信号(跨交易时段的跳空缺口仍保留)。

图4:快期的K线,正好处于K线边际的Tick数据既作为前一根K线的收盘价,又作为后一根K线的开盘价。每根K线都覆盖一个完整的3秒时段。交易时段内的所有价格变化都包含到K线中。

至于问题2,为什么要把交易时段内的K线填满,这同样是为了技术分析的准确。我们所使用的绝大多数技术指标和画线图形,都对K线条数非常敏感。我们以最简单的均线为例。假如我们在分钟线图上增加了一条周期为5的均线,我们希望看到的是什么呢?应该是最近5分钟的成交均价。如果我们的K线不是填满的,就会出现错误的结果:

    在K线不满的情况下,均线指标依然取了最近的5条K线来计算了均价,但这5根K线的时间范围是不确定的。换句话说,在K线不满的情况下,用户对于自己技术指标覆盖的时间范围是随机且不可控的。基于这样的数据做的分析和交易策略中也蕴含随机风险。因此我们在设计时刻意避免了这种情形,确保所有品种,所有合约的技术指标都是稳定连续可控的。

技术分析的历史悠久,许多成名著作与大师都诞生于几十上百年前。在那个年代,还没有计算机,报单画图基本靠手,报纸上的K线图还是以日线图为主。而最近一二十年来,随着IT技术飞速发展,市场交易频率和行情数据频率都空前提高,在这种高速高频环境中,技术分析的数据准备和分析工作应该怎样进行,这一方面还缺少权威成熟的理论与技术,有待于我们一同探索研究。

谢谢阅读,欢迎讨论。