股指期货交易策略(内含 Matlab 程序)

一、前言

我国自 2010 年 4 月 16 日在中国金融期货交易所推出了沪深 300 指数股指期货,标志着中国的金融期货市场迈进了一个崭新的阶段,具有里程碑式的历史意义。我国的股指期货经过 3 年多的发展,交易情况异常活跃,已经成为投资者和套期保利者主要的对冲工具。

对于投资策略的分析和选择,现在主要存在两种观点基本面分析和技术分析,而这两种分析都是建立在非有效市场假设上的,主要是市场信息不对称和非理性人造成市场的无效。市场有效假设认为投资者是理性的,不会受到周围环境和自身心理的影响,在投资市场上始终追求效用最大化,而另一方面,市场有效假设认为市场的信息是完全公开而且各个投资者都能即时、免费地得到市场上的信息,同时投资者能够最有效地利用信息,这使投资市场上的价格处于随机游走的状态,即价格并没有规律吧可循,处于不断的随机变化中。

技术分析基本上被认为是一种统计上的科学,基于历史数据,观察数据的变化趋势,找出数据的变化规律,以及各个数据之间的关系,此外技术分析者认为投资者并不能得到充分的信息,并且会受到外界因素,例如心理、政治等的影响,投资者会不断地重复犯过的错误,这些错误都会反映在价格曲线上,而技术分析者就是根据这些信息,发现具有代表性的曲线形状,借此预测价格趋势,并且根据价格趋势进行套利交易。

现有的经典技术分析分为三种,顺势交易、反向交易和形态交易。顺势交易系统根据 MACD 等移动平均线的上升和下降,确定买入卖出信号,移动平均线的应用在股指期货的交易上比较常见,而且大量的历史数据证明移动平均线的趋势预测具有非常高的准确性。而反向交易则是根据相关的指标例如 RSI,对市场的反转趋势进行预测,当市场处于“超卖”现象时,投资者可以根据 RSI 的提示,进行多头操作,而当市场处于“超买”现象时,投资者则可以进行逆向操作,进行空头操作。除了顺势交易和反向交易外,技术分析者还会依赖形态交易,即根据形态,或者价格的突破点,确定买入卖出的时间点。

二、理论基础

(一)指数平滑移动平均线(MACD)

MACD 是 GeralAppel 于 1979 年提出的,被称为指数平滑异同移动平均线,是从双移动平均线发展而来的,由快的移动平均线减去慢的移动平均线,MACD 的意义和双移动平均线基本相同,但阅读起来更方便。当 MACD 以大角度变化,表示快的移动平均线和慢的移动平均线的差距非常迅速的拉开,代表了一个市场大趋势的转变。当 MACD 从负数转向正数,是买的信号。当 MACD 从正数转向负数,是卖的信号。

****1.MACD 计算方法

MACD 是计算两条不同速度(长期与中期)的指数平滑移动平均线(EMA)的差离状况来作为研判行情的基础。

(1)DIFF

①首先分别计算出收市价 SHORT 日指数平滑移动平均线与 LONG 日指数平滑移动平均线,分别记为 EMA(SHORT)与 EMA(LONG)。

②求这两条指数平滑移动平均线的差,即:DIFF=EMA(SHORT)-EMA(LONG)

(2)DEA

③再计算 DIFF 的 M 日的平均的指数平滑移动平均线,记为 DEA。

(3)MACD

④最后用 DIFF 减 DEA,得 MACD。MACD 通常绘制成围绕零轴线波动的柱形图。

在绘制的图形上,DIFF 与 DEA 形成了两条快慢移动平均线,买进卖出信号也就决定于这两条线的交叉点。很明显,MACD 是一个中长期趋势的投资技术工具。缺省时,系统在副图上绘制 SHORT=12,LONG=26,MID=9 时的 DIFF 线、DEA 线、MACD 线(柱状线)。

2.MACD 构造原理

MACD 指标是基于均线的构造原理,对价格收盘价进行平滑处理(求出算术平均值)后的一种趋向类指标。它主要由两部分组成,即正负差(DIF)、异同平均数(DEA),其中,正负差是核心,DEA 是辅助。DIF 是快速平滑移动平均线(EMA1)和慢速平滑移动平均线(EMA2)的差。在现有的技术分析软件中,MACD 常用参数是快速平滑移动平均线为 12,慢速平滑移动平均线参数为 26。此外,MACD 还有一个辅助指标——柱状线(BAR)。在大多数技术分析软件中,柱状线是有颜色的,在低于 0 轴以下是绿色,高于 0 轴以上是红色,前者代表趋势较弱,后者代表趋势较强。

3.MACD 应用法则

(1)DIF 和 MACD 的极端值和交叉属于技术指标的交叉和极端值的范畴,分为看涨和看跌两种情况。

①若 DIF 和 MACD 由负变正,与横坐标轴产生交叉,则市场属于多头市场。在较低的位置 DIF 向上突破 MACD 是买入信号,属于黄金交叉的范畴;在横轴附近,DIF 向下跌破 MACD 只能认为是回落,应获利了结。

②若 DIF 和 MACD 由正变负,与横坐标轴产生交叉,则市场属于空头市场。DIF 在较高的位置向下突破 MACD 是卖出信号,属于死亡交叉的范畴;在横轴附近,DIF 向上突破 MACD 只能认为是反弹,应获利了结。

③当 DIF 的取值达到很大的时候,应该考虑卖出;当 DIF 的取值达到很小的时候,应该考虑买进。当然,“很大”和“很小”必须涉及定量的问题,需要有主观的判断。

(2)DIF 和 MACD 与价格曲线的背离,属于技术指标的背离范畴。DIF 和 MACD 与价格形成背离是比较强烈的采取行动的信号,是卖出还是买入要由 DIF 的上升和下降情况而定。如果 DIF 或 MACD 与价格曲线在比较低的位置形成底背离,是买入的信号;如果 DIF 或 MACD 与价格曲线在比较高的位置形成顶背离,是卖出的信号。

(3)BAR 的使用。“民间”的使用方法是:当横轴下面的绿线缩短的时候买入,当横轴上面的红线缩短的时候卖出。

4.MACD 缺点

(1)由于 MACD 是一项中、长线指标,买进点、卖出点和最低价、最高价之间的价差较大。当行情忽上忽下幅度太小或盘整时,按照信号进场后随即又要出场,买卖之间可能没有利润,也许还要赔点价差或手续费。

(2)一两天内涨跌幅度特别大时,MACD 来不及反应,因为 MACD 的移动相当缓和,比较行情的移动有一定的时间差,所以一旦行情迅速大幅涨跌,MACD 不会立即产生信号,此时,MACD 无法发生作用。

(二)布林线(BoLL)

BoLL 指标指的是使用股价的历史数据,分别计算出 boll 指标的上轨,下轨和中轨。通道的上下限随着市场价格的上下波动而变化。在正常情况下,市场价格应始终处于价格通道内运行。如果市场价格脱离价格通道运行,则意味着行情处于极端的状态下。

在 BoLL 指标中,价格通道的上下轨是显示市场价格安全运行的最高价位和最低价位。我们一般认为,当价格突破布林线的上轨道线时,表明市场处于上涨的趋势,是买入点;而当市场价格突破布林线的下轨道线时,表明市场处于下跌趋势,是卖出的时机。

1.BoLL 的计算方法

在所有的指标计算中,BOLL 指标的计算方法是最复杂的之一,其中引进了统计学中的标准差概念,涉及到中轨线(MB)、上轨线(UP)和下轨线(DN)的计算。另外,和其他指标的计算一样,由于选用的计算周期的不同,BOLL 指标也包括日 BOLL 指标、周 BOLL 指标、月 BOLL 指标年 BOLL 指标以及分钟 BOLL 指标等各种类型。经常被用于股市研判的是日 BOLL 指标和周 BOLL 指标。虽然它们的计算时的取值有所不同,但基本的计算方法一样。

计算公式如下:

中轨线 =N 日的移动平均线

上轨线 = 中轨线 + 两倍的标准差

下轨线 = 中轨线-两倍的标准差

计算过程具体为:

(1)计算 MA

MA=N 日内的收盘价之和÷N

(2)计算标准差 MD

MD= 平方根 N 日的(C-MA)的两次方之和除以 N

(3)计算 MB、UP、DN 线

MB=(N-1)日的 MA

UP=MB+k×MD

DN=MB-k×MD

2.BoLL 的构造原理

BOLL 指出,在过去的 N 个交易日内,价格波动有大约 95% 的机会在 BD 和 BU 所“圈定”的区间内波动,只有 5% 的机会越过了这个区间。如果价格在 BOLL 带之内波动,则价格波动属于正常的状态。

如果价格的波动超出了 BOLL 带,说明发生了机会比较小的事件。平常不多见的事情如果出现了,我们有理由认为“外在条件”发生了变化,需要引起注意。此时,价格的波动属于不正常的状态。

BOLL 的宽度由标准差的大小决定。如果近期价格波动的幅度小,就比较小,BOLL 的宽度就小。如果近期价格波动的幅度大,就比较大,BOLL 的宽度就变大。

3.BoLL的使用法则

(1)价格向上越过 BU 并回落,是短线的卖出时机。这是因为,价格有 95% 的机会在 BU 之下。如果没有特别的原因,价格上升到了 BU 就应该卖出。

(2)价格向下越过 BD 并回升,是短线的买入时机。这是因为,价格有 95% 的机会在 BD 之上。如果没有特别的原因,价格下降达到 BD 就应该买入。

(3)BOLL 的宽度由狭窄变为宽阔,是大行情的先兆。BOLL 的宽度如果长时间狭窄,说明价格波动长时间是在小的范围内进行。如果 BOLL 的宽度变大,说明价格的波动幅度正在加大。在价格经过长时间的小波动后,如果 BOLL 的宽度变大,同时价格向上越过 BU,而且上升的幅度还不算大的时候,是短线的买入时机。同样,如果价格向下越过 BD,而且下降的幅度还不算大,是短线的卖出时机。这是因为,我们可以认为“外部环境”发生了变化。

4.BoLL的缺点

在 BOLL 所指出的内容中,主观判断的成份多,定性的内容比较多,与其他的技术指标相比,缺乏可操作性。

(三)随机指标(KDJ)

KDJ 指标又叫随机指标,是一种相当新颖、实用的技术分析指标,它起先用于期货市场的分析,后被广泛用于股市的中短期趋势分析,是期货和股票市场上最常用的技术分析工具。

随机指标 KDJ 一般是用于股票分析的统计体系,根据统计学原理,通过一个特定的周期(常为 9 日、9 周等)内出现过的最高价、最低价及最后一个计算周期的收盘价及这三者之间的比例关系,来计算最后一个计算周期的未成熟随机值 RSV,然后根据平滑移动平均线的方法来计算 K 值、D 值与 J 值,并绘成曲线图来研判股票走势。

1.KDJ 计算方法

KDJ 的计算比较复杂,首先要计算周期(n 日、n 周等)的 RSV 值,即未成熟随机指标值,然后再计算 K 值、D 值、J 值等。以 n 日 KDJ 数值的计算为例,其计算公式为

n 日 RSV=(Cn-Ln)/(Hn-Ln)×100

公式中,Cn 为第 n 日收盘价;Ln 为 n 日内的最低价;Hn 为 n 日内的最高价。

其次,计算 K 值与 D 值:

当日 K 值 =2/3×前一日 K 值 +1/3×当日 RSV

当日 D 值 =2/3×前一日 D 值 +1/3×当日 K 值

若无前一日 K 值与 D 值,则可分别用 50 来代替。

J 值 =3×当日 K 值 -2×当日 D 值

以 9 日为周期的 KD 线为例,即未成熟随机值,计算公式为

9 日 RSV=(C-L9)÷(H9-L9)×100

公式中,C 为第 9 日的收盘价;L9 为 9 日内的最低价;H9 为 9 日内的最高价。

K 值 =2/3×第 8 日 K 值 +1/3×第 9 日 RSV

D 值 =2/3×第 8 日 D 值 +1/3×第 9 日 K 值

J 值 =3×第 9 日 K 值 -2×第 9 日 D 值

若无前一日 K 值与 D 值,则可以分别用 50 代替。

2.KDJ 的构造原理

随机指标 KDJ 是以最高价、最低价及收盘价为基本数据进行计算,得出的 K 值、D 值和 J 值分别在指标的坐标上形成的一个点,连接无数个这样的点位,就形成一个完整的、能反映价格波动趋势的 KDJ 指标。它主要是利用价格波动的真实波幅来反映价格走势的强弱和超买超卖现象,在价格尚未上升或下降之前发出买卖信号的一种技术工具。它在设计过程中主要是研究最高价、最低价和收盘价之间的关系,同时也融合了动量观念、强弱指标和移动平均线的一些优点,因此,能够比较迅速、快捷、直观地研判行情。由于 KDJ 线本质上是一个随机波动的观念,故其对于掌握中短期行情走势比较准确。

3.KDJ 的使用法则

(1)K 与 D 值永远介于 0 到 100 之间。D 大于 80 时,行情呈现超买现象。D 小于 20 时,行情呈现超卖现象。

(2)上涨趋势中,K 值大于 D 值,K 线向上突破 D 线时,为买进信号。下跌趋势中,K 值小于 D 值,K 线向下跌破 D 线时,为卖出信号。

(3)KD 指标不仅能反映出市场的超买超卖程度,还能通过交叉突破发出买卖信号。

(4)KD 指标不适于发行量小、交易不活跃的股票,但是 KD 指标对大盘和热门大盘股有极高准确性。

(5)当随机指标与股价出现背离时,一般为转势的信号。

(6)K 值和 D 值上升或者下跌的速度减弱,倾斜度趋于平缓是短期转势的预警信号。

4.KDJ的缺点

KDJ 指标有非常明显的不足,如它的反应过于敏感,使使用者不是进货太早被套牢,就是出货太早被轧空,也就是所谓 KDJ 指标的低位钝化和高位钝化问题。

(四)市场波动指数(CMI)

市场波动指数(CMI)是一个用来判断市场走势类型的技术分析指标。它通过计算当前收盘价与一定周期前的收盘价的差值与这段时间内价格波动的范围的比值,来判断目前的股价走势是趋势还是盘整。CMI 指标越大说明市场在此时间段内波动的幅度越大。市场波动指数 CMI 的计算公式如下:

CMI=((收盘价 - 开盘价)/(最高价 - 最低价))×100

三、实证分析

(一)数据处理

1. 实证选择股指期货合约自 2011 年至 2014 年的 1 分钟股指期货交易数据。

2. 计算时不考虑杠杆,不计冲击成本,采用双边万分之 1.5 的手续费。

(二)交易策略

1. 当 CMI≧53 时

(1)开多:MACD 底背离;

(2)平多:MACD 顶背离;

(3)开空:当天 MACD 小于前一天 MACD、收盘价碰到 BOLL 的上轨、当期 J 值小于前一期的 J 值,三个条件中满足 2 个或 2 个以上;

(4)平空:当天 MACD 大于前一天 MACD、收盘价碰到 BOLL 的下轨、当期 J 值大于前一期的 J 值,三个条件中满足 2 个或 2 个以上;

2. 当 CMI<53 时

(1)开多:收盘价碰到 BOLL 的下轨;

(2)平多:收盘价碰到 BOLL 的上轨;

(3)开空:当天 MACD 小于前一天 MACD、收盘价碰到 BOLL 的上轨、当期 J 值小于前一期的 J 值,三个条件中满足 2 个或 2 个以上;

(4)平空:当天 MACD 大于前一天 MACD、收盘价碰到 BOLL 的下轨、当期 J 值大于前一期的 J 值,三个条件中满足 2 个或 2 个以上;

(三)实证结果

将 2011-2012 年总共 60680 个分钟数据作为样本内数据进行测试,优化参数。进而用 2012-2014 总共 121360 个分钟数据作为样本外数据进行检验。具体结果如下。

1. 样本内

图 1 样本内累计收益率图

从图 1 样本内实证结果可以看出,该交易策略具有较好的实证结果,累计收益呈较稳定的上涨趋势,同时回撤也相对比较小。

表 1 样本内实证结果

模型名称 样本内
总收益率 139.43%
测试时间段 60681:183041
测试周期 一分钟
交易手续费率 3.39
年化收益率 64.11%
最大回撤率 13.24%
收益风险比 3.38
交易次数 22613
胜率 50.23%

从表 1 样本内实证结果可以知道,交易策略的总收益率为 139.43%,相对比较高;而年化收益率为 64.11%。同时最大回撤率相对在一个可以接受的范围,为 13.24%。总而言之,本文的交易策略具有较大的实用性和可行性。

2. 样本外

图 2 样本外累计收益率图

从图 2 样本外实证结果可以看出,累计收益也呈较稳定的上涨趋势。

表 2 样本外实证结果

模型名称 样本外
总收益率 174.35%
测试时间段 183042:242720
测试周期 一分钟
交易手续费率 1.62
年化收益率 163.78%
最大回撤率 14.91%
收益风险比 6.27
交易次数 10827
胜率 50.83%

相较于样本内,样本外的实证结果中最大回撤率有所提高,为 14.91%。相对而言,其总收益率有所增加,为 174.35%;年化收益率也有大幅度的增加,为 163.78%。所以,总体而言,该交易策略存在一定的可行性。

四、总结

(1)在分析价格未来走势的时候结合交易量的变化趋势,为交易决策提供了有力的支持;

(2)根据市场波动指数将市场分为两种模式,更好地发挥了各种技术指标的作用;

(3)模型的收益率较高,实用性比较强;

(4)不足:参数比较多,容易陷入过度优化的结果。

五、附录 Matlab 程序

close all;clear;clc;
load ('C:\IF1MIN.mat');
data=data(60681:183041,1:6);
time=time(60681:183041,1);
tic
 
%fee=1.5/10000;% 手续费
fee=0;% 手续费, 实际要用 1.5/10000!!
 
Open=data(:,1);% 开盘价
High=data(:,2);% 最高价
Low=data(:,3);% 最低价
Close=data(:,4);% 收盘价
Vol=data(:,5);% 成交量
Openint=data(:,6);% 持仓量
hhvc=hhigh(High,7);
llvc=llow(Low,7);
 
[lth,wth]=size(data);
profit=zeros(lth,1);
holding=zeros(lth,1);
entryprice=zeros(lth,1);
tradetimes=0;
cmi=zeros(lth,1);
f=0;g=0;
 
loading= waitbar(0,'Loading');
 
