1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/PriceGenerator

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

PriceGenerator

PriceGenerator — это платформа для генерации цен, похожих на реальные биржевые цены, но вы можете контролировать статистику их распределения. Генерирует последовательность японских свечей с заданными статистическими параметрами, возвращает Pandas DataFrame или сохраняет в виде CSV-файла с OHLCV-свечами в каждой строке. Используйте PriceGenerator для создания синтетических данных для тестирования вашей торговой стратегии.

  • 🇷🇺 Документация и примеры на русском (see documentation in russian here)
  • ⚙️ API-документация PriceGenerator
  • 📚 Release notes
  • 🎁 Поддержите проект пожертвованием на наш кошелёк ЮMoney: 410015019068268

Содержание

  1. Введение
    • Метод генерации цен
  2. Настройка
  3. Примеры использования
    • Командная строка
      • Ссылка
      • Генерация цен с параметрами по умолчанию
      • Генерация цен, получение статистики и построение графика
      • Статистика и график по сохранённым ценам
      • Статистика и график на простом шаблоне
      • Переопределение параметров
      • Разделение данных по некоторым тенденциям
    • Импорт модуля

Введение

Иногда для тестирования автоматических торговых алгоритмов необходимо получить набор данных с биржевыми ценами. Обычно трейдеры и аналитики используют модель цен, такую как OHLCV-свечи (открытие, максимум, минимум, закрытие, объём), так называемые японские свечи. Одна строка таких данных представляет собой набор цен для построения одной японской свечи: дата открытия, цена открытия, максимальная цена, минимальная цена, цена закрытия за данный временной интервал и значение торгового объёма.

PriceGenerator — простая библиотека, которую можно использовать как модуль Python или запускать из командной строки и генерировать случайные данные о ценах, максимально приближенные к «реальным ценам», но с заранее заданными статистическими характеристиками. Вы можете установить ценовой интервал, таймфрейм, максимальные и минимальные значения ценового диапазона, максимальный размер свечей, вероятность направления следующей свечи, вероятность выбросов цен, количество генерируемых свечей и некоторые другие параметры.

Для дальнейшего статистического анализа цен в Python очень часто используется библиотека Pandas. Цены, хранящиеся в виде Pandas DataFrame, могут выглядеть примерно так:

                    datetime   open   high    low  close  volume
95 2021-02-03 11:00:00+03:00  76.82  78.43  76.21  78.13   33652
96 2021-02-03 12:00:00+03:00  78.13  78.37  78.12  78.36    9347
97 2021-02-03 13:00:00+03:00  78.36  78.40  78.05  78.07   27250
98 2021-02-03 14:00:00+03:00  78.07

``` **Библиотека PriceGenerator позволяет:**
* сохранять сгенерированные цены в формате .csv (пример: [./media/test.csv](./media/test.csv));
* сохранять сгенерированные цены в переменную типа Pandas DataFrame для дальнейшего использования в сценариях автоматизации;
* автоматически рассчитывать некоторые статистические и вероятностные характеристики сгенерированных цен и сохранять их в формате Markdown (пример: [./media/index.html.md](./media/index.html.md));
* загружать цены реальных инструментов согласно модели OHLCV-свечей из файла формата .csv и проводить их статистический анализ;
* рисовать график сгенерированных или загруженных реальных цен и сохранять его в формате html (пример: [./media/index.html](./media/index.html));
  * сгенерированные цены, график и некоторые данные о поведении цен можно сохранить как обычное изображение формата png (пример: [./media/index.html.png](./media/index.html.png)):

    ![](./media/index.html.png)

Также на графике можно включить некоторые популярные индикаторы (скользящие средние, полосы Боллинджера, зигзаг и другие).

### Метод генерации цен

Набор свечей заданной длины `horizon` генерируется по следующему (упрощённому) алгоритму:
1. Определяется или случайно генерируется в заданном диапазоне [`minClose`, `maxClose`] цена открытия первой свечи.
2. Случайно, в зависимости от значения вероятности следующей свечи `upCandlesProb` (по умолчанию 50%), определяется направление свечи. Если `random() ≤ upCandlesProb`, то будет сгенерирована восходящая свеча (с `open ≤ close`), иначе — нисходящая (с `open > close`).
3. После определения направления случайным образом генерируется значение `close` свечи, при этом для «тела» свечи должно выполняться условие `|open - close| ≤ maxCandleBody`.
4. Случайно, в зависимости от вероятности аномальных значений цены свечи `maxOutlier` (по умолчанию 3%), генерируются значения `high` и `low` свечи. Если `random() ≤ maxOutlier`, то генерируется свеча с аномальными значениями цены: «хвосты» свечи могут оказаться достаточно большими, чтобы имитировать реальные аномальные значения цены на рынке. Если свеча без аномалий, то «хвосты» генерируются в диапазоне не более половины тела свечи.
5. Значение закрытия сгенерированной свечи становится ценой открытия следующей свечи.
6. Затем шаги 2–5 повторяются до тех пор, пока не будет сгенерирована вся ценовая цепочка заданной длины `horizon`.

Все параметры можно задать после инициализации экземпляра класса `PriceGenerator()`. Результат генерации цен сохраняется в поле `self.prices` в формате Pandas DataFrame и может быть использован для дальнейшего анализа.

## Установка

Проще всего установить через PyPI:
```commandline
pip install pricegenerator

После этого вы можете проверить установку с помощью команды:

pip show pricegenerator

Примеры использования

Командная строка

Справка

Получите справку:

pricegenerator --help

Вывод:

usage: 
/as module/ python PriceGenerator.py [some options] [one command]
/as CLI tool/ pricegenerator [some options] [one command]

PriceGenerator is the platform for generating prices similar to real stock
prices, but you can control the statistics of their distribution. Generates
chain of candlesticks with predefined statistical parameters, return Pandas
DataFrame or saving as .CSV-file with OHLCV-candlestick in every string. Use
PriceGenerator to generate synthetic data to test your trading strategy. See
examples: https://tim55667757.github.io/PriceGenerator

optional arguments:
  -h, --help            show this help message and exit
  --ticker TICKER       Option: some fake ticker name, 'TEST' by default.
  --precision PRECISION
                        Option: precision is count of digits after comma, 2 by default.
  --timeframe TIMEFRAME
                        Option: time delta between two neighbour candles in
                        minutes, 60 (1 hour) by default. --start START         Опция: время начала первой свечи в формате строки 'год-месяц-день час:мин', например, '2021-01-02 12:00'.
  --horizon HORIZON       Опция: количество свечей. По умолчанию: 30.
  --split-trend SPLIT_TREND
                          Опция: установка различных трендов, например, `--split-trend=/\-` означает, что сгенерированные свечи имеют восходящий тренд в первой части, затем нисходящий и после этого отсутствие тренда. Используется только вместе с ключом `--split-count`. Также можно использовать слова: `up`, `down`, `no` или символы: `u`, `d`, `n` с символом дефиса в качестве разделителя, например, `--split-trend=up-down-no-up`, `--split-trend=u-d-n-u` и т. д. По умолчанию используется пустая строка, что означает использование случайных направлений тренда.
  --split-count SPLIT_COUNT [SPLIT_COUNT ...]
                          Опция: устанавливает количество свечей в разных трендах, например, `--split-count 5 10 15` означает, что сгенерированные свечи имеют 3 тренда с 5, 10 и 15 свечами в цепочке, при этом сумма должна быть равна значению `--horizon`. Используется только совместно с ключом `--split-trend`. По умолчанию: [], пустой список означает, что будет использоваться случайное количество свечей в трендах.
  --max-close MAX_CLOSE
                          Опция: максимум всех цен закрытия.
  --min-close MIN_CLOSE
                          Опция: минимум всех цен закрытия.
  --init-close INIT_CLOSE
                          Опция: генератор начал первую цену открытия, равную этой последней цене закрытия.
  --max-outlier MAX_OUTLIER
                          Опция: максимум размера хвостов свечей-выбросов, по умолчанию используется (max_close - min_close) / 10.
  --max-body MAX_BODY    Опция: максимум размеров тела свечи: abs(open - close), по умолчанию используется max_outlier * 0.9.
  --max-volume MAX_VOLUME
                          Опция: максимум объёмов торговли.
  --up-candles-prob UP_CANDLES_PROB
                          Опция: число с плавающей точкой в диапазоне [0; 1] — это вероятность того, что следующая свеча будет восходящей, по умолчанию 0,5.
  --outliers-prob OUTLIERS_PROB
                          Опция: число с плавающей точкой в диапазоне [0; 1] — вероятность выбросов (хвосты цены), по умолчанию 0,03.
  --trend-deviation TREND_DEVIATION
                          Опция: относительное отклонение для обнаружения тренда, 0,005 означает ±0,005 по умолчанию. Тренда нет, если (1st_close - last_close) / 1st_close <= trend_deviation.
  --zigzag ZIGZAG        Опция: относительное отклонение к точкам обнаружения индикатора Зигзаг, по умолчанию 0,03.
  --sep SEP              Опция: разделитель в CSV-файле, если None, то включается автоматическое определение.
  --dark                 Опция: если ключ присутствует, то будет использоваться тёмная тема для ключа `--render-bokeh`. По умолчанию для светлой темы используется значение False.
  --debug-level DEBUG_LEVEL
                          Опция: отображение сообщений STDOUT минимального уровня отладки, например, 10 = DEBUG, 20 = INFO, 30 = WARNING, 40 = ERROR, 50 = CRITICAL.
  --load-from LOAD_FROM
                          Команда: загружает .cvs-файл в Pandas DataFrame. Можно нарисовать график дополнительно с помощью ключей `--render-bokeh` или `--render-google`.
  --generate             Команда: генерирует цепочку свечей с заданными статистическими параметрами и сохраняет историю акций как Pandas DataFrame или .CSV-файл, если определён ключ `--save-to`. Можно нарисовать график дополнительно с ключами `--render-bokeh` или `--render-google`.
  --save-to SAVE_TO      Команда: сохраняет сгенерированный или загруженный фрейм данных в .CSV-файл. Можно нарисовать график дополнительно с **Генерация цен с параметрами по умолчанию**

