Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Генератор свечек форекса  [new]
Lumix
Member

Откуда: Екатеринбург
Сообщений: 1261
Взяли заказ на написание эмулятора форекса. Написали генератор свечек, но что-то по внешнему виду как-то неестественно выглядят. Подскажите, может, кто сталкивался, как сгенерировать поток цен, более-менее похожий на реальный форекс.

Суть задачи такая.
Форекс - это торговля валютой. Каждую секунду заключаются сотни и тысячи сделок.
Например, пусть за 1 секунду было совершено 15 сделок по ценам:
105, 106, 104, 103, 108, 109, 112, 106, 105, 103, 100, 102, 107, 109, 108

В этом случае:
цена открытия свечи = 105
цена закрытия свечи = 108
самая высокая цена за прошедшую секунду = 112
самая низкая цена за прошедшую секунду = 100

Сама свеча будет белая (растущая), потому что цена закрытия выше, чем цена открытия.

Вот и получается, что пишем генератор, который генерит последовательность из 4-х цифр: открытие, закрытие, хай и лоу. А будучи составлены вместе получается типичный график форекса.

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

Может есть идеи, как построить алгоритм, чтобы итоговая картинка получалась более-менее похожей на реальный форекс? Разумеется, это задача не на отрисовку свечей, не на работу с графикой, а на генерацию комплектов чисел.
14 ноя 17, 13:30    [20952449]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
Alexander A. Sak
Member

Откуда: Омск
Сообщений: 894
Наверное, заказчик хочет разглядеть там тренды, волны Эллиота и прочие магические артефакты из мира технического анализа. Возьмите цены за последние несколько лет и гоняйте их со случайного места.
14 ноя 17, 14:01    [20952608]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
Areostar
Member

Откуда:
Сообщений: 2819
фид цен поищите в сети!
14 ноя 17, 14:03    [20952618]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
x1ca4064
Member

Откуда:
Сообщений: 837
Lumix
Может есть идеи, как построить алгоритм, чтобы итоговая картинка получалась более-менее похожей на реальный форекс? Разумеется, это задача не на отрисовку свечей, не на работу с графикой, а на генерацию комплектов чисел.


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

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

А сейчас как генератор сделан?
Цена закрытия и отрытия должны совпадать?
14 ноя 17, 14:17    [20952706]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
S.G.
Member

Откуда: cartoon network
Сообщений: 27454
Lumix
Вот и получается, что пишем генератор, который генерит последовательность из 4-х цифр: открытие, закрытие, хай и лоу. А будучи составлены вместе получается типичный график форекса.

Фигово то, что получившийся генератор генерит какой-то противоестественный график.
Генератор генерирует случайные числа?
Тогда вам надо разобраться, какому распределению вероятностей принадлежат реальные потоки цен.
Берете нечто реальное и строите график распределения вероятностей.
14 ноя 17, 18:26    [20953839]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
Lumix
Member

Откуда: Екатеринбург
Сообщений: 1261
Alexander A. Sak
Наверное, заказчик хочет разглядеть там тренды, волны Эллиота и прочие магические артефакты из мира технического анализа. Возьмите цены за последние несколько лет и гоняйте их со случайного места.


Заказчик за такое денег не даст.
Скажет, что мы смухлевали.
Он заказывал генератор, а мы ему исторические данные подсовываем.
Нехорошо так делать. Неэтично.

S.G.
Тогда вам надо разобраться, какому распределению вероятностей принадлежат реальные потоки цен.


Совет, конечно, хороший. :-)
Но в нашей команде такую задачу осилить некому. Это надо в математике шибко шарить.

x1ca4064
Я не разбираюсь в форекс.


У нас тоже никто не разбирается.
Мы взяли задачу как программисты.
Я думал, что можно просто рандомом генерить цифры.
Оказалось, что заказчику это почему-то не подходит.

x1ca4064
По хорошему, нужно придумать правильный критерий "похожести" сгенерированных данных на реальные, а можно попробовать нейросети (генератор и дискриминатор).


Проще отказаться от заказа.
Мы программисты, а не финансовые аналитики, не статистики и не математики.

x1ca4064
А сейчас как генератор сделан?


Просто рандомом числа генерятся.

open = open ? rand(100, 200) : close;
close = rand(100, 200);
high = rand (max(open, close), max(200, open, close));
low = rand (min(open, close), min(100, open, close));
14 ноя 17, 19:35    [20954063]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
деятель
Member

Откуда: Сургут
Сообщений: 91
генерите случайный гауссовый шум от -1 до 1 суммируете нарастающим итогом потом режете на кусочки по 100 приращений и на каждом считаете первое-макс-мин-последнее
14 ноя 17, 19:54    [20954103]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
Alexander A. Sak
Member

Откуда: Омск
Сообщений: 894
Lumix
Проще отказаться от заказа.
Мы программисты, а не финансовые аналитики, не статистики и не математики.


Отказывайтесь пока не поздно.
С таким критерием -- "что-то оно неестественно выглядит" -- можно мозги клевать вечно и программистам и математикам.
14 ноя 17, 20:02    [20954124]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
Lumix
Member

Откуда: Екатеринбург
Сообщений: 1261
деятель
генерите случайный гауссовый шум от -1 до 1 суммируете нарастающим итогом потом режете на кусочки по 100 приращений и на каждом считаете первое-макс-мин-последнее


Блин, вот бы ваш совет еще на русский перевести, вообще было бы замечательно...
Если серьзено.
Я не понял, какие конкретно программные операции выполнять, чтобы выполнить ваш совет.

 total = 0;
for (0 ... 100)
{
    gausShum = rand(-1, 1); // тут будет например 0.07
    total += gausShum;
}
total /= 100;
...???


В общем, не смог осилить перевод вашего совета на практику.
14 ноя 17, 20:09    [20954137]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 2312
Lumix,

может наведёт на мысль, очень хорошая функция:
https://geektimes.ru/post/294963/

гауса можно нагенерить по простому если "Преобразование Бокса — Мюллера"
function NormalDev(const AEngine: IHepRandomEngine):RandFloat;
var v1,v2,r:RandFloat;
begin
  //Преобразование Бокса — Мюллера
  repeat
     v1:= 2.0 * AEngine.flat() - 1.0;
     v2:= 2.0 * AEngine.flat() - 1.0;
     r:=sqr(v1)+sqr(v2);
  until r<=1;
  {$IFDEF OriginalGauss}
  Result:=v1*sqrt(-2*ln(r)/r);
  {$ELSE}
  Result:=(v1+v2)*sqrt(-ln(r)/r);
  {$ENDIF}
end;

AEngine.flat() здесь можно взять как (1-random())

PS: генерить случайные числа случайно - нельзя
14 ноя 17, 23:38    [20954540]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
Lumix
Member

Откуда: Екатеринбург
Сообщений: 1261
kealon(Ruslan),

статью посмотрел. Для меня сложновато-то :-(

Под ваш алгоритм нашел готовую функцию на хабре
Но это лишь генератор случайных чисел.
Как его превратить в свечные комплекты [open, high, low, close] я ума не приложу

Может я что-то не так понимаю, но по-моему это просто очередной навороченный rand() ...
Зачем его самому разрабатывать, если он и так из коробки идет? Math.random();

function Gauss() 
{
    var ready = false;
    var second = 0.0;

    this.next = function(mean, dev) 
    {
        mean = mean == undefined ? 0.0 : mean;
        dev = dev == undefined ? 1.0 : dev;
		
        if (this.ready) { this.ready = false; return this.second * dev + mean; }
        else 
        {
           var u, v, s;
           do 
           {
               u = 2.0 * Math.random() - 1.0;
               v = 2.0 * Math.random() - 1.0;
               s = u * u + v * v;

           } while (s > 1.0 || s == 0.0);
			
           var r = Math.sqrt(-2.0 * Math.log(s) / s);
           this.second = r * u;
           this.ready = true;
           return r * v * dev + mean;
       }
   };
}

g = new Gauss();
g.next(); 
g.next();
g.next();


PS. Для тех, кто не умеет пользоваться яваскриптом, то сообщаю, что достаточно в браузере нажать F12, откроется командная строка, туда просто достаточно скопипастить этот кусок и функция g.next() будет работать генеря новые рандомные значения.
15 ноя 17, 00:16    [20954592]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
Arm79
Member

Откуда: МО, Раменское
Сообщений: 3355
Lumix
S.G.
Тогда вам надо разобраться, какому распределению вероятностей принадлежат реальные потоки цен.

Смешно. Если бы цены имели четкое математическое обоснование, не были бы нужны всяческие программы теханализа

1.Возьмите минимум и максимум в качестве верхней и нижней границы коридора цен, затем интервал времени
(например, день)
2.В заданном с заданным шагом (например каждый час в день) сгенеририруйте случайным распределением точки
3.По полученным точкам сделайте квадратичную или бикубическую интерполяцию
4.Далее по полученной функции в качестве аргументов подаете шаги свечи, получая значение
5. Опять таки, случайным распределением получаете минимум и максимум свечи относительно полученного значения
6. Нормальным распределением получаете цены открытия и закрытия. То есть в основном они где то рядом, но иногда обрыв высокий. Естественно, эти цены не могут превышать минимум и максимум
15 ноя 17, 00:49    [20954618]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
azsx
Member

Откуда:
Сообщений: 517
Суть форекса можно выразить житейским наблюдением. "Сложно найти чёрную кошку в тёмной комнате. Особенно, когда кошки в комнате нет."
Большая часть "проигрывающих" трейдеров на форексе хотят увидеть алгоритм. Сложный, запутанный, но математически верный алгоритм. А его нет, есть random.
Как бы Вашу задачу реализовал я.
Два random курса: A. небольшие колебания в секунде, полный random; B. большие колебания раз в несколько дней, random с условиями.
Два параметра новостей, 0 (плохая новость) и 1 (хорошая новость): C. ожидают новости; D. реальная новость. Логично, что если C == 1, то B скорее статистически играет на плюс и наоборот. Но это не 100% гарантия, скорее, настраиваемая вероятность.
Две операции: E. (трейдеры продают); F. (трейдеры покупают). Логично, чем больше новостей, тем операций проводится больше. При этом при высоком курсе, некоторая часть трейдеров в основном продаёт, а при низком, в основном покупает. Чем больше продают -- тем больше вероятность положительной динамики курса в B и A и наоборот.
Теперь следите за руками.
Абсолютно не важно какие и сколько параметров вы придумаете, лишь бы в них какая то логика была. Важно, чтобы Ваш покупатель увидел эти параметры, мог поиграть с ними в настройках в реальном времени.
15 ноя 17, 05:20    [20954668]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
azsx
Member

Откуда:
Сообщений: 517
автор
Чем больше продают -- тем больше вероятность положительной динамики курса в B и A и наоборот.

Чем больше покупают -- тем больше вероятность положительной динамики курса в B и A и наоборот. Ошибся.
15 ноя 17, 05:23    [20954669]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 2312
Lumix
kealon(Ruslan),

статью посмотрел. Для меня сложновато-то :-(

Под ваш алгоритм нашел готовую функцию на хабре
Но это лишь генератор случайных чисел.
Как его превратить в свечные комплекты [open, high, low, close] я ума не приложу

Может я что-то не так понимаю, но по-моему это просто очередной навороченный rand() ...
Зачем его самому разрабатывать, если он и так из коробки идет? Math.random();
уже всё изобретено до нас
случайный числа никак не случайные
генератор случайного числа имеет свои характеристики, это: диапазон (a,b) и функция плотности вероятности

у Math.random() : диапазон [0,1), функция распределения f(x) = 1
у нормального распределения


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


PS: кроме того, учтите, что Math.random() никак не бесконечный и через какое-о время числа начнут повторяться, если такое случится, то придётся искать другие алгоритмы (например в HEP есть)
PS2: "Преобразование Бокса — Мюллера" очень плохое, так как "жрёт" очень много случайных чисел, в современных либах используется интегральный метод вычисления гаусова распределения.
15 ноя 17, 09:18    [20954786]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
mayton
Member

Откуда: loopback
Сообщений: 35682
Lumix,

Попробуйте суперпозицию нескольких функций. Некоторые из которых
Не случайные. Например колебательные процессы с сутошным и сезонным
Периодом.
15 ноя 17, 10:49    [20955078]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 2312
mayton
Lumix,

Попробуйте суперпозицию нескольких функций. Некоторые из которых
Не случайные. Например колебательные процессы с сутошным и сезонным
Периодом.
в пике это как раз и есть "монстр" из статьи https://geektimes.ru/post/294963/
15 ноя 17, 10:53    [20955100]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
mayton
Member

Откуда: loopback
Сообщений: 35682
kealon(Ruslan)
mayton
Lumix,

Попробуйте суперпозицию нескольких функций. Некоторые из которых
Не случайные. Например колебательные процессы с сутошным и сезонным
Периодом.
в пике это как раз и есть "монстр" из статьи https://geektimes.ru/post/294963/

Спасибо. Очень хорошая статья.

Но нам это не грозит. Я предлагаю суперпозицию конечного числа шумящих по Гауссу и непрерывных гармонических
Функций для того чтобы автор реализовал свою задачу дёшево и сердито.

Разрыв производной в точке ( даже если бы он был) не нарушает условий генерации свечек.
Нигде нет сведений о том чтобы они должны быть дифференцируемых в точке. Да и сами
Оригинальные данные дискретных по своей природе.
15 ноя 17, 12:45    [20955634]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
kealon(Ruslan)
Member

Откуда: Нижневартовск
Сообщений: 2312
mayton,

видимо не так выразился, эта функция связана с фракталами - её поведение очень похоже на реальные объекты, её можно "оцифровать" в любом интервале и с любой точностью, она не превратится в "гладкую" функцию и эти данные брать для изготовления свечек

т.е. нужно две такие функции: цена, объём
15 ноя 17, 13:22    [20955801]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
mayton
Member

Откуда: loopback
Сообщений: 35682
Я тоже думал о фракталах. Но по сути автору надо взять образец реальных данных
и создать случайный процесс с похожими характеристиками. По начальные/центральные
моменты и прочее. По сути повторить. А фрактал это или колебательный процесс - не суть важно.
15 ноя 17, 19:56    [20957805]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
деятель
Member

Откуда: Сургут
Сообщений: 91
В общем, не смог осилить перевод вашего совета на практику.

а дальше надо порезать этот ряд на кусочки по Х отсчетов и на каждом посчитать первео-макс-мин-последнее - это и будут свечи
15 ноя 17, 20:18    [20957852]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
деятель
Member

Откуда: Сургут
Сообщений: 91
пс - вот примеры кода даже есть https://stackoverflow.com/questions/8597731/are-there-known-techniques-to-generate-realistic-looking-fake-stock-data

но с такой подготовой конечно лучше отказаться от заказа
15 ноя 17, 20:21    [20957858]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
Lumix
Member

Откуда: Екатеринбург
Сообщений: 1261
В итоге сегодня сдали решение заказчику.
Рассказываю, как была решена задача.

1) Взяли реальные свечки М30 по евро-доллару, фунто-доллару и долларо-йене за 5 лет.
2) Распилили на куски по 16 свечек.
3) Каждый кусок перевели с коэффициенты

base = min(low1, low2, ...., low16);
[openPrice, highPrice, lowPrice, closePrice] / base = [openRate, highRate, lowRate, closeRate];


Как строится каждый график

1) перед каждым построением полученный массив шаффлится и рандомом выбираются кусочки для финала

listCur = shuffle(listBase);
for (i = 0 ... n) list[i] = listCur[rand(0, count(listCur))];


2) строим корректор волатильности скользящей средней с шагом 21 по случайным наборам -50, 100

listVltItem[] = rand(-50, 100) / 100;
foreach (listVltItem : i) listVlt[i] = ma21(listVltItem, i);


3) сшиваем кусочки в общую ленту свечек, корректируя на волатильность

list(listCandle[], closePrev) = buildCandle
(
    priceBase() /** например, 112.0 для йены */
    ,  listCur[i][j] /** [openRate, highRate, lowRate, closeRate] */
    , listVlt[i] /** например, 0.47 */
    , closePrev /** например, 112.697, чтобы обеспечить open = closePrev */
);


Написал заказчику в письме, что это максимум, чем мы можем ему помочь. Если ему не нравится, пусть ищет других исполнителей. Заказчик работу принял. Сказал, что для его целей этого 100% хватит.

PROFIT!!

PS. Thank you всем, кто оказал посильную помощь советами. Благодаря вашей помощи я понял, что искать математическое решение этой задачи - это прострел ноги самим себе, поэтому лучше решить эту задачу стандартными быдлокодерскими методами, что и было сделано. И заказчик доволен и мы денег заработали на ровном месте. Одним словом, гуд, very good!
15 ноя 17, 20:39    [20957888]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
S.G.
Member

Откуда: cartoon network
Сообщений: 27454
Arm79
Lumix
пропущено...

Смешно. Если бы цены имели четкое математическое обоснование, не были бы нужны всяческие программы теханализа
Очень смешно.
Знание конкретного закона распределения вероятностей для данного случайного процесса, никак не дает возможности определить следующее значение реального процесса.
Простой пример: спорт-лото, 6/49. Вероятность выпадания каждого номера известна, распределение вероятности по времени для одного числа - тоже известно.
Как определить следующую комбинацию? Никак.
15 ноя 17, 22:15    [20958099]     Ответить | Цитировать Сообщить модератору
 Re: Генератор свечек форекса  [new]
mayton
Member

Откуда: loopback
Сообщений: 35682
Lumix
1) Взяли реальные свечки М30 по евро-доллару, фунто-доллару и долларо-йене за 5 лет.

1) перед каждым построением полученный массив шаффлится и рандомом выбираются кусочки для финала

Категорически нельзя ничего шаффлить. Вы уничтожаете автокореляцию.
15 ноя 17, 23:11    [20958215]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Программирование Ответить