基于MATLAB的策略回测模板.docx

上传人:b****4 文档编号:1486454 上传时间:2022-10-22 格式:DOCX 页数:29 大小:22.78KB
下载 相关 举报
基于MATLAB的策略回测模板.docx_第1页
第1页 / 共29页
基于MATLAB的策略回测模板.docx_第2页
第2页 / 共29页
基于MATLAB的策略回测模板.docx_第3页
第3页 / 共29页
基于MATLAB的策略回测模板.docx_第4页
第4页 / 共29页
基于MATLAB的策略回测模板.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

基于MATLAB的策略回测模板.docx

《基于MATLAB的策略回测模板.docx》由会员分享,可在线阅读,更多相关《基于MATLAB的策略回测模板.docx(29页珍藏版)》请在冰豆网上搜索。

基于MATLAB的策略回测模板.docx

基于MATLAB的策略回测模板

%% 简介:

系统基于布林通道原理,是一个趋势追踪系统。

%入场条件:

%ROC 大于 0 且价格突破布林带上轨就开多仓;

%ROC 小于 0 且价格跌破布林带下轨就开空仓;

%关键参数:

%买卖滑点参数 Slip

%布林带的周期数 BollLength;

%布林带标准差的倍数 Offset;

%ROC 的周期数 ROCLength;

%跟踪止损算法的周期数 ExitLength;

 

%% --提取数据--

user=input('请输入数据库用户名:

','s');

password=input('请输入数据库密码:

','s');

commodity=input('请输入商品(如 RB888):

','s');

Freq=input('请输入周期(如 M5):

','s');

conna=database('Futures_matlab',user,password);

cursor=exec(conna,strcat('select * from ',32,commodity,'_',Freq));%32 是指空格的 ASCLL 码

cursor=fetch(cursor);

data=cursor.Data;

Date=datenum(data(:

1));%日期时间

Open=cell2mat(data(:

2));%开盘价

High=cell2mat(data(:

3));%最高价

Low=cell2mat(data(:

4));%最低价

Close=cell2mat(data(:

5));%收盘价

Volume=cell2mat(data(:

6));%成交量

OpenInterest=cell2mat(data(:

7));%持仓量

 

%% --定义参数(常量)--

 

%策略参数

Slip=2;%滑点

BollLength=50;%布林线长度

Offset=1.25;%布林线标准差倍数

ROCLength=30;%ROC 的周期数

 

%品种参数

MinMove=1;%商品的最小变动量

PriceScale=1;%商品的计数单位

TradingUnits=10;%交易单位

Lots=1;%交易手数

MarginRatio=0.07;%保证金率

TradingCost=0.0003;%交易费用设为成交金额的万分之三

RiskLess=0.035;%无风险收益率(计算夏普比率时需要)

 

%% --定义变量--

 

%策略变量

UpperLine=zeros(length(data),1);%上轨

LowerLine=zeros(length(data),1);%下轨

MidLine=zeros(length(data),1);%中间线

Std=zeros(length(data),1);%标准差序列

RocValue=zeros(length(data),1);%ROC 值

 

%交易记录变量

MyEntryPrice=zeros(length(data),1);%买卖价格

MarketPosition=0;%仓位状态,-1 表示持有空头,0 表示

无持仓,1 表示持有多头

pos=zeros(length(data),1);%记录仓位情况,-1 表示持有空头,0 表示

无持仓,1 表示持有多头

Type=zeros(length(data),1);%买卖类型,1 标示多头,-1 标示空头

OpenPosPrice=zeros(length(data),1);%记录建仓价格

ClosePosPrice=zeros(length(data),1);%记录平仓价格

OpenPosNum=0;%建仓价格序号

ClosePosNum=0;%平仓价格序号

OpenDate=zeros(length(data),1);%建仓时间

CloseDate=zeros(length(data),1);%平仓时间

NetMargin=zeros(length(data),1);%净利

CumNetMargin=zeros(length(data),1);%累计净利

RateOfReturn=zeros(length(data),1);%收益率

CumRateOfReturn=zeros(length(data),1);%累计收益率

CostSeries=zeros(length(data),1);%记录交易成本

BackRatio=zeros(length(data),1);%记录回测比例

%记录资产变化变量

LongMargin=zeros(length(data),1);%多头保证金

ShortMargin=zeros(length(data),1);%空头保证金

Cash=repmat(1e6,length(data),1);%可用资金,初始资金为 10W

DynamicEquity=repmat(1e6,length(data),1);%动态权益,初始资金为 10W

StaticEquity=repmat(1e6,length(data),1);%静态权益,初始资金为 10W

 

%% --计算布林带和 ROC--

[UpperLine MidLine LowerLine]=BOLL(Close,BollLength,Offset,0);

RocValue=ROC(Close,ROCLength);

 

%% --策略仿真--

 

for i=BollLength:

length(data)

 

if MarketPosition==0

LongMargin(i)=0;%多头保证金

ShortMargin(i)=0;%空头保证金

StaticEquity(i)=StaticEquity(i-1);%静态权益

DynamicEquity(i)=StaticEquity(i);%动态权益

Cash(i)=DynamicEquity(i);%可用资金

end

if MarketPosition==1

LongMargin(i)=Close(i)*Lots*TradingUnits*MarginRatio;

StaticEquity(i)=StaticEquity(i-1);

DynamicEquity(i)=StaticEquity(i)+(Close(i)-OpenPosPrice(OpenPosNum))*TradingUnits*Lots;

Cash(i)=DynamicEquity(i)-LongMargin(i);

end

if MarketPosition==-1

ShortMargin(i)=Close(i)*Lots*TradingUnits*MarginRatio;

StaticEquity(i)=StaticEquity(i-1);

 

DynamicEquity(i)=StaticEquity(i)+(OpenPosPrice(OpenPosNum)-Close(i))*TradingUnits*Lots;

Cash(i)=DynamicEquity(i)-ShortMargin(i);

end

 

%开仓模块

 

%开多头

if MarketPosition~=1 && RocValue(i-1)>0 && High(i)>=UpperLine(i-1)%用 i-1,避免未来

函数

%平空开多

if MarketPosition==-1

MarketPosition=1;

ShortMargin(i)=0;%平空后空头保证金为 0 了

MyEntryPrice(i)=UpperLine(i-1);

if Open(i)>MyEntryPrice(i)%考虑是否跳空

MyEntryPrice(i)=Open(i);

end

MyEntryPrice(i)=MyEntryPrice(i)+Slip*MinMove*PriceScale;%建仓价格(也是平空

仓的价格)

ClosePosNum=ClosePosNum+1;

ClosePosPrice(ClosePosNum)=MyEntryPrice(i);%记录平仓价格

CloseDate(ClosePosNum)=Date(i);%记录平仓时间

OpenPosNum=OpenPosNum+1;

OpenPosPrice(OpenPosNum)=MyEntryPrice(i);%记录开仓价格

OpenDate(OpenPosNum)=Date(i);%记录开仓时间

Type(OpenPosNum)=1;%方向为多头

 

StaticEquity(i)=StaticEquity(i-1)+(OpenPosPrice(OpenPosNum-1)-ClosePosPrice(ClosePosNum))...

 

*TradingUnits*Lots-OpenPosPrice(OpenPosNum-1)*TradingUnits*Lots*TradingCost...

-ClosePosPrice(ClosePosNum)*TradingUnits*Lots*TradingCost;%平空仓时的

静态权益

 

DynamicEquity(i)=StaticEquity(i)+(Close(i)-OpenPosPrice(OpenPosNum))*TradingUnits*Lots;

end

%空仓开多

if MarketPosition==0

MarketPosition=1;

MyEntryPrice(i)=UpperLine(i-1);

if Open(i)>MyEntryPrice(i)%考虑是否跳空

MyEntryPrice(i)=Open(i);

end

MyEntryPrice(i)=MyEntryPrice(i)+Slip*MinMove*PriceScale;%建仓价格

OpenPosNum=OpenPosNum+1;

OpenPosPrice(OpenPosNum)=MyEntryPrice(i);%记录开仓价格

OpenDate(OpenPosNum)=Date(i);%记录开仓时间

Type(OpenPosNum)=1;%方向为多头

StaticEquity(i)=StaticEquity(i-1);

 

DynamicEquity(i)=StaticEquity(i)+(Close(i)-OpenPosPrice(OpenPosNum))*TradingUnits*Lots;

end

LongMargin(i)=Close(i)*Lots*TradingUnits*MarginRatio;%多头保证

Cash(i)=DynamicEquity(i)-LongMargin(i);

end

 

%开空头

%平多开空

if MarketPosition~=-1 && RocValue(i-1)<0 && Low(i)<=LowerLine(i-1)

if MarketPosition==1

MarketPosition=-1;

LongMargin(i)=0;%平多后多头保证金为 0 了

MyEntryPrice(i)=LowerLine(i-1);

if Open(i)

MyEntryPrice(i)=Open(i);

end

MyEntryPrice(i)=MyEntryPrice(i)-Slip*Mi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1