基于MATLAB的策略回测模板.docx
《基于MATLAB的策略回测模板.docx》由会员分享,可在线阅读,更多相关《基于MATLAB的策略回测模板.docx(29页珍藏版)》请在冰豆网上搜索。
![基于MATLAB的策略回测模板.docx](https://file1.bdocx.com/fileroot1/2022-10/13/d226dd64-e092-45c6-8357-c088d5eb8a07/d226dd64-e092-45c6-8357-c088d5eb8a071.gif)
基于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