% 计算 MACD
% 定义计算长度
shortPeriod=12;% 定义收盘价短期(快速)平滑移动平均计算长度
longPeriod=26;% 定义收盘价长期(慢速)平滑移动平均计算长度
DEAPeriod=9;% 定义 diff 线平滑移动平均计算长度
% 建立占位矩阵,提高程序运行效率
EMAshort=zeros(length(Close),1);
EMAlong=zeros(length(Close),1);
DIFF=zeros(length(Close),1);
DEA=zeros(length(Close),1);
MACD=zeros(length(Close),1);
% 用循环语句计算各个指标
EMAshort(1)=Close(1);% 初始化 EMAshort 第一值
EMAlong(1)=Close(1);% 初始化 EMAlong 第一个值
DEA(1)=0;% 初始化第一值
DIFF(1)=0;
MACD(1)=0;
for i=2:lth;
    % 计算短期和长期 EMA
  EMAshort(i)=Close(i)*(2/(shortPeriod+1))+EMAshort(i-1)*((shortPeriod-1)/(shortPeriod+1));
   EMAlong(i)=Close(i)*(2/(longPeriod+1))+EMAlong(i-1)*((longPeriod-1)/(longPeriod+1));
    % 计算 DIFF
    DIFF(i)=EMAshort(i)-EMAlong(i);
    % 计算 DEA
 DEA(i)=DIFF(i)*(2/(DEAPeriod+1))+DEA(i-1)*((DEAPeriod-1)/(DEAPeriod+1));
    % 计算 MACD
    MACD(i)=2*(DIFF(i)-DEA(i));
end
 
% 计算 KDJ
Ma_Min=5;% 参数 1,Ma_Min 表示测试用的 Ma 的最小值
Ma=Ma_Min; % 参数 1,Ma 表示均线的天数, 初始值为 Ma_Min
Ma_Max=60;% 参数 1,Ma_Max 表示测试用的 Ma 的最大值
for i=2:lth   
    if (Ma>i)  % 前面几个数据没有均线数据,用实际数据替代
        KDJ_Matrix(i,1)=0; % 每天的 RSV 参数,等于 0
        KDJ_Matrix(i,2)=50; % 每天的 K 值,因为前一天无 K 值,所以赋初值 50 
        KDJ_Matrix(i,3)=50; % 每天的 D 值,因为前一天无 D 值,所以赋初值 50
        KDJ_Matrix(i,4)=0;  % 每天的 J 值,因为当天无 K 值和 J 值,所以赋初值 0
    else
       KDJ_Matrix(i,1)=(data(i,4)-min((data(i-5+1:i,3))))/(max((data(i-5+1:i,2)))-min((data(i-5+1:i,3))))*100;% 每日 rsv
        KDJ_Matrix(i,2)=2/3*KDJ_Matrix(i-1,2)+1/3* KDJ_Matrix(i,1); % 每日 K 值,K 值 =2/3×前一日 K 值+1/3×当日 RSV
        KDJ_Matrix(i,3)=2/3* KDJ_Matrix(i-1,3)+1/3*KDJ_Matrix(i,2); % 每日 D 值,D 值 =2/3×前一日 D 值+1/3×当日的 K 植
        KDJ_Matrix(i,4)=3* KDJ_Matrix(i,2)-2*KDJ_Matrix(i,3); % 每日 J 值,J 值 =3* 当日 K 值 -2* 当日 D 值 
    end
end
 
 % 计算到 i 时刻 MACD 的最小值
for i=2:lth
    if MACD(i)>MACD(i-1)||MACD(i)==MACD(i-1);
        minMACD(i)=MACD(i-1);
    elseif MACD(i)
        minMACD(i)=MACD(i);   
    end
end
 
% 计算到 i 时刻 MACD 的最大值
for i=2:lth
    if MACD(i)>MACD(i-1)||MACD(i)==MACD(i-1);
       maxMACD(i)=MACD(i);
    elseif MACD(i)
         maxMACD(i)=MACD(i-1);
    end  
end
 
%cmi 指标
for i=2:lth
cmi(i)=(abs(Close(i)-Close(i-1)))*100/(hhvc(i)-llvc(i));
end
 
for i=7:lth
     holding(i)=holding(i-1);
    entryprice(i)=entryprice(i-1);    
    if mod (i,round(lth/50))==0 
        waitbar(i/lth,loading)
    end
    currentbar=mod(i,270);
    if i>10
        std1=std(Close(i-9:i),1)*2;
         ma=mean(Close(i-9:i));
        up=ma+std1;
        dn=ma-std1;
         if(cmi(i)>53)||(cmi(i)==53)
        buy=(llvc(i)% 开多 
       sellshort=((MACD(i)up))||((MACD(i)up)&&(KDJ_Matrix(i,4)% 开空
        sell=(hhvc(i)>hhvc(i-1))&&(maxMACD(i)==maxMACD(i-1));% 平多
 buytocover=((MACD(i)>MACD(i-1))&&(Close(i)MACD(i-1))&&(KDJ_Matrix(i,4)>KDJ_Matrix(i-1,4)))||((Close(i)KDJ_Matrix(i-1,4)));% 平空
         end
       ifcmi(i)<53
       buy=Close(i)% 开多
      sellshort=((MACD(i)up))||((MACD(i)up)&&(KDJ_Matrix(i,4)% 开空
       sell=Close(i)>up;% 平多 buytocover=((MACD(i)>MACD(i-1))&&(Close(i)MACD(i-1))&&(KDJ_Matrix(i,4)>KDJ_Matrix(i-1,4)))||((Close(i)KDJ_Matrix(i-1,4)));% 平空 
       end
       
%% 交易思想
% 当 cmi 大于或等于 53 时
% 开多:MACD 底背离;
% 平多:MACD 顶背离;
% 开空:当天 MACD 小于前一天 MACD、收盘价碰到 BOLL 的上轨、当期 J 值小于前一期的 J 值,三个条件中满足 2 个或 2 个以上;
% 平空:当天 MACD 大于前一天 MACD、收盘价碰到 BOLL 的下轨、当期 J 值大于前一期的 J 值,三个条件中满足 2 个或 2 个以上;
% 当 cmi 小于 53 时
% 开多:收盘价碰到 BOLL 的下轨;
% 平多:收盘价碰到 BOLL 的上轨;
% 开空:当天 MACD 小于前一天 MACD、收盘价碰到 BOLL 的上轨、当期 J 值小于前一期的 J 值,三个条件中满足 2 个或 2 个以上;
% 平空:当天 MACD 大于前一天 MACD、收盘价碰到 BOLL 的下轨、当期 J 值大于前一期的 J 值,三个条件中满足 2 个或 2 个以上; 
       
%% 利润自动计算 
        if(buytocover && holding(i)<-0.5) || (sell && holding(i)>0.5 )   
            profit(i)=profit(i)-Close(i)*fee;
            holding(i)=0;
            tradetimes=tradetimes+1;
        end        
        ifsellshort && holding(i)>-0.5
            ifholding(i)>0.5
               profit(i)=profit(i)-Close(i)*fee;
                tradetimes=tradetimes+1;
            end
            entryprice(i)=Close(i);
            profit(i)=profit(i)-Close(i)*fee;
            holding(i)=-1;
        end
        
        if buy&& holding(i)<0.5
            ifholding(i)<-0.5
               profit(i)=profit(i)-Close(i)*fee;
                tradetimes=tradetimes+1;
            end
            entryprice(i)=Close(i);
            profit(i)=profit(i)-Close(i)*fee;
            holding(i)=1;
        end
          ifholding(i-1)>0.5
           profit(i)=profit(i)+Close(i)-Close(i-1);
              p(i)=profit(i)/Close(i);  
        end
        ifholding(i-1)<-0.5
           profit(i)=profit(i)+Close(i-1)-Close(i);
            p(i)=profit(i)/Close(i);
        end  
    end
end
%%-%% 结果输出绘图
sumprofit=cumsum(profit)*300;
sump=cumsum(p);
% 最终收益
finalprofit=sumprofit(end)
finalp=sump(end)
% 交易次数
tradetimes
% 最大回撤
highestprofit=0;maxbackjj=0;
 maxbackd2=zeros(lth,1);
for I=1:lth
   highestprofit=max(highestprofit,sumprofit(I));
   maxbackd2(I)=max(maxbackjj,highestprofit-sumprofit(I));
end
[U,J]=max(maxbackd2);
for I=1:J
   highestprofit=max(highestprofit,sumprofit(I));
   maxbackd2(I)=max(maxbackjj,highestprofit-sumprofit(I));
end
 fprintf('最大的回撤为 %i\n', U);
 fprintf('最大的回撤的点为 %i\n', J);
 fprintf('最高的点为 %i\n',highestprofit);
 
 % 最大回撤
highestprofitj5=0;maxbackh2=0;
for I=2:lth
   highestprofitj5=max(highestprofitj5,sumprofit(I));
   maxbackh2=max(maxbackh2,highestprofitj5-sumprofit(I));
    drawdown=maxbackh2/highestprofitj5;
end
maxbackh2
% 资金曲线
drawdown
plot(time,sumprofit);datetick('x','YYYY');
% 收益风险比
timenum=datevec(time(end)-time(1));
income_rick=sumprofit(end)/maxbackh2/(timenum(1)+timenum(2)/12+timenum(3)/31)
ind=find(entryprice>0,1)
 fprintf('买入价格为 %i\n',entryprice (ind));
 netprofit=sumprofit(end)-entryprice(ind);
 fprintf('净利润 %i\n',netprofit);
 shouxufei=tradetimes*1.5/10000;
 fprintf('手续费为 %i\n', shouxufei);
 zongshouyilv=(sumprofit(end)-entryprice(ind))/entryprice(ind);
  fprintf('总收益率 %i\n',zongshouyilv );
nianhuashouyilv=zongshouyilv/(timenum(1)+timenum(2)/12+timenum(3)/31);
  fprintf('年化收益率 %i\n',nianhuashouyilv );
  zuidahuice=(highestprofit-sumprofit(J))/highestprofit;
  fprintf('最大单次盈利 %i\n', max(profit));
  fprintf('最大单次亏损 %i\n', min(profit));
  zdyl=find(profit>0);
  [hang,lie]=size(zdyl);
 f=find(profit<0);
  [h,l]=size(f);
  countx1=0;
  highestx1=0;
  countx2=0;
  highestx2=0;
  for I=1:(hang-1)
       ifzdyl(I+1)-zdyl(I)==1
          countx1=countx1+1;
          countx2=countx2+profit(zdyl(I));
       else
        highestx1=max(countx1,highestx1);
        highestx2=max(countx2,highestx2);
        countx1=0;
        countx2=0;
        continue;
      end
  end
 fprintf('最大连续盈利次数 %i\n', highestx1); 
 fprintf('最大连续盈利金额 %i\n', highestx2); 
zxsy=find(profit<0);
[hang1,lie1]=size(zxsy);
countx3=0;
highestx3=0;
countx4=0;
highestx4=0;
for J=1:(hang1-1)
 if zxsy(J+1)-zxsy(J)==1
     countx3=countx3+1;
     countx4=countx4+abs(profit(zxsy(J)));
 else
     highestx3=max(countx3,highestx3);
     highestx4=max(countx4,highestx4);
     countx3=0;
     countx4=0;
     continue;
 end
 
end
 
fprintf('最大连续亏损次数 %i\n',highestx3); 
fprintf('最大连续亏损金额 %i\n',-highestx4); 
 
fprintf('收益风险比 %i\n',income_rick); 
fprintf('胜率为 %i\n',hang/(hang+h));
timenum1=datevec(time(end)-time(8101));
jiaoyipinglv=tradetimes/(timenum1(1)*365+timenum1(2)*30+timenum1(3));
fprintf('交易频率 %i\n',jiaoyipinglv); 
stdtotal1=std(profit);
sharpraitio=zongshouyilv/stdtotal1;
fprintf('夏普比率 %i\n',sharpraitio);
 
close(loading);
toc