Joomla 3.1 Templates by FatCow Coupon

SQL и биржевой график. (Бонус. Торговая система, которая принесла ее создателю миллиард долларов)

Категория: Блог Опубликовано 24.05.2017
Публикация восьмая. Бонус
Торговая система, которая принесла ее создателю миллиард долларов
 
Уже давно, в прошлом веке, жил величайший биржевой спекулянт , человек легенда , неповторимый финансовый гений.
Личное этого человека состояние в переводе на современные деньги составляло приблизительно миллиард долларов. Ему принадлежали яхты, лимузины, множество особняков по всему миру.

Этого человека звали Джерси Ливермор, и его торговая стратегия опубликована в открытых источниках.
Может показаться немного странным , но он сам описал ее в книге - "Как торговать акциями".

Я не знаю, будет ли торговая стратегия описанная Ливермором столь же эффективна сегодня , рынки изменились с тех пор, но, думаю, что будет интересно запрограммировать и проверить основные показатели этой стратегии!

Так же некоторые идеи от торговли величайшего финансового гуру , но правда в общем виде, можно найти в произведениях – “Воспоминания биржевого спекулянта” - Лефевра и “Жизнь и смерь величайшего биржевого спекулянта” - Ричарда Смиттена


От себя скажу вкратце , что Ливермор, был один из первых активных инверторов, торгующих импульс , использующих для входа стратегию прорыва волатильноти актива.

Но давайте перейдем к непосредственно к системе торговли Ливермора.
За основу я взял его книгу - "Как торговать акциями".
Как не странно, методология его торговли описана достаточно подробно. Обладая математическим мышлением Ливермор строил свою систему торгов на необычной классификации ценовых движений, для акций, ликвидных в его время. 

Классификация ценовых движений по Ливермору выглядит следующим образом

Вторичное Ралли. 
Естественное Ралли. 
Восходящий Тренд. 

Нисходящий Тренд. 
Естественная Реакция. 
Вторичная Реакция.


Цены на активы он фиксировал в специальном блокноте , разделенном на несколько колонок , соответствующим его классификации ценовых движений.

Вот что пишет сам Дж Ливермор о правилах заполнения блокнота с ценами, и правилах покупки акций , основанных на этих записях.

Отрывок из книги Как торговать акциями
«
1. Записывайте цены в колонке Восходящего Тренда чёрным. 
2. Записывайте цены в колонке Нисходящего Тренда красным. 
3. В остальных четырёх колонках записывайте цены карандашом. 
4 (a) Проводите красную черту под последней зарегистрированной ценой в
колонке Восходящего Тренда в первый день, когда Вы начинаете запись чисел в
колонке Естественной Реакции. Вы начинаете делать это на первой реакции
приблизительно в шесть пунктов от последней цены, зарегистрированной в колонке
Восходящего Тренда. 

(b) Проводите красную черту под последней зарегистрированной ценой в
колонке Естественной Реакции, когда Вы начинаете записывать числа в колонке
Естественного Ралли или в колонке Восходящего Тренда. Вы начинаете делать это
на первом ралли приблизительно в шесть пунктов от последней цены, 
зарегистрированной в колонке Естественной Реакции. 
Теперь у Вас есть две Пивотных Точки для наблюдения, и в зависимости от
поведения цен, когда рынок возвратится в область одной из этих точек, Вы
сможете сформировать мнение относительно того, действительно ли
возобновится определённый тренд или движение закончилось. 

(c) Проводите черную черту под последней зарегистрированной ценой в
колонке Нисходящего Тренда в первый день, когда Вы начинаете запись чисел в
колонке Естественного Ралли. Вы начинаете делать это на первом ралли
приблизительно в шесть пунктов от последней цены, зарегистрированной в колонке
Нисходящего Тренда. 

(d) Проводите черную черту под последней зарегистрированной ценой в
колонке Естественного Ралли, когда Вы начинаете записывать числа в колонке
Естественной Реакции или в колонке Нисходящего Тренда. Вы начинаете делать
это на первой реакции приблизительно в шесть пунктов от последней цены
зарегистрированной в колонке Естественного Ралли. 

5 (a) Когда цена в колонке Естественного Ралли достигает трёх и более
пунктов выше последней цены, зарегистрированной в колонке Естественного Ралли
(с черным подчёркиванием), эта цена должна вводиться чёрным в колонке
Восходящего Тренда. 

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

6 (a) Когда после того, как Вы записывали цены в колонке Восходящего
Тренда, происходит реакция приблизительно в шесть пунктов, Вы начинаете запись
цен в колонке Естественной Реакции, и продолжаете так делать, пока акция
продается по цене ниже, чем последняя зарегистрированная цена в колонке
Естественной Реакции. 

(b) Когда после того, как Вы записывали цены в колонке Естественного Ралли, 
происходит реакция приблизительно в шесть пунктов, Вы начинаете запись цен в
колонке Естественной Реакции, и продолжаете так делать, пока акция продается по
цене ниже, чем последняя зарегистрированная цена в колонке Естественной
Реакции. В случае если показана цена ниже, чем последняя зарегистрированная
цена в колонке Нисходящего Тренда, Вы сделали бы запись этой цены в колонке

Нисходящего Тренда. 
(c) Когда после того, как Вы записывали цены в колонке Нисходящего Тренда, 
происходит реакция приблизительно в шесть пунктов, Вы начинаете запись цен в
колонке Естественной Реакции, и продолжаете так делать, пока акция продается по
цене выше, чем последняя зарегистрированная цена в колонке Естественной
Реакции. 

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

(e) Когда Вы записываете числа в колонке Естественной Реакции, и показана
цена ниже, чем последнее записанное число в колонке Нисходящего Тренда, то
цена должна быть записана красным в убыточность в колонке Нисходящего Тренда. 

(f) То же самое правило применяется, когда Вы записываете числа в колонке
Естественного Ралли, и достигнута цена, которая выше чем последняя цена, 
зарегистрированная в колонке Восходящего Тренда — Вы прекращаете
записывать в колонке Естественного Ралли и записываете эту цену чёрным в
колонке Восходящего Тренда. 

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

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

7. Те же самые правила применяются для Ключевой Цены— за исключением
того, что Вы используете в качестве основания двенадцать пунктов вместо шести, 
используемых в отдельных акциях. 

8. Последняя цена, зарегистрированная в колонках Нисходящего или
Восходящего Тренда, становится Пивотной Точкой, как только Вы начинаете
записывать цены в колонках Естественного Ралли или Естественной Реакции. 

После окончания ралли или реакции, Вы снова начинаете вводить числа в
противоположной колонке, и тогда экстремум, сделанный в предыдущей колонке, 
становится другой Пивотной Точкой. 

После того, как были достигнуты две Пивотных Точки, эти отчеты окажут Вам
большую помощь в верном прогнозировании следующего важного движения. Эти
Пивотные Точки привлекут Ваше внимание двойным красным или черным
подчёркиванием. Это подчёркивание служит специальной цели держать эти точки
во внимании, и всякий раз, когда показаны и зарегистрированы цены рядом или на
уровне одной из этих точек, они должны наблюдаться очень тщательно. Ваше
решение о входе в рынок будет зависеть от поведения цен с момента регистрации. 

9 (a) Когда Вы видите черное подчёркивание ниже последнего подчёркнутого
красным зарегистрированного числа в колонке Нисходящего Тренда— Вам, 
возможно, дан сигнал купить около этой точки. 

(b) Когда есть черное подчёркивание ниже цены, зарегистрированной в
колонке Естественного Ралли, и если акция в ее следующем ралли достигает цены
около этой Пивотной Точки– сейчас время, когда Вы собираетесь узнавать, 
достаточно ли силен рынок, чтобы определенно изменить его курс в колонку
Восходящего Тренда. 

(c) Обратное истинно, когда Вы видите красное подчёркивание под последней
ценой, зарегистрированной в колонке Восходящего Тренда, и эта цена ниже
последней цены, зарегистрированной в колонке Естественной Реакции. 

10 (a) Весь этот метод разработан, чтобы позволить ясно видеть, действует ли
акция должным образом, после того, как произошло её первое Естественное Ралли
или Реакция. Если движение собирается возобновиться в достаточной манере— 
вверх или вниз— оно пройдёт за свою предыдущую Пивотную Точку в отдельной
акции на три пункта, или на шесть в Ключевой Цене. 

(b) Если акция не в состоянии сделать этого— и в реакции продается на три
пункта и более ниже последней Пивотной Точки(зарегистрированной в колонке
Восходящего Тренда с красным подчёркиванием), это указывает, что Восходящий
Тренд этой акции закончен. 

(c) Применяя это правило к Нисходящему Тренду, всякий раз, когда
закончилось Естественное Ралли, и в колонке Нисходящего Тренда регистрируются
новые цены, эти новые цены должны пройти три или более пунктов ниже последней
Пивотной Точки(с черным подчёркиванием) для положительного возобновления
Нисходящего Тренда. 

(d) Если акция не в состоянии сделать этого— и на ралли продается на три
пункта и более выше последней Пивотной Точки(зарегистрированной в колонке
Нисходящего Тренда с черным подчёркиванием), это указывает, что Нисходящий
Тренд этой акции закончен. 

(e) Записывая в колонке Естественного Ралли, если ралли заканчивается
немного ниже последней Пивотной Точки в колонке Восходящего Тренда(с
красным подчёркиванием), и акция показывает реакцию на три или больше пунктов
от этой цены, это- сигнал опасности, который указывает, что Восходящий Тренд в
этой акции закончен. 

(f) Записывая в колонке Естественной Реакции, если реакция заканчивается
немного выше последней Пивотной Точки в колонке Нисходящего Тренда(с чёрным
подчёркиванием), и акция показывает ралли на три или больше пунктов от этой
цены, это- сигнал опасности, который указывает, что Нисходящий Тренд в этой
акции закончен.»

Управление капиталом
О методологии управления капиталом ,которую использовал величайший спекулянт, написано много , но все эти сведения не достаточно подробны и точны, в них нет четких закономерностей и цифр
Сам Ливермор пишет о построении пирамиды позиций, о покупке актива постепенно , то есть с возрастанием курса, увеличивается и сумма вложений.

Но вот когда наращивать позицию, и какой размер риска сначала и по мере увеличения позиции, данных нет. В то время , когда работал Ливермур , инвестором разрешалось использование мощного рычага заемных средств, по моим данным размер рычага мог достигать 1000%. Об использовании такого левереджа, Ливермор косвенно упоминает в начале своей книги.

Полагаю также, что Ливермор наращивал позиции при возобновлении тенденции после естественной реакции цены актива, о чем есть несколько упоминаний в его книге, и в книге Лефевра

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

Оставим стратегию управления капиталом неизменной … то есть, оставим нашу стратегию реинвестирования прибыли.


Итак, создадим временную таблицу JLNOTE, реализующую блокнот Ливермора.
-- Create table
create global temporary table jlnote
(
  ticker     VARCHAR2(5),
  price      NUMBER,
  operdate   DATE,
  pricetype  VARCHAR2(25) -- secondaryrally -- naturalrally -- uptrend  -- downtrend  -- naturalreaction  -- secondaryreaction
 ) on commit preserve rows;
 
 create unique index jlnote_IDX on jlnote (TICKER, operdate); 

Для заполнения данной таблицы нам понадобится функция OHLCV и специальный скрипт. 

Код функции 
create or replace function stock.getclassprice(priceticker varchar2,
                                               price       number,
                                               opdate      date)
  return varchar2 is
--функция определяет к какому классу относится ценовое движение
  vr_count             number;
  vr_oldprice          number;
  vr_oldclassprice     varchar2(25) := '';
  vr_classprice        varchar2(25) := '';
  vr_oldklassprice     varchar(25);
  vr_secondaryrally    number := 0;
  vr_naturalrally      number := 0;
  vr_uptrend           number := 0;
  vr_downtrend         number := 0;
  vr_naturalreaction   number := 0;
  vr_secondaryreaction number := 0;
  vr_delta             number := 0;
  vr_punkt             number := 0;
begin
  select count(1)
    into vr_count
    from jlnote
   where jlnote.ticker = priceticker
     and jlnote.operdate < opdate
     and rownum < 2;
  -- находим предыдущую дату от dateoper в представлении , кроме нулевой колонки

  if vr_count = 0 then
    vr_classprice := 'uptrend';
    return vr_classprice;
  end if;
  -- проверяем в какой колонке была цена
  select jlnote.pricetype, jlnote.price
    into vr_oldclassprice, vr_oldprice
    from jlnote
   where jlnote.ticker = priceticker
     and jlnote.operdate =
         (select max(jlnote.operdate)
            from jlnote
           where jlnote.ticker = priceticker
             and jlnote.operdate < opdate);
  -- проверяем насколько ушла цена от последнего значений и куда мы должны ее занести по правилам
  vr_delta := price - vr_oldprice;
  vr_punkt := price / 400;
  -- если не подходит ни в одну колонку 
  if vr_oldclassprice = 'uptrend' then
    if price < vr_oldprice - vr_punkt * 6 then
      vr_classprice := 'naturalreaction';
    end if;
    if price > vr_oldprice + vr_punkt * 6 then
      vr_classprice := 'uptrend';
    end if; -- тренд продолжен
  end if;

  if vr_oldclassprice = 'naturalreaction' then
    null;
    if price < vr_oldprice - vr_punkt * 6 then
      vr_classprice := 'naturalreaction';
    end if;
    if price > vr_oldprice + vr_punkt * 6 then
      vr_classprice := 'secondaryrally';
    end if;
    -- если больше последнего uptrend тогда тоже самое
    select jlnote.price
      into vr_uptrend
      from jlnote
     where jlnote.ticker = priceticker
       and jlnote.pricetype = 'uptrend'
       and jlnote.operdate =
           (select max(j.operdate)
              from jlnote j
             where j.ticker = priceticker
               and j.operdate < opdate
               and j.pricetype = 'uptrend');
    if price > vr_uptrend + vr_punkt * 6 then
      vr_classprice := 'uptrend';
    end if;
  end if;

  if vr_oldclassprice = 'secondaryrally' then
    -- посмтрим на последнюю запись uptrend
    -- если больше, то тренд вознобноляется
    if price > vr_oldprice + vr_punkt * 6 then
      vr_classprice := 'secondaryrally';
    end if;
    select jlnote.price
      into vr_uptrend
      from jlnote
     where jlnote.ticker = priceticker
       and jlnote.pricetype = 'uptrend'
       and jlnote.operdate =
           (select max(j.operdate)
              from jlnote j
             where j.ticker = priceticker
               and j.operdate < opdate
               and j.pricetype = 'uptrend');
    if price > vr_uptrend + vr_punkt * 6 then
      vr_classprice := 'uptrend';
    end if;
    select jlnote.price
      into vr_naturalreaction
      from jlnote
     where jlnote.ticker = priceticker
       and jlnote.pricetype = 'naturalreaction'
       and jlnote.operdate =
           (select max(j.operdate)
              from jlnote j
             where j.ticker = priceticker
               and j.operdate < opdate
               and j.pricetype = 'naturalreaction');
    if price < vr_naturalreaction - vr_punkt * 6 then
      vr_classprice := 'downtrend';
    end if;
  end if;

  -- downtrend  -- naturalreaction  -- secondaryreaction  
  if vr_oldclassprice = 'downtrend' then
    null;
    if price > vr_oldprice + vr_punkt * 6 then
      vr_classprice := 'naturalrally';
    end if;
    if price < vr_oldprice - vr_punkt * 6 then
      vr_classprice := 'downtrend';
    end if;
  end if;

  if vr_oldclassprice = 'naturalrally' then
    if price > vr_oldprice + vr_punkt * 6 then
      vr_classprice := 'naturalrally';
    end if;
    if price < vr_oldprice - vr_punkt * 6 then
      vr_classprice := 'secondaryreaction';
    end if;
  
    select jlnote.price
      into vr_downtrend
      from jlnote
     where jlnote.ticker = priceticker
       and jlnote.pricetype = 'downtrend'
       and jlnote.operdate =
           (select max(j.operdate)
              from jlnote j
             where j.ticker = priceticker
               and j.operdate < opdate
               and j.pricetype = 'downtrend');
    if price < vr_downtrend - vr_punkt * 6 then
      vr_classprice := 'downtrend';
    end if;
    select jlnote.price
      into vr_naturalrally
      from jlnote
     where jlnote.ticker = priceticker
       and jlnote.pricetype = 'naturalrally'
       and jlnote.operdate =
           (select max(j.operdate)
              from jlnote j
             where j.ticker = priceticker
               and j.operdate < opdate
               and j.pricetype = 'naturalrally');
    if price > vr_naturalrally + vr_punkt * 6 then
      vr_classprice := 'uptrend';
    end if;
  end if;

  if vr_oldclassprice = 'secondaryreaction' then
    if price < vr_oldprice + vr_punkt * 6 then
      vr_classprice := 'secondaryreaction';
    end if;
    select jlnote.price
      into vr_downtrend
      from jlnote
     where jlnote.ticker = priceticker
       and jlnote.pricetype = 'downtrend'
       and jlnote.operdate =
           (select max(j.operdate)
              from jlnote j
             where j.ticker = priceticker
               and j.operdate < opdate
               and j.pricetype = 'downtrend');
    if price < vr_downtrend - vr_punkt * 6 then
      vr_classprice := 'downtrend';
    end if;
  
    select jlnote.price
      into vr_naturalrally
      from jlnote
     where jlnote.ticker = priceticker
       and jlnote.pricetype = 'naturalrally'
       and jlnote.operdate =
           (select max(j.operdate)
              from jlnote j
             where j.ticker = priceticker
               and j.operdate < opdate
               and j.pricetype = 'naturalrally');
    if price > vr_naturalrally + vr_punkt * 6 then
      vr_classprice := 'uptrend';
    end if;
  end if;
  return vr_classprice;
exception
  when others then
    dbms_output.put_line(sqlerrm);
    dbms_output.put_line(opdate);
    raise;
    return null;
end getclassprice;

Скрипт заполнения
-- Created on 21.10.2014 by 1 
declare 
  -- Local variables here
  i integer;
  classprice varchar2(50);
  dt_start date := to_date('01.05.2009','DD.MM.YYYY') ; 
  dt_end date := to_date('01.05.2014','DD.MM.YYYY');
begin
  -- Test statements here
  delete jlnote;
  commit;
  for i in (select * from ohlcv where ohlcv.ticker = 'SBER' and ohlcv.dateprice between dt_start and dt_end)
    loop
      classprice := getclassprice(i.ticker,i.c,i.dateprice);
      if classprice is not null then 
        insert into jlnote(ticker,price,operdate,pricetype) values (i.ticker,i.c,i.dateprice,classprice);
        commit;
      end if;
    end loop;   
end;


А вот как выглядит современный алгоритмизированный блокнот Ливермора в 21 веке.
select operdate
, ticker
, decode(pricetype,'uptrend',price,null) uptrend 
, decode(pricetype,'naturalreaction',price,null) naturalreaction 
, decode(pricetype,'secondaryrally',price,null) secondaryrally 
, null I
, decode(pricetype,'downtrend',price,null) downtrend 
, decode(pricetype,'naturalrally',price,null) naturalrally
, decode(pricetype,'secondaryreaction',price,null) secondaryreaction
from jlnote order by jlnote.operdate


OPERDATE TICKER UPTREND NATURALREACTION SECONDARYRALLY DOWNTREND NATURALRALLY SECONDARYREACTION
04.05.2009 SBER 29,28
07.05.2009 SBER 31,15
08.05.2009 SBER 32,27
12.05.2009 SBER 33,65
13.05.2009 SBER 32,2
14.05.2009 SBER 31,69
15.05.2009 SBER 32,98
18.05.2009 SBER 34,15
19.05.2009 SBER 36
20.05.2009 SBER 40,1
21.05.2009 SBER 37,45
22.05.2009 SBER 39,01
27.05.2009 SBER 40,8
28.05.2009 SBER 41,54

Перепишем правила открытия и закрытия позиций, проведем тест на истории.

create or replace function stock.openrules(priceticker varchar2, operdate date) return number
-- правила открытия позиции
    is
    vr_return number;
    vr_count number;
    vr_opdate date;
    vr_classprice varchar2(25);
begin
   vr_return := 0; vr_opdate := operdate;
     -- проверка только в том случае если есть открытые трейды
     select /* +first_rows(1)*/ count(1) into vr_count from trades 
      where trades.ticker = priceticker and trades.closedate is null and rownum<2;
   if vr_count=0 then 
     select max(jlnote.pricetype) into vr_classprice from jlnote 
     where jlnote.ticker = priceticker and jlnote.operdate = vr_opdate;   
     if  vr_classprice='uptrend' then vr_return := 1; end if; 
   end if;
   return vr_return;
end openrules;  


create or replace function stock.closerules(priceticker varchar2, operdate date) return number
-- правила закрытия позиции
    is
    vr_return number;
    vr_opdate date;
    vr_classprice varchar2(25);
begin
   vr_return := 0; vr_opdate := operdate;
   for i in (select * from trades where trades.ticker = priceticker and trades.closedate is null)
   loop
     -- проверка только в том случае если есть открытые трейды
     select max(jlnote.pricetype) into vr_classprice from jlnote 
      where jlnote.ticker = priceticker and jlnote.operdate = vr_opdate;   
     if  vr_classprice='downtrend' then vr_return := 1; end if; 
   end loop;
   return vr_return;
end closerules;


create or replace function stock.moneyposition(priceticker varchar2, operdate date) return number
-- правил управления капиталом , возвращает позицию в количестве акций которые можно купить
    is
    vr_return number;
    rw priceind%rowtype;
    vr_balance number;
begin
    vr_return := 0;
    -- открываем позицию только в случае , если не позиции по данному инструменту
    rw := tradesystem_pkg.indnow;
    select nvl(sum(balance.balancedeltarur),0) into vr_balance from balance;
    vr_balance := vr_balance + tradesystem_pkg.moneybalance;
    vr_return := trunc(vr_balance  / 1 / rw.c);
    return vr_return;
end moneyposition;


тест на истории
-- Created on 21.10.2014 by 1 
declare 
  -- Local variables here
  i integer;
  classprice varchar2(50);
  start_date date := to_date('01.05.2009','DD.MM.YYYY') ; 
  end_date date := to_date('01.05.2014','DD.MM.YYYY');
  priceticker varchar2(10) := 'SBER';
begin
  -- Test statements here
  delete jlnote;
  commit;
  for i in (select * from ohlcv where ohlcv.ticker = priceticker and ohlcv.dateprice between start_date and end_date)
    loop
      classprice := getclassprice(i.ticker,i.c,i.dateprice);
      if classprice is not null then 
        insert into jlnote(ticker,price,operdate,pricetype) values (i.ticker,i.c,i.dateprice,classprice);
        commit;
      end if;
    end loop;
  tradesystem_pkg.cleartable;
  tradesystem_pkg.checkhistory(priceticker, start_date,  end_date);
  
  dbms_output.put_line('------------------------------------------------------------');
  dbms_output.put_line('Тестирование на исторических данных. Инструмент: '||priceticker);
  dbms_output.put_line('  начало периода    ' ||to_char(start_date,'DD.MM.YYYY'));
  dbms_output.put_line('  окончание периода ' ||to_char(end_date,'DD.MM.YYYY'));
  dbms_output.put_line('-------------------------------------------------------------');
  dbms_output.put_line(' ');
  dbms_output.put_line('  Баланс(RUR)                          ' || tradesystem_pkg.moneybalance);
  dbms_output.put_line('  Общая прибыль (RUR)                  ' || report_pkg.getsumwin());
  dbms_output.put_line('  Средняя прибыль на сделку (RUR)      ' || report_pkg.getavgwintrade());
  dbms_output.put_line('  Средний убыток (RUR)                 ' || report_pkg.getavglosstrade());
  dbms_output.put_line('  Общее количество сделок              ' || report_pkg.gettradescount());
  dbms_output.put_line('  Общее прибыльных сделок              ' || report_pkg.gettradeswincount());
  dbms_output.put_line('  Общее количество убыточных сделок    ' || report_pkg.getlosscount());
  dbms_output.put_line('  Количество убыточных сделок подряд   ' || report_pkg.gettradeslosscount());
  dbms_output.put_line(' '); 
  dbms_output.put_line('-------------------------------------------------------------');
      
end;

------------------------------------------------------------
Тестирование на исторических данных. Инструмент: SBER
начало периода 01.05.2009
окончание периода 01.05.2014
-------------------------------------------------------------

Баланс(RUR) 1000000
Общая прибыль (RUR) 1836857,45
Средняя прибыль на сделку (RUR) 218450,68
Средний убыток (RUR) -187680,419
Общее количество сделок 27
Общее прибыльных сделок 17
Общее количество убыточных сделок 10
Количество убыточных сделок подряд 2

-------------------------------------------------------------
Как видим результат за пять лет всего 183 процента , то есть 37% в год

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

Но не стоит расстраиваться, гораздо интереснее поискать способ, как адаптировать систему Ливермора к современным рыночным условиям.
 
Просмотров: 137