ПрайсГенератор
PriceGenerator — это платформа для генерации цен, похожих на реальные биржевые цены, но вы можете контролировать статистику их распределения. Генерирует цепочку свечей с заданными статистическими параметрами, возвращает Pandas DataFrame или сохраняет в виде CSV-файла с OHLCV-свечами в каждой строке. Используйте PriceGenerator для создания синтетических данных для тестирования вашей торговой стратегии.
Содержание
Иногда для тестирования автоматических торговых алгоритмов необходимо получить набор данных с биржевыми ценами. Обычно трейдеры и аналитики используют модель цен, такую как 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 **Прайс Генератор** — это библиотека, которая позволяет:
— сохранять сгенерированные цены в формате .csv;
— сохранять цены в переменную Pandas DataFrame для дальнейшего использования в сценариях автоматизации;
— автоматически рассчитывать некоторые статистические и вероятностные характеристики сгенерированных цен и сохранять их в формате Markdown;
— загружать цены реальных инструментов по модели OHLCV-свечей из файла .csv и проводить их статистический анализ;
— рисовать график сгенерированных или загруженных реальных цен и сохранять его в формате 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
``` **Минуты, 60 (1 час) по умолчанию.**
--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-файл. Вы можете нарисовать диаграмму с помощью ключей `--render-bokeh` или `--render-google`.
--render-bokeh RENDER_BOKEH
Команда: показать цепочку свечей как интерактивный график
Bokeh. Используется только вместе с ключами `--load-from` или `--generate`.
--render-google RENDER_GOOGLE
Команда: показать цепочку свечей как неинтерактивный график
Google Candlestick. Используется только вместе с
ключами `--load-from` или `--generate`.
Давайте попробуем сгенерировать случайные данные о ценах (ключ --generate
) со всеми параметрами по умолчанию и сохранить их в файл test.csv
(ключ --save-to csv_file_name
). Команда может выглядеть так:
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 запущен: 2021-01-31 17:52:49
PriceGenerator.py L:367 INFO [2021-01-31 17:52:49,954] Генерация цен...
PriceGenerator.py L:368 DEBUG [2021-01-31 17:52:49,954] - Название тикера: TEST
PriceGenerator.py L:369 DEBUG [2021-01-31 17:52:49,954] - Интервал или таймфрейм (временной промежуток между двумя соседними свечами): 1:00:00
PriceGenerator.py L:370 DEBUG [2021-01-31 17:52:49,954] - Длина горизонта (количество свечей): 100
PriceGenerator.py L:371 DEBUG [2021-01-31 17:52:49,954] - Время начала: 2021-01-31--17-00-00
PriceGenerator.py L:372 DEBUG [2021-01-31 17:52:49,955] |-> время окончания: 2021-02-04--21-00-00
PriceGenerator.py L:373 DEBUG [2021-01-31 17:52:49,955] - Максимум цен закрытия: 79.21
PriceGenerator.py L:374 DEBUG [2021-01-31 17:52:49,955] - Минимум цен закрытия: 67.69
PriceGenerator.py L:375 DEBUG [2021-01-31 17:52:49,955] - Максимум размеров тела свечи: 3.08
PriceGenerator.py L:376 DEBUG [2021-01-31 17:52:49,955] - Максимум размера хвостов свечи: 3.42
PriceGenerator.py L:377 DEBUG [2021-01-31 17:52:49,955] - Начальное закрытие (первая цена открытия в цепочке): 71.49
PriceGenerator.py L:378 DEBUG [2021-01-31 17:52:49,955] - Максимум объёма одной свечи: 42340
PriceGenerator.py L:379 DEBUG [2021-01-31 17:52:49,955] - Вероятность того, что следующая свеча будет выше: 50.0%
PriceGenerator.py L:380 DEBUG [2021-01-31 17:52:49,955] - Статистические выбросы вероятности: 3.0%
PriceGenerator.py L:397 INFO [2021-01-31 17:52:49,958] Показ последних 5 строк в виде 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] Сохранение [100] строк Pandas DataFrame с столбцами: ['дата', 'время', 'открыто', 'высоко', 'низко', 'закрыто', 'объём']...
PriceGenerator.py L:174 DEBUG [2021-01-31 17:52:49,963] Разделитель: ,
PriceGenerator.py L:181 INFO [2021-01-31 17:52:49,976] Pandas DataFrame сохранён в .csv-файл [./test.csv]
PriceGenerator.py L:645 DEBUG [2021-01-31 17:52:49,976] Все операции PriceGenerator завершены успешно (код сводки равен 0).
PriceGenerator.py L:650 DEBUG [2021-01-31 17:52:49,976] Работа PriceGenerator завершена: 0:00:00.022938 **Текст запроса в переводе на русский язык:**
[2021-01-31 17:52:49,976] Работа PriceGenerator завершена: 2021-01-31 17:52:49
Также рядом будет сохранён файл test.csv
, пример которого можно найти здесь: ./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] Генерация цен...
PriceGenerator.py L:397 INFO [2021-01-31 18:00:31,714] Показ последних 5 строк объекта фрейма данных Pandas:
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] Сохранение [100] строк фрейма данных Pandas со столбцами: ['дата', 'время', 'открыто', 'высоко', 'низко', 'закрыто', 'объём']...
PriceGenerator.py L:181 INFO [2021-01-31 18:00:31,731] Фрейм данных Pandas сохранён в .csv-файл [./test.csv]
PriceGenerator.py L:410 INFO [2021-01-31 18:00:31,731] Рендеринг фрейма данных Pandas в виде диаграммы Боке...
PriceGenerator.py L:300 INFO [2021-01-31 18:00:31,740] Некоторая статистическая информация:
## Сводка
| Параметр | Значение
|----------------------------------------------|---------------
| Количество свечей: | 100
| Таймфрейм: | 1:00:00
| Точность (знаков после запятой): | 2
| Открыто первое: | 71.49
| Закрыто последнее: | 77.16
| Закрыто максимальное: | 79.21
| Закрыто минимальное: | 67.69
| Диапазон (между максимальными и минимальными ценами закрытия): | 11.52
| Тренд (между первым и последним закрытием): | восходящий тренд
| - Параметр отклонения тренда: | ±0.5%
## Некоторые статистические данные
| Статистика | Значение
|----------------------------------------------|---------------
| Вверх количество свечей: | 53 (53.0%)
| Вниз количество свечей: | 47 (47.0%)
| Максимум цепочки вверх свечей: | 7
| Максимум вниз цепочки свечей: | 5
| Максимальная дельта (между высокими и низкими ценами): | 3.08
| Минимальная дельта (между высокими и низкими ценами): | 0.0
| Стандартное отклонение дельты: | 0.86
| - 99 процентиль: | ≤ 2.99
| - 95 процентиль: | ≤ 2.89
| - 80 процентиль: | ≤ 2.2
| - 50 процентиль: | ≤ 1.15
| Накопленная сумма объёмов: | 1777314
PriceGenerator.py L:563 INFO [2021-01-31 18:00:32,290] Фрейм данных Pandas визуализирован как html-файл [./index.html]
После выполнения команды выше вы получите три файла:
test.csv
— .csv-файл, содержащий случайный набор цен, аналогичный реальным (пример: ./media/test.csv);index.html
— диаграмма цен и статистика, созданная с помощью библиотеки Bokeh и сохранённая в .html-файле (пример: ./media/index.html); Статистика и график на основе сохранённых цен
Если вам нужно получить статистику по уже сгенерированным или реальным ценам, вы можете просто загрузить файл (ключ --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
или чем pricegenerator>=1.2.56
.
Были реализованы два дополнительных ключа: --split-trend
и --split-count
. Эти ключи влияют на внешний вид тренда и количество свечей в каждом тренде.
Ключ --split-trend
показывает движения трендов, например, --split-trend=/\-
означает, что сгенерированные свечи имеют восходящий тренд в первой части, затем нисходящий тренд, а затем отсутствие тренда.
Начиная с версии PriceGenerator v1.3.* была добавлена возможность указывать направления словами или символами. Словами могут быть следующие: up
, down
, no
или символы: u
, d
, n
для ключа --split-trend
, в дополнение к существующей возможности устанавливать тренд с помощью символов /\-
. Для разделения слов или символов используйте символ дефиса, например, --split-trend=up-down-no-up
, --split-trend=u-d-n-u
и т. д.
Ключ --split-count
задаёт количество свечей разных периодов, например, --split-count 5 10 15
означает, что в сгенерированных свечах будет 3 тренда по 5, 10 и 15 свечей в цепочке.
Чтобы понять, как это работает, попробуйте один из следующих примеров:
pricegenerator --horizon 300 --render-bokeh index.html --split-trend="/\-" --split-count 50 100 150 --generate
pricegenerator --horizon 300 --render-bokeh index.html --split-trend="\/" --split-count 50 100 150 --generate
pricegenerator --horizon 300 --render-bokeh index.html --split-trend="\-/" --split-count 50 100 150 --generate
pricegenerator --horizon 100 --render-bokeh index.html --split-trend="/\/" --split-count 20 30 30 20 --generate
Для последнего примера вы можете получить изображение, подобное этому:
Давайте рассмотрим пример генерации цен с некоторыми предопределёнными параметрами, сохраним их в Pandas DataFrame и нарисуем график. Просто сохраните и запустите следующий скрипт:
from pricegenerator.PriceGenerator import PriceGenerator, uLogger
from datetime import datetime, timedelta
# Disable logging:
uLogger.setLevel(0)
# --- Initialize an instance of the generator class and set some parameters:
priceModel = PriceGenerator()
priceModel.precision = 1 # how many decimal places should be in generated prices
priceModel.ticker = "MY_GENERATED_PRICES" # random name (ticker) of generated prices
priceModel.timeframe = timedelta(days=1) # time interval between generated candles, 1 hour by default
priceModel.timeStart = datetime.today() # from what date to start generating candles, by default from the current time
priceModel.horizon = 60 # how many candles to generate, there must be at least 5, by default 100
priceModel.maxClose = 16000 # the highest candlestick closing price in the entire price chain
# by default, it is generated randomly in the interval (70, 90), it is similar to the current prices of USDRUB
priceModel.minClose = 13800 # the lowest candlestick closing price in the entire price chain
# by default, it is generated randomly in the interval (60, 70), it is similar to the current prices of USDRUB
priceModel.initClose = 14400 # if a price is specified, it will be the closing price like the "previous" candlestick, and at the same time the opening price of the first candlestick in the generated chain
# None by default means that the opening price of the first candle will be generated randomly in the interval (minClose, maxClose)
priceModel.maxOutlier = 500 # The maximum value for the price outlier of the "tails" of the candles.
# None by default means that outliers will be no more than (maxClose - minClose) / 10
priceModel.maxCandleBody = 300 # maximum value for the size of candlestick bodies abs(open - close)
# None by default means that the candlestick body can be no more than 90% of the outlier size: maxOutlier * 90%
priceModel.maxVolume = 400000 # the maximum trading volume for one candle, by default it is taken randomly from the interval (0, 100000)
priceModel.upCandlesProb = 0.46 # probability that the next generated candlestick Будут сгенерированы, 50% по умолчанию
priceModel.outliersProb = 0.11 # вероятность того, что следующая сгенерированная свеча будет иметь «выброс» цены, по умолчанию 3%
priceModel.trendDeviation = 0.005 # колебания цены между ценами закрытия первой и последней свечей, определяющих тренд. «Нет тренда», если разница меньше этого значения, по умолчанию ± 0,005 или ± 0,5%
priceModel.zigzag = 0,05 # относительная разница между двумя точками индикатора ZigZag, по умолчанию — 0,03
priceModel._chartTitle = "" # заголовок диаграммы, обычно генерируется автоматически
# Цены ещё не были сгенерированы и не загружены, давайте проверим это:
print("Текущие цены: {}".format(priceModel.prices))
# Запускаем генератор цен, они будут сохранены в поле priceModel.prices в формате Pandas DataFrame:
priceModel.Generate()
# Убедитесь, что цены сгенерированы:
print("Сгенерированные цены как Pandas DataFrame: {}".format(priceModel.prices))
# Словарь с рассчитанной статистикой сохраняется в поле self.stat:
print("Словарь со статистикой: {}".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. Длина данных фреймов линий диаграммы должна быть равна длине основной серии свечей.
Пример:
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.
)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )