PriceGenerator
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 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)):

Также на графике можно включить некоторые популярные индикаторы (скользящие средние, полосы Боллинджера, зигзаг и другие).
### Метод генерации цен
Набор свечей заданной длины `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:

Вот и всё! Удачи вам в автоматизации и тестировании биржевой торговли! ;)
[](https://yoomoney.ru/fundraise/BxB9DQNvJnk.230111)
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )