my simulate trading

宽客网,量化投资,宽客俱乐部

宽客网,量化投资,宽客俱乐部

宽客网,量化投资,宽客俱乐部

宽客网,量化投资,宽客俱乐部

宽客网,量化投资,宽客俱乐部

作者:fantuanxiaot

macd 交易我只是根据 ariszheng 老师的《金融数量分析 - 基于 matlab 分析》讲解试着想了个 idea,编了个程序,希望 lianzhang 大神和 faruto 大神多多向 fantuanxiaot 后辈指点!!

function MacdTrading_Hitting(N)

%  copyright by fantuanxiaot

%  如模拟 1000 个股价,则 N=1000, 输入 MacdTrading_Hitting(1000) 即可

%  一个纯粹自己设计的 MACD 指标的模拟动态回测交易,还需向高手求教

%  基于 MACD 指标的模拟动态交易

%%  股票价格和 MACD 指标的形成

%  股票价格和 MACD 指标的形成

%  股价模拟基于几何布朗运动模拟

%  N 是模拟的股价天数

Return=normrnd(0,0.07,N,1);

Initial=10;

%  股票的基期价格为 10

CumReturn=cumprod(1+Return);

%  累积收益率

Stock=Initial*CumReturn;

%  最终形成股票价格序列

%  对股价序列进行画图

figure(1)

set(figure(1),'color','w')

subplot(1,2,1)

hold on

plot(Stock,'r','linewidth',3)

title('股票价格序列','fontsize',16,'fontname','楷体');

legend('Sample Stock',4);

set(gca,'fontname','Times New Roman','fontsize',10)

xlabel('Times','fontname','Times New Roman','fontsize',16)

ylabel('Stock Price','fontname','Times New Roman','fontsize',16)

grid on

hold off

%  以上形成了股价序列

%  MacdPrice 的计算

MacdPrice=macd(Stock);

MacdPrice(1:25)=[];

%  从第二十五天开始进行交易模拟

Stock(1:25)=[];

%% 基于 MACD 指标的作图

%  基于 MACD 指标的作图

subplot(1,2,2)

plot(1:length(Stock),MacdPrice,'k','linewidth',2);

hold on

plot(1:length(Stock),MacdPrice,'ko','markersize',4,'markerfacecolor','b');

plot(1:length(Stock),Stock,'m','linewidth',2);

plot(1:length(Stock),Stock,'ko','markersize',4,'markerfacecolor','r');

for i=1:length(MacdPrice)

    hold on

    plot([i i],[MacdPrice(i) Stock(i)],'g--','linewidth',0.5)

end 

title('平滑异同移动平均线序列','fontsize',16,'fontname','楷体');

xlabel('Times','fontname','Times New Roman','fontsize',16)

ylabel('MACD Value','fontname','Times New Roman','fontsize',16)

legend('MacdPrice Line','MacdPrice Spot','Stock Line',...

    'Stock Spot','MacdPrice Contact Stock',4);

set(gca,'fontname','Times New Roman','fontsize',10)

grid on

hold off

%% 基于 MACD 指标的入仓点标记

%  基于 MACD 指标的入仓点标记

%  这里只是纯粹入仓点的标记,平仓点只是在两个入仓点之间进行寻找

%  仓位的设置

pos=zeros(1,length(Stock));

M=length(Stock);

signalbuy=zeros(M,1);

date=1:M;

%  基于 MacdPrice 和 Stock 进行交易

figure(2)

set(figure(2),'color','w')

hold on

plot(Stock,'r','linewidth',2);

xlabel('Times','fontname','Times New Roman','fontsize',16)

ylabel('Stock Price','fontname','Times New Roman','fontsize',16)

hold on

for i=2:M

    if MacdPrice(i-1)<0 && MacdPrice(i)>0

        signalbuy(i)=1;

    end

    if MacdPrice(i-1)>0 && MacdPrice(i)<0

        signalbuy(i)=-1;

    end

    if pos(i-1)==0

        if signalbuy(i)==1

            pos(i)=1;

            plot(date(i),Stock(i),'ko','MarkerFaceColor','m','markersize',16);

            text(date(i),Stock(i)+0.1,'多头入仓点','fontname','楷体','fontsize',12);

        elseif signalbuy(i)==-1

            pos(i)=-1;

            plot(date(i),Stock(i),'ko','MarkerFaceColor','k','markersize',16);

            text(date(i),Stock(i)+0.1,'空头入仓点','fontname','楷体','fontsize',12);

        else

            pos(i)=pos(i-1);

        end

    elseif pos(i-1)==1

        if signalbuy(i)==-1

            pos(i)=0;

            plot(date(i),Stock(i),'ko','MarkerFaceColor','k','markersize',16);

            text(date(i),Stock(i)+0.1,'空头入仓点','fontname','楷体','fontsize',12);

        else

            pos(i)=pos(i-1);

        end

    elseif pos(i-1)==-1

        if signalbuy(i)==1

            pos(i)=0;

            plot(date(i),Stock(i),'mo','MarkerFaceColor','m','markersize',16);

            text(date(i),Stock(i)+0.1,'多头入仓点','fontname','楷体','fontsize',12);

        else

            pos(i)=pos(i-1);

        end

    end

end

title('基于平滑异同移动平均线的入仓点标记','fontsize',16,'fontname','楷体');

grid on

legend('Sample Stock',4);

set(gca,'fontname','Times New Roman','fontsize',12)

hold off

%% 基于 MACD 指标的动态交易

%  基于 MACD 指标的动态交易

%  动态交易的回报

figure(3)

set(figure(3),'color','w')

plot(Stock,'g','linewidth',2);

xlabel('Times','fontname','Times New Roman','fontsize',16)

ylabel('Stock Price','fontname','Times New Roman','fontsize',16)

hold on

macd_return=[];

M=length(Stock);

date=1:M;

signalbuy=zeros(M,1);

pos=zeros(M,1);

hold on

for i=2:M

    if MacdPrice(i-1)<0 && MacdPrice(i)>=0

        signalbuy(i)=1;

    end

    if MacdPrice(i-1)>0 && MacdPrice(i)<=0

        signalbuy(i)=-1;

    end

    if pos(i-1)==0

        if signalbuy(i)==1

            pos(i)=1;

            plot(date(i),Stock(i),'mo','MarkerFaceColor','m','markersize',12);

            text(date(i),Stock(i)+0.1,'多头入仓点','fontname','楷体','fontsize',10);

            %  多头希望能够突破 1.1 倍的目标价格, 但是不希望跌落到 0.95 的目标价格

            %  如果想希望增加收益,hit_price=Stock(i)*1.2; 或者其他

            hit_price=Stock(i)*1.1;

            stop_price=Stock(i)*0.95;

            %  基期价格

            base_price=Stock(i);

        elseif signalbuy(i)==-1

            pos(i)=-1;

            plot(date(i),Stock(i),'bo','MarkerFaceColor','b','markersize',12);

            text(date(i),Stock(i)+0.1,'空头入仓点','fontname','楷体','fontsize',10);  

            %  空头希望能够突破 0.9 倍的目标价格, 但是不希望上升到 1.05 的目标价格

            %  如果想希望增加收益,hit_price=Stock(i)*0.8; 或者其他

            hit_price=Stock(i)*0.9;

            stop_price=Stock(i)*1.05;

            %  基期价格

            base_price=Stock(i);

        else

            pos(i)=pos(i-1);

        end

    %  多头仓位

    elseif pos(i-1)==1

            %  突破目标价格则平仓

        if Stock(i)>=hit_price

            %  则平仓, 暂时不考虑交易成本

            pos(i)=0;

            achieve_return=Stock(i)-base_price;

            macd_return=[macd_return achieve_return];

            plot(date(i),Stock(i),'ro','MarkerFaceColor','r','markersize',12);

            text(date(i),Stock(i)+0.1,'多头平仓点','fontname','楷体','fontsize',10);

            %  如果亏了则止损吧

        elseif Stock(i)<=stop_price

            pos(i)=0;

            achieve_return=Stock(i)-base_price;

            macd_return=[macd_return achieve_return];

            plot(date(i),Stock(i),'ro','MarkerFaceColor','r','markersize',12);

            text(date(i),Stock(i)+0.1,'多头平仓点','fontname','楷体','fontsize',10);

            %  如果 Macd 由大于 0 转为小于 0,则依旧平仓

        elseif MacdPrice(i)<=0

            pos(i)=0;

            achieve_return=Stock(i)-base_price;

            macd_return=[macd_return achieve_return];

            plot(date(i),Stock(i),'ro','MarkerFaceColor','r','markersize',12);

            text(date(i),Stock(i)+0.1,'多头平仓点','fontname','楷体','fontsize',10);

            %  如果以上三类情况都没有就呆在仓位里面把

        else

            pos(i)=pos(i-1);

        end

    %  空头仓位        

    elseif pos(i-1)==-1

        if Stock(i)<=hit_price

            pos(i)=0;

            achieve_return=base_price-Stock(i);

            macd_return=[macd_return achieve_return];

            plot(date(i),Stock(i),'ko','MarkerFaceColor','k','markersize',12);

            text(date(i),Stock(i)+0.1,'空头平仓点','fontname','楷体','fontsize',10);

        elseif Stock(i)>=stop_price

            pos(i)=0;

            achieve_return=base_price-Stock(i);

            macd_return=[macd_return achieve_return];

            plot(date(i),Stock(i),'ko','MarkerFaceColor','k','markersize',12);

            text(date(i),Stock(i)+0.1,'空头平仓点','fontname','楷体','fontsize',10);

        elseif MacdPrice(i)>=0

            pos(i)=0;

            achieve_return=base_price-Stock(i);

            macd_return=[macd_return achieve_return];

            plot(date(i),Stock(i),'ko','MarkerFaceColor','k','markersize',12);

            text(date(i),Stock(i)+0.1,'空头平仓点','fontname','楷体','fontsize',10);

        else

            pos(i)=pos(i-1);

        end

    end

end

title('基于 MACD 的动态交易','fontsize',16,'fontname','Times New Roman');

grid on

legend('Sample Stock',1);

set(gca,'fontname','Times New Roman','fontsize',12)

hold off

%  样本收益作图

figure(4)

set(figure(4),'color','w')

subplot(1,2,1)

hold on

plot(macd_return,'go','markeredgecolor','k','markerfacecolor','g','markersize',8)

plot(macd_return,'b','linewidth',1)

set(gca,'fontname','Times New Roman','fontsize',12)

title('Macd 动态收益线状图','fontname','Times New Roman','fontsize',16)

legend('Macd 收益','Macd 收益')

subplot(1,2,2)

h=stem(macd_return);

set(h,'color','k')

set(h,'MarkerFaceColor','m','MarkerEdgeColor','k','markersize',8)

legend('Macd 收益')

set(gca,'fontname','Times New Roman','fontsize',12)

title('Macd 动态收益杆状图','fontname','Times New Roman','fontsize',16)

hold off

end