交易算法 - Q-learning / DQN中的行为

时间:2017-06-06 09:09:03

标签: reinforcement-learning quantitative-finance algorithmic-trading q-learning

以下使用MATLAB完成了。

我正在尝试使用Deep Q学习构建交易算法。我刚刚花了几年的每日股票价格,并将其用作训练集。

我的状态空间是我的 [money, stock, price]
money是我拥有的现金数量,
stock是我拥有的股票数量,和 price是该时间步的股票价格。

我遇到的问题是行动;在线查看,人们只有三个动作{ buy | sell | hold }

我的奖励功能是当前时间步骤中投资组合价值与前一时间步长之间的差额。

但是仅使用三个动作,我不确定如何选择购买,让67个股票价格?

我正在使用神经网络来近似q值。它有三个输入 [money, stock, price]和202输出,即我可以卖0到100个股票,0,我可以持有股票,或者我可以买到1-100股。

任何人都可以了解如何将此减少到3个动作?

我的代码是:

%  p is the stock price
% sp is the stock price at the next time interval 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

hidden_layers =   1;
actions       = 202;
net           = newff( [-1000000 1000000;-1000000 1000000;0 1000;],
                       [hidden_layers, actions],
                       {'tansig','purelin'},
                       'trainlm'
                       );

net           = init( net );

net.trainParam.showWindow = false;

% neural network training parameters -----------------------------------
net.trainParam.lr     =   0.01;
net.trainParam.mc     =   0.1;
net.trainParam.epochs = 100;

% parameters for q learning --------------------------------------------
epsilon        =    0.8;
gamma          =    0.95;
max_episodes   = 1000;
max_iterations = length( p ) - 1;

reset          =    false;
inital_money   = 1000;
inital_stock   =    0;

%These will be where I save the outputs
save_s        = zeros( max_iterations, max_episodes );
save_pt       = zeros( max_iterations, max_episodes );
save_Q_target = zeros( max_iterations, max_episodes );
save_a        = zeros( max_iterations, max_episodes );

% construct the inital state -------------------------------------------
% a           = randi( [1 3], 1, 1 );  
s             = [inital_money;inital_stock;p( 1, 1 )];


% construct initial q matrix -------------------------------------------
Qs            = zeros( 1, actions );
Qs_prime      = zeros( 1, actions );


for     i = 1:max_episodes
    for j = 1:max_iterations             % max_iterations --------------

        Qs = net( s );

        %% here we will choose an action based on epsilon-greedy strategy

        if ( rand() <= epsilon )
            [Qs_value  a] = max(Qs);
        else 
            a = randi( [1 202], 1, 1 );
        end

        a2                 = a - 101;
        save_a(j,i)        = a2;
        sp                 = p( j+1, 1 ) ; 
        pt                 = s( 1 ) + s( 2 ) * p( j, 1 );
        save_pt(j,i)       = pt; 
        [s_prime,reward]   = simulateStock( s, a2, pt, sp );

        Qs_prime           = net( s_prime );

        Q_target           = reward + gamma * max( Qs_prime );
        save_Q_target(j,i) = Q_target;
        Targets            = Qs;

        Targets( a )       =  Q_target;

        save_s( j, i )     = s( 1 );
        s                  = s_prime;
    end

    epsilon = epsilon * 0.99 ; 
    reset   = false; 
    s       = [inital_money;inital_stock;p(1,1)];
end

% ----------------------------------------------------------------------
function[s_prime,reward] = simulateStock( s, a, pt, sp )
                           money   = s(1);
                           stock   = s(2);
                           price   = s(3);

                           money   = money - a * price ;
                           money   = max( money, 0 );
                           stock   = s(2) + a;
                           stock   = max( stock, 0 );

                           s_prime = [money;stock;sp];
                           reward  = ( money + stock * price ) - pt;
end

1 个答案:

答案 0 :(得分:2)

序言:这个答案反映了经验丰富的几十年(实际上比我想承认的还要多),所以请原谅我有定量方法和创新的经验,尽管当代(在大多数情况下只是民粹主义)媒体如此大规模且如此不负责任地广播,但我对这些有用的东西,有效的东西和无法运作的东西(因为尊重它无法发挥作用)有了更深入的了解。 p>

行动:定义不明确的(如果没有给出如此扁平化,不含咖啡因和明智的短切模型的最终理由)

你可能是对的,使用一系列仅仅 { buy | hold | sell } 的行为是学术论文的常见习惯,作者有时会决定说明他们在改善学习方面的学术成就/统计方法并选择在交易域中挑选示例性应用程序。可怜的是,这可以在学术论文中完成,但不能在交易的现实中完成。

为什么?

即使对交易有基本看法,问题也要复杂得多。作为简要参考,这种模型空间有超过五个主要域。鉴于要对交易进行建模,如果没有完全描述的策略,就无法保持交易 -

Tru-Strategy := {    SelectPOLICY,
                     DetectPOLICY,
                        ActPOLICY,
                   AllocatePOLICY,
                  TerminatePOLICY
                  }

任何促使简化的动机,选择省略这五个主要域名中的任何一个域名,都将成为真正的交易策略。

人们可以很容易地发现,只是训练的结果(后来利用这种模型进行实际交易时更糟糕的是)一个不明确的模型,这与现实并不一致。

当然,它可以达到(并且(将再次,除非错误配制的最小化标准函数))一些数学函数的最小值,但这并不能确保现实立即改变它到目前为止的自然行为和开始“遵守“不明确的模式,并根据这种过于简化或以其他方式倾斜(模仿不足)的现象来”跳舞“。

奖励:定义不明确的(如果没有理由忽视事实或延迟奖励)

如果怀疑这意味着什么,请尝试效仿一个例子:
今天,战略模型决定 A:Buy(AAPL,67) 明天,AAPL下降,约0.1%,因此立即奖励(如上所述)是负面的,从而惩罚这样的决定。刺激模型不要这样做(不要购买AAPL)。

关键是,经过一段时间后,AAPL上升得更高,与D2D Close的初始波动相比产生更高的回报,这已知,但提议的策略模型Q-fun主要是错误的根本没有反映。

谨防WYTIWYG - 你所训练的是你得到的......

这意味着可以训练原模型按照这样定义的刺激进行操作,但它的实际行为会有利于NOTHING,但这种非常天真的日内“准剥离”射击有限(如果有的话)支持来自实际的市场状态&amp;市场动态可以通过许多行业范围内公认的定量模型获得。

所以,肯定,可以训练一个真实的盲人模型,这是盲目的&amp; amp;聋(忽略问题域的现实),但为了什么缘故?

<强>尾声:

即使在MarCom&amp;人力资源打败他们的鼓&amp;口哨,因为他们现在确实做了很多次

为什么?

正是因为上述观察到的理由。拥有数据点并不算什么。当然,如果没有对现实的单一观察,最好不要站在客户面前,但数据点不能保存游戏。

这是领域知识,从数据点开始有意义,而不是数据点本身。

如果仍有疑问,如果有一个数TB的数字,则没有 Data Science 告诉你,数据点代表什么。

另一方面,如果有人知道,从特定领域的背景来看,这些数据点应该是温度读数,那么仍然没有 数据科学 上帝告诉你,[°K]或[°C]是否全部(只是巧合)(如果只有正读数&gt; = 0.00001)。