Попробуем сгенерировать случайные данные о ценах (ключ `--generate`) со всеми параметрами по умолчанию и сохранить их в файл `test.csv` (ключ `--save-to csv_file_name`). Команда может выглядеть следующим образом:
```commandline
pricegenerator --debug-level 10 --generate --save-to test.csv

Вы должны получить вывод журналов, похожий на следующий:

PriceGenerator.py   L:605  DEBUG   [2021-01-31 17:52:49,954] =--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--==--=
PriceGenerator.py   L:606  DEBUG   [2021-01-31 17:52:49,954] PriceGenerator started: 2021-01-31 17:52:49
PriceGenerator.py   L:367  INFO    [2021-01-31 17:52:49,954] Generating prices...
PriceGenerator.py   L:368  DEBUG   [2021-01-31 17:52:49,954] - Ticker name: TEST
PriceGenerator.py   L:369  DEBUG   [2021-01-31 17:52:49,954] - Interval or timeframe (time delta between two neighbour candles): 1:00:00
PriceGenerator.py   L:370  DEBUG   [2021-01-31 17:52:49,954] - Horizon length (candlesticks count): 100
PriceGenerator.py   L:371  DEBUG   [2021-01-31 17:52:49,954] - Start time: 2021-01-31--17-00-00
PriceGenerator.py   L:372  DEBUG   [2021-01-31 17:52:49,955]   |-> end time: 2021-02-04--21-00-00
PriceGenerator.py   L:373  DEBUG   [2021-01-31 17:52:49,955] - Maximum of close prices: 79.21
PriceGenerator.py   L:374  DEBUG   [2021-01-31 17:52:49,955] - Minimum of close prices: 67.69
PriceGenerator.py   L:375  DEBUG   [2021-01-31 17:52:49,955] - Maximum of candle body sizes: 3.08
PriceGenerator.py   L:376  DEBUG   [2021-01-31 17:52:49,955] - Maximum of candle tails outlier sizes: 3.42
PriceGenerator.py   L:377  DEBUG   [2021-01-31 17:52:49,955] - Init close (1st open price in chain): 71.49
PriceGenerator.py   L:378  DEBUG   [2021-01-31 17:52:49,955] - Maximum of volume of one candle: 42340
PriceGenerator.py   L:379  DEBUG   [2021-01-31 17:52:49,955] - Probability that next candle is up: 50.0%
PriceGenerator.py   L:380  DEBUG   [2021-01-31 17:52:49,955] - Statistical outliers probability: 3.0%
PriceGenerator.py   L:397  INFO    [2021-01-31 17:52:49,958] Showing last 5 rows as Pandas DataFrame:
PriceGenerator.py   L:399  INFO    [2021-01-31 17:52:49,963]                     datetime   open   high    low  close  volume
PriceGenerator.py   L:399  INFO    [2021-01-31 17:52:49,963] 95 2021-02-03 11:00:00+03:00  76.82  78.43  76.21  78.13   33652
PriceGenerator.py   L:399  INFO    [2021-01-31 17:52:49,963] 96 2021-02-03 12:00:00+03:00  78.13  78.37  78.12  78.36    9347
PriceGenerator.py   L:399  INFO    [2021-01-31 17:52:49,963] 97 2021-02-03 13:00:00+03:00  78.36  78.40  78.05  78.07   27250
PriceGenerator.py   L:399  INFO    [2021-01-31 17:52:49,963] 98 2021-02-03 14:00:00+03:00  78.07  78.61  75.72  76.42   22979
PriceGenerator.py   L:399  INFO    [2021-01-31 17:52:49,963] 99 2021-02-03 15:00:00+03:00  76.42  77.37  76.25  77.16   30845
PriceGenerator.py   L:173  INFO    [2021-01-31 17:52:49,963] Saving [100] rows of Pandas DataFrame with columns: ['date', 'time', 'open', 'high', 'low', 'close', 'volume']...
PriceGenerator.py   L:174  DEBUG   [2021-01-31 17:52:49,963] Delimeter: ,
PriceGenerator.py   L:181  INFO    [2021-01-31 17:52:49,976] Pandas DataFrame saved to .csv-file [./test.csv]
PriceGenerator.py   L:645  DEBUG   [2021-01-31 17:52:49,976] All PriceGenerator operations are finished success (summary code is 0).
PriceGenerator.py   L:650  DEBUG   [2021-01-31 17:52:49,976] PriceGenerator work duration: 0:00:00.022938
PriceGenerator.py   L:651  DEBUG   [2021-01-31 17:52:49,976] PriceGenerator

В тексте запроса используется язык программирования Python. **Работа завершена: 2021-01-31 17:52:49**

Also next to it will be saved the file test.csv, an example of which can be found here: ./media/test.csv.

Генерация цен, получение статистики и построение графика

В следующем примере мы не только сгенерируем файл с данными о ценах, но и получим некоторые статистические параметры цен, а также отобразим цены на графике (ключ --render-bokeh html_file_name). Команда может выглядеть следующим образом:

pricegenerator --debug-level 20 --generate --save-to test.csv --render-bokeh index.html

При успешном выполнении вы получите вывод журнала, подобный этому:

PriceGenerator.py   L:367  INFO    [2021-01-31 18:00:31,711] Generating prices...
PriceGenerator.py   L:397  INFO    [2021-01-31 18:00:31,714] Showing last 5 rows of Pandas generated dataframe object:
PriceGenerator.py   L:399  INFO    [2021-01-31 18:00:31,719]                     datetime   open   high    low  close  volume
PriceGenerator.py   L:399  INFO    [2021-01-31 18:00:31,719] 95 2021-02-03 11:00:00+03:00  76.82  78.43  76.21  78.13   33652
PriceGenerator.py   L:399  INFO    [2021-01-31 18:00:31,719] 96 2021-02-03 12:00:00+03:00  78.13  78.37  78.12  78.36    9347
PriceGenerator.py   L:399  INFO    [2021-01-31 18:00:31,719] 97 2021-02-03 13:00:00+03:00  78.36  78.40  78.05  78.07   27250
PriceGenerator.py   L:399  INFO    [2021-01-31 18:00:31,719] 98 2021-02-03 14:00:00+03:00  78.07  78.61  75.72  76.42   22979
PriceGenerator.py   L:399  INFO    [2021-01-31 18:00:31,719] 99 2021-02-03 15:00:00+03:00  76.42  77.37  76.25  77.16   30845
PriceGenerator.py   L:173  INFO    [2021-01-31 18:00:31,719] Saving [100] rows of Pandas DataFrame with columns: ['date', 'time', 'open', 'high', 'low', 'close', 'volume']...
PriceGenerator.py   L:181  INFO    [2021-01-31 18:00:31,731] Pandas DataFrame saved to .csv-file [./test.csv]
PriceGenerator.py   L:410  INFO    [2021-01-31 18:00:31,731] Rendering Pandas DataFrame as Bokeh chart...
PriceGenerator.py   L:300  INFO    [2021-01-31 18:00:31,740] Some statistical info:
## Summary

| Parameter                                    | Value
|----------------------------------------------|---------------
| Candles count:                               | 100
| Timeframe:                                   | 1:00:00
| Precision (signs after comma):               | 2
| Close first:                                 | 71.49
| Close last:                                  | 77.16
| Close max:                                   | 79.21
| Close min:                                   | 67.69
| Diapason (between max and min close prices): | 11.52
| Trend (between close first and close last:   | UP trend
| - Trend deviation parameter:                 | ±0.5%

## Some statistics

| Statistic                                    | Value
|----------------------------------------------|---------------
| Up candles count:                            | 53 (53.0%)
| Down candles count:                          | 47 (47.0%)
| Max of up candles chain:                     | 7
| Max of down candles chain:                   | 5
| Max delta (between High and Low prices):     | 3.08
| Min delta (between High and Low prices):     | 0.0
| Delta's std. dev.:                           | 0.86
| - 99 percentile:                             | ≤ 2.99
| - 95 percentile:                             | ≤ 2.89
| - 80 percentile:                             | ≤ 2.2
| - 50 percentile:                             | ≤ 1.15
| Cumulative sum of volumes:                   | 1777314
PriceGenerator.py   L:563  INFO    [2021-01-31 18:00:32,290] Pandas DataFrame rendered as html-file [./index.html]

После выполнения команды выше вы получите три файла:

  • test.csv — .csv-файл, содержащий случайный набор цен, аналогичный реальным (пример: ./media/test.csv);
  • index.html — график цен и статистика, созданные с помощью библиотеки Bokeh и сохранённые в .html-файле (пример: ./media/index.html);
  • index.html.md — статистика в виде простого текста, сохранённая в формате Markdown. Статистика и график на основе сохранённых цен

Если вам нужна статистика по уже сгенерированным или реальным ценам, вы можете просто загрузить файл (ключ --load-from csv_file_name) и построить график (ключ --render-bokeh html_file_name):

pricegenerator --debug-level 20 --load-from test.csv --render-bokeh index.html

В результате выполнения команды вы получите аналогичный график в index.html и статистику в index.html.md.

Статистика и график на простом шаблоне

В приведённых примерах можно использовать простой неинтерактивный график. Для этого используются библиотека Google Candlestick chart и простейший шаблон jinja2. Давайте снова загрузим цены (ключ --load-from csv_file_name), но построим график через библиотеку Google (ключ --render-google html_file_name):

pricegenerator --debug-level 20 --load-from test.csv --render-google index_google.html

В результате выполнения команды вы получите график ./media/index_google.html и статистику в файле Markdown. Это будет выглядеть примерно так:

Переопределение параметров

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

pricegenerator --debug-level 10 --ticker "MY_PRICES" --precision 2 --timeframe 240 --start "2020-01-01 00:00" --horizon 150 --max-close 18000 --min-close 14000 --init-close 15000 --max-outlier 1000 --max-body 500 --max-volume 400000 --up-candles-prob 0.48 --outliers-prob 0.05 --trend-deviation 0.03 --zigzag 0.03 --generate --render-bokeh index_custom.html

Параметры означают:

  • --ticker "MY_PRICES" — установить заголовок графика для цен как MY_PRICES;
  • --precision 2 — задать точность, то есть количество цифр после запятой;
  • --timeframe 240 — одна свеча должна отражать изменение цены за 4 часа (240 минут);
  • --start "2020-01-01 00:00" — дата и время первой свечи — 2020-01-01 00:00;
  • --horizon 150 — сгенерировать 150 свечей;
  • --max-close 18000 — максимальная цена закрытия любой свечи должна быть не более 18 000;
  • --min-close 14000 — минимальная цена закрытия любой свечи должна быть не менее 14 000;
  • --init-close 15000 — цена закрытия «предыдущей» и, соответственно, цена открытия первой сгенерированной свечи должны быть равны 15 000;
  • --max-outlier 1000 — если у свечи есть «выбросы» и «хвосты», то их размер должен быть не более 1000;
  • --max-body 500 — максимальный размер «тела» свечи должен быть не более 500;
  • --max-volume 400000 — максимальный торговый объём для каждой свечи должен быть не более 400 000;
  • --up-candles-prob 0,48 — установить вероятность того, что следующая свеча будет вверх, равной 0,48 (48%);
  • --outliers-prob 0,05 — установить вероятность выбросов равной 0,05 (5%);
  • --trend-deviation 0,03 — чтобы определить тренд, относительное изменение цен закрытия первой и последней свечей должно отличаться на ±0,03 (3%);
  • --zigzag 0,03 — относительное различие между двумя точками индикатора ZigZag;
  • --generate — начать генерацию цен;
  • --render-bokeh index_custom.html — сохранить сгенерированные цены в файл index_custom.html и открыть его в браузере по умолчанию.

Стиль графика по умолчанию светлый. Если вы используете ключ --render-bokeh, вы также можете добавить к приведённой выше команде ключ --dark. В этом случае график будет отображаться в стиле тёмного режима:

В результате выполнения команды вы получите собственный уникальный график случайных цен с переопределёнными базовыми параметрами генератора. Мы получили следующие артефакты:

Разделение данных по некоторым тенденциям

Эта функция доступна в новейшей версии разработки pricegenerator>=1.2.dev53 или более поздней. Инициализация модуля

Рассмотрим пример генерации цен с некоторыми предопределёнными параметрами, сохранения их в Pandas DataFrame и построения графика. Сохраните и запустите следующий скрипт:

from pricegenerator.PriceGenerator import PriceGenerator, uLogger
from datetime import datetime, timedelta

# Отключаем логирование:
uLogger.setLevel(0)

# --- Инициализируем экземпляр класса генератора и задаём некоторые параметры:
priceModel = PriceGenerator()
priceModel.precision = 1  # сколько знаков после запятой должно быть в генерируемых ценах
priceModel.ticker = "MY_GENERATED_PRICES"  # случайное имя (тикер) генерируемых цен
priceModel.timeframe = timedelta(days=1)  # временной интервал между генерируемыми свечами, по умолчанию 1 час
priceModel.timeStart = datetime.today()  # с какой даты начинать генерировать свечи, по умолчанию с текущего времени
priceModel.horizon = 60  # сколько свечей сгенерировать, должно быть не менее 5, по умолчанию 100
priceModel.maxClose = 16000  # самая высокая цена закрытия свечи во всей цепочке цен
                             # по умолчанию генерируется случайным образом в интервале (70, 90), это похоже на текущие цены USDRUB
priceModel.minClose = 13800  # самая низкая цена закрытия свечи во всей цепочке цен
                             # по умолчанию генерируется случайным образом в интервале (60, 70), это похоже на текущие цены USDRUB
priceModel.initClose = 14400  # если указана цена, она будет ценой закрытия, как у «предыдущей» свечи, и одновременно ценой открытия первой свечи в сгенерированной цепочке
                              # None по умолчанию означает, что цена открытия первой свечи будет генерироваться случайным образом в интервале (minClose, maxClose)
priceModel.maxOutlier = 500  # максимальное значение для ценового выброса «хвостов» свечей.
                             # None по умолчанию означает, что выбросы будут не более (maxClose - minClose) / 10
priceModel.maxCandleBody = 300  # максимальное значение размера тела свечи abs(open - close)
                                # None по умолчанию означает, что тело свечи может быть не более 90% от размера выброса: maxOutlier * 90%
priceModel.maxVolume = 400000  # максимальный объём торгов для одной свечи, по умолчанию берётся случайным образом из интервала (0, 100000)
priceModel.upCandlesProb = 0.46  # вероятность того, что следующая сгенерированная свеча будет восходящей, по умолчанию 50%
priceModel.outliersProb = 0.11  # вероятность
``` Следующий сгенерированный бар будет иметь «выбросовую» цену, 3% по умолчанию.

priceModel.trendDeviation = 0.005 # ценовые колебания между ценами закрытия первого и последнего баров, определяющие тренд. «Без тренда», если разница меньше этого значения, по умолчанию ± 0,005 или ± 0,5%.

priceModel.zigzag = 0,05 # относительная разница между двумя точками индикатора ZigZag, по умолчанию 0,03.

priceModel._chartTitle = "" # заголовок графика, обычно генерируется автоматически.

# Цены ещё не были сгенерированы и не загружены, давайте проверим это:
print("Текущие цены:\n{}".format(priceModel.prices))

# Запускаем генератор цен, и они будут сохранены в поле priceModel.prices в формате Pandas DataFrame:
priceModel.Generate()

# Убедитесь, что цены сгенерировались:
print("Сгенерированные цены как Pandas DataFrame:\n{}".format(priceModel.prices))

# Словарь с рассчитанной статистикой сохраняется в поле self.stat:
print("Словарь со статистикой:\n{}".format(priceModel.stat))

# Сохранение OHLCV-цен в .csv-файл:
priceModel.SaveToFile(fileName="test.csv")

# Сохранение ценового графика в html-файл и немедленное открытие его в браузере по умолчанию. Статистика будет автоматически сохранена в файле markdown с именем fileName + ".md".
priceModel.RenderBokeh(fileName="index.html", viewInBrowser=True)

# Вместо библиотеки Bokeh можно использовать простую неинтерактивную диаграмму через библиотеку Google Candlestick Chart. Просто раскомментируйте следующие строки. Перед вызовом priceModel.RenderGoogle() вы можете установить свой собственный шаблон в self.j2template.

# priceModel.j2template = "google_template_example.j2" # файл или многострочная переменная с шаблоном jinja2.
# priceModel.RenderGoogle(fileName="index.html", viewInBrowser=True).

При запуске скрипта вы получите аналогичный вывод в журналах, три файла: `test.csv`, `index.html` и `index.html.md`. Также html-файл с графиком цен будет немедленно открыт в браузере. Вы можете самостоятельно экспериментировать с параметрами класса `PriceGenerator()`, чтобы сгенерировать цены, подходящие для ваших условий.

Также вы можете манипулировать графиком и добавлять линии или маркеры к основному графику. Для этого используйте параметры `markers` и `lines`.

`markers`  это Pandas DataFrame с дополнительными маркерами, которые будут размещены на основной серии. По умолчанию `None`. Один маркер  это пользовательский символ, например ×,  или  или любой другой. Фрейм данных маркеров должен содержать как минимум два столбца. Есть `datetime` с датой и временем и некоторые столбцы маркеров (`markersUpper`, `markersCenter` или `markersLower`). Длина фрейма данных маркеров должна быть равна длине основной серии свечей.

`lines`  это список фреймов данных Pandas с дополнительными линиями графика, которые будут размещаться на основной серии. По умолчанию `None`. Каждый линейный элемент данных должен содержать как минимум два столбца. Есть `datetime` с датой и временем и `custom_line_name` с координатами y. Длина данных фреймов линий диаграммы должна быть равна длине основной серии свечей.

Пример:

```python
from pricegenerator.PriceGenerator import PriceGenerator, uLogger
from datetime import datetime, timedelta
import pandas as pd

uLogger.setLevel(0) # Отключить сообщения журнала.

# Инициализировать PriceGenerator:
priceModel = PriceGenerator()
priceModel.ticker = "TEST_PRICES"
priceModel.precision = 0
priceModel.timeframe = timedelta(days=1)
priceModel.timeStart = datetime.today()
priceModel.horizon = 75
priceModel.maxClose = 140
priceModel.minClose = 40
priceModel.initClose = 50
priceModel.maxOutlier = 35
priceModel.maxCandleBody = 15
priceModel.maxVolume = 400000
priceModel.upCandlesProb = 0.51
priceModel.outliersProb = 0.1
priceModel.trendDeviation = 0.005
priceModel.trendSplit = "/\/"
priceModel.splitCount = [40, 10, 25]

priceModel.Generate() # Сгенерировать основную серию свечей.

# Давайте нарисуем новую среднюю линию на основном графике и установим маркеры сверху, в центре и снизу свечей:
priceModel.prices["avg"] = priceModel.prices.low + (priceModel.prices.high - priceModel.prices.low) / 2
priceModel.prices["markersUpper"] = pd.Series(["↓"] * len(priceModel.prices.high)) Вот перевод исходного текста на русский язык:

priceModel.prices["markersCenter"] = pd.Series(["×"] * len(priceModel.prices.avg))
priceModel.prices["markersLower"] = pd.Series(["↑"] * len(priceModel.prices.low))

priceModel.RenderBokeh(
    fileName="index1.html",
    viewInBrowser=True,
    darkTheme=True,  # Set `False` for light theme.
    markers=priceModel.prices[["datetime", "markersUpper", "markersCenter", "markersLower"]],
    lines=[priceModel.prices[["datetime", "avg"]]],
    showStatOnChart=True,
    showControlsOnChart=True,
    inline=False,  # Set `True` if script runs in Jupyter Notebook.
)

Output:

![Marked chart](./media/marked_dark.png)

Вот и всё! Удачи вам в автоматизации и тестировании биржевой торговли! ;)

[![gift](https://badgen.net/badge/gift/donate/green)](https://yoomoney.ru/fundraise/BxB9DQNvJnk.230111)

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Простой генератор цен на акции и курсы валют. Используйте его для генерации тестовых данных для вашей торговой стратегии. См. статью (ru). Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/PriceGenerator.git
git@api.gitlife.ru:oschina-mirror/PriceGenerator.git
oschina-mirror
PriceGenerator
PriceGenerator
master