contact@digquant.com.cn
400-1860-552
官方群:463071731
基于技术交易规则的动态模型股票价格

当一个大户决定买入一只股票,比如索罗斯的量子基金决定买入一只港股,通常买入量是很大的。问题的关键是,在一个时间点上可供买卖的股票数量非常有限,通常不到想要买入量的千分之一,所以大户们通常只有时间换空间,将一个大单分割成许多小单,一点一点地完成交易。


我们仔细分析一下这些小单是怎样完成的。如果价格处于上升趋势,而小单还是持续买入,那么上升趋势会被加强,这样一则入货成本大大提高,二则很可能买不到股票,因为交易对手发现股价快速上升很可能会停下来重新估值,不再卖出。所以,这些小单的大部分应该是在价格处于下降趋势时完成的,而且下降趋势越大,小单完成的频率越高。如果我们能用具体的数学函数刻画上述的大户买卖行为,那么我们就可以根据具体的股票价格数据辨识出大户的存在,进而跟庄操作,获取利润。下面我们来看具体怎么做。

   

首先定义一个趋势变量 x(t),通常是现时股价 p(t) 相对于某个移动平均 MA(t)的相对变化比,即

       x(t) = ln[p(t)/MA(t)]

其中

       MA(t) =[p(t)+p(t-1)+p(t-2)+p(t-3)+p(t-4)]/5

为5天移动平均线,也可以是3天或10天移动平均线,而 ln[p(t)/MA(t)]~= [p(t)-MA(t)]/MA(t) 为相对变化比。x(t)>0 表示现时股价 p(t) 在移动平均线 MA(t) 之上,价格处于上升趋势;而 x(t)<0 表示现时股价 p(t) 在移动平均线 MA(t) 之下,价格处于下降趋势。

  

再来定义大户的特征函数,分别为大买家特征函数 buy[x(t)],和大卖家特征函数 sell[x(t)],具体定义为:

        buy[x(t)] = -x(t) if x(t)<0; = 0 if x(t)>0

        sell[x(t)] = -x(t) if x(t)>0; =0 if x(t)<0

即当价格处于下降趋势时(x(t)<0),大买家 buy[x(t)]=-x(t)>0 呈正特征,且强度与趋势成正比,而此时大卖家 sell[x(t)]=0,没有操作;反过来,当价格处于上升趋势时(x(t)>0),大卖家 sell[x(t)]=-x(t)<0 呈正特征(对卖家来说负为正),且强度与趋势成正比,而此时大买家 buy[x(t)]=0,没有操作。

   

接下来就可以建立由大买家和大卖家为主要动力的价格动态方程,如下:

    ln[p(t+1)] = ln[p(t)] + aup(t)*buy[x(t)] + adown(t)*sell[x(t)] + e(t)

其中 ln[p(t+1)]–ln[p(t)]~= [p(t+1)-p(t)]/p(t) 为股价的相对变化,时变参数 aup(t)和 adown(t) 分别代表大买家和大卖家的操作强度,而e(t)代表除大买家和大卖家之外的其他投资者对股价相对变化的贡献 。

   

设 t+1 为现时,即我们知道股价数据 p(t+1),p(t), p(t-1), p(t-2), …,因此价格动态方程中ln[p(t+1)], ln[p(t)], buy[x(t)], sell[x(t)] 为已知量,根据经典的“加权递推最小二乘算法”,我们可以辨识出大买家和大卖家的实时操作强度 aup(t) 和adown(t),进而提出以下两种跟庄交易策略:

   

策略1:跟踪大买家:如果 aup(t)>0(大买家出现)且 adown(t)<0(没有大卖家),则全仓买入,持有;一旦 aup(t)<0(大买家离场),则立即清仓退出,持有现金,等待下一个回合。

   

策略2:随风骑行:如果 aup(t) > adown(t)(大买家占上风),则全仓买入,持有;一旦 aup(t) < adown(t)(风向逆转),则立即清仓退出,持有现金,等待下一个回合。



部分源代码展示:

function TTR(bInit,bDayBegin,cellPar)

global g_idxKData;

global g_idxRtns;

global TLen;

global Amtx;

global ww;

Freq=cellPar{1};

lmd=cellPar{2};

c=cellPar{3};

if bInit

    g_idxKData = traderRegKData('min',Freq);

    g_idxRtns = traderRegUserIndi(@getRTN,{g_idxKData,c});

    TLen = length(g_idxKData(:,1));

    ww=0;

    for i = 1:TLen

        Amtx(i).P=[10 0;0 10];

        Amtx(i).a1 = [0];

        Amtx(i).a2 = [0];

    end

    fp = fopen('zt.txt','w+');

    fclose(fp);

else

    signals = traderGetRegUserIndi(g_idxRtns,1);

    datas = traderGetRegKData(g_idxKData,1,true);

    for i = 1:TLen

        signal = signals(i:TLen:end,end);

        data = datas(8*(i-1)+1:8*i,:);

        [~,Len]=size(data);

        if Len<1 || sum(isnan(signal)) || data(6,end)==0

            continue;

        end

        x = [signal(2);signal(3)];

        K = Amtx(i).P*x/(x'*Amtx(i).P*x+lmd);

        eps = signal(1)-x'*[Amtx(i).a1(end);Amtx(i).a2(end)];

        Amtx(i).a1(end+1) = Amtx(i).a1(end)+K(1)*eps;

        Amtx(i).a2(end+1) = Amtx(i).a2(end)+K(2)*eps;

        Amtx(i).P=(Amtx(i).P-K*x'*Amtx(i).P)/lmd;

        fp = fopen('zt.txt','a+');

        fprintf(fp, '%d %d %.5f %.5f %.5f\n',i,ww, data(5,end),Amtx(i).a1(end),Amtx(i).a2(end));

        fclose(fp);

        ww=ww+1;

    end

end

end

 

function value=getRTN(cellPar,bpPFCell)

idxK =cellPar{1};

c =cellPar{2};

[targetNum,~]=size(idxK);

value=nan(targetNum*3,1);

regKMatrix = traderGetRegKData(idxK,4,false,bpPFCell);

for i = 1:targetNum

    data = regKMatrix(8*(i-1)+1:8*i,:);

    if length(data(5,:))<4 || sum(isnan(data(5,:)))

        continue;

    end

    value(i) =log(data(5,end)/data(5,end-1));

    x3 = log(data(5,end-1)/mean(data(5,1:end-2)));

    y1=meb(x3,0,c,2*c);

    y2=meb(x3,c,2*c,3*c);

    y3=meb(x3,2*c,3*c,3*c);

    y4=meb(x3,-2*c,-c,0);

    y5=meb(x3,-3*c,-2*c,-c);

    y6=meb(x3,-3*c,-3*c,-2*c);

    y7=meb(x3,-c,0,c);

    value(i+targetNum)=0;

    value(i+2*targetNum)=0;

    y=y1+y2+y3+y7;

    if y~=0

        value(i+targetNum)=(0.1*y1+0.2*y2+0.4*y3)/y;

    end              

   

   

    function y=meb(x,a,b,c)

if x <= a

    y=0;

elseif (x > a) && (x <= b)

    y=(x-a)/(b-a);

elseif (x > b) && (x <= c)

    y=(c-x)/(c-b);

elseif x > c

    y=0;

elseif a == b

    if x <= b

        y=1;

    elseif (x > b) && (x <= c)

        y=(c-x)/(c-b);

    elseif x > c

        y=0;

    end;

elseif b == c

    if x <= a

        y=0;

    elseif (x > a) && (x <= b)

        y=(x-a)/(b-a);

    elseif x > b

        y=1;

    end;

end;

end