Алгоритм торговли - действия в Q-learning/DQN

Следующее завершено с использованием 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 ответ

Пролог: этот ответ отражает многие десятилетия (на самом деле больше, чем я хотел бы признать) практического опыта, поэтому прости меня за такой опыт с количественными методами и инновациями, который дал мне более глубокое знание того, что работает, что может работать и что не работает (из-за уважения, ПОЧЕМУ оно не может работать), даже несмотря на то, что современные (в большинстве случаев просто популистские) средства массовой информации транслируют так массово и безответственно.


Действия: плохо определены
(если не дать основную причину для такой плоской, без кофеина и заведомо короткой модели)

Вы можете быть правы, что используя диапазон только { buy | hold | sell } действия - частая привычка только для научных работ, где авторы иногда решают проиллюстрировать свои продемонстрированные академические усилия по улучшению методов обучения / статистики и выбирают примерное приложение в области торговли. Жаль, что это может быть сделано в научных работах, но не в реальной торговле.

Зачем?

Даже с элементарным взглядом на торговлю проблема гораздо сложнее. В качестве краткого справочного материала существует более пяти основных областей такого модельного пространства. Учитывая, что торговля должна быть смоделирована, никто не может остаться без полностью описанной стратегии -

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

Любое мотивированное упрощение, при котором любой из этих пяти основных доменов будет пропущен, станет чем угодно, кроме настоящей Торговой стратегии.

Можно легко понять, что получается только от обучения (хуже от последующего использования такой модели при совершении реальных сделок) плохо определенной модели, которая не согласуется с реальностью.

Конечно, он может достигать (и будет (опять же, если не сформулирована плохо сформулированная критериальная функция минимизатора)) минимум математической функции, но это не гарантирует, что реальность немедленно изменит свое естественное поведение и начнет "подчиняться" плохо определенному моделировать и "танцевать" в соответствии с такими упрощенными или иным образом искаженными (плохо смоделированными) представлениями о реальности.


Награды: плохо определены
(если не указана причина игнорирования факта или задержка вознаграждения)

Если вы сомневаетесь, что это значит, попробуйте следовать примеру:
Сегодня Стратегия-модель решает A:Buy(AAPL,67),
Завтра, AAPL снижается, примерно на 0,1%, и, следовательно, немедленное вознаграждение (как было предложено выше) является отрицательным, что наказывает за такое решение. Модель стимулируется не делать этого (не покупайте AAPL).

Дело в том, что через некоторое время AAPL поднимается намного выше, производя гораздо более высокую награду по сравнению с первоначальными колебаниями в D2D. Close, что известно, но предложенная стратегия-модель Q-fun просто принципиально ошибочно не отразилась вообще.

Остерегайтесь WYTIWYG - то, что вы тренируетесь, это то, что вы получаете...

Это означает, что модель "как есть" может быть обучена, чтобы действовать в соответствии с такими определенными стимулами, но ее фактическое поведение не даст НИЧЕГО, кроме таких крайне наивных внутридневных "квази-скальпирующих" выстрелов с ограниченной (если вообще есть) поддержкой реального Рынка. Состояние и динамика рынка доступны для многих общепринятых количественных моделей.

Так что, конечно, можно обучить слепую реальностью модель, которая оставалась слепой и глухой (игнорируя реальность Проблемной области), но ради чего?


Эпилог:

Нет ничего похожего на " науку о данных "
даже когда MarCom & HR бьют свои барабаны и свистки, как они действительно много делают в наши дни

Зачем?

Именно потому, что вышеупомянутое обоснование наблюдается. Наличие Data-точек - ничто. Конечно, это лучше, чем стоять невежественным перед клиентом без единого наблюдения за реальностью, но Дата-очки не спасают игру.

Именно знание предметной области начинает иметь некоторый смысл с точек данных, а не точек данных как таковых.

Если вы все еще сомневаетесь, если у вас есть несколько терабайт чисел, нет никакой науки о науке, чтобы сказать вам, что представляют собой точки данных.

С другой стороны, если кто-то знает, из предметно-ориентированного контекста, эти точки данных должны быть показаниями температуры, Бог науки о данных все еще не может сказать вам, есть ли все (просто по стечению обстоятельств) в [°K] или [°C] (если есть только положительные показания>= 0,00001).

Другие вопросы по тегам