From d50defbe3e76e214eccfb99ebb76298b0ddd6645 Mon Sep 17 00:00:00 2001 From: Mark Date: Sun, 4 Dec 2022 19:18:32 +0200 Subject: [PATCH] added documentation --- .idea/csv-plugin.xml | 7 + market_trade/core/bibasCopy.md | 3 + market_trade/core/decisionManager.md | 288 +++++++++++++++++++++++++++ 3 files changed, 298 insertions(+) create mode 100644 market_trade/core/bibasCopy.md create mode 100644 market_trade/core/decisionManager.md diff --git a/.idea/csv-plugin.xml b/.idea/csv-plugin.xml index 4ef4d3c..21ea993 100644 --- a/.idea/csv-plugin.xml +++ b/.idea/csv-plugin.xml @@ -31,6 +31,13 @@ + + + + + + diff --git a/market_trade/core/bibasCopy.md b/market_trade/core/bibasCopy.md new file mode 100644 index 0000000..6d787ed --- /dev/null +++ b/market_trade/core/bibasCopy.md @@ -0,0 +1,3 @@ +project:: #bibasCopy +# Запуск +Для запуска нужно замутить пройти шаги из [[decisionManager]] \ No newline at end of file diff --git a/market_trade/core/decisionManager.md b/market_trade/core/decisionManager.md new file mode 100644 index 0000000..44bc4ef --- /dev/null +++ b/market_trade/core/decisionManager.md @@ -0,0 +1,288 @@ +project:: #bibasCopy +# Импорт +Для начала импортим все что нужно +```python +from decisionManager_v2 import * +from indicators_v2 import * +from signals_v2 import * +``` + +Подготавливаем данные по которым собирется модель. Модель представляет из себя словарь в следующем формате: +```json +{ + 'название_cигнала_1':{ + 'className': класс_сигнала_1, + 'params': { параметры_для_сигнала_1 }, + 'indicators':{ + 'название_индикатора_1':{ + 'className': класс_индикатора_1, + 'params': { параметры_для_индикатора_1 } + }, + 'название_индикатора_2':{ + 'className': класс_индикатора_2, + 'params': { параметры_для_индикатора_2 } + }, + } + }, + 'название_cигнала_2':{ + 'className': класс_сигнала_2, + 'params': { параметры_для_сигнала_2 }, + 'indicators':{ + 'название_индикатора_1':{ + 'className': класс_индикатора_1, + 'params': { параметры_для_индикатора_1 } + }, + 'название_индикатора_3':{ + 'className': класс_индикатора_3, + 'params': { параметры_для_индикатора_3 } + }, + } + + }, +} +``` + +Пример такого словаря, который будет дальше использоваться +```python +sigAgrReq = { + 'sig_BB':{ + 'className':sig_BB, + 'params':{'source':'close','target':'close'}, + 'indicators':{ + 'ind_BB':{ + 'className':ind_BB, + 'params':{'MeanType':'SMA','window':30,'valueType':'close','kDev':2.5} + } + } + }, + 'sig_BB_2':{ + 'className':sig_BB, + 'params':{'source':'close','target':'close'}, + 'indicators':{ + 'ind_BB':{ + 'className':ind_BB, + 'params':{'MeanType':'SMA','window':30,'valueType':'close','kDev':2} + } + } + } +} +``` + +Далее нужно создать объект класса decisionManager_v2, например с именем "Pipa" +```python +test = decsionManager('Pipa', sigAgrReq) +``` + +# Ретро +## Описание +Ретро-тестирование нужно для +1. Проверки сигналов +2. Проверки параметров сигналов и индикаторов +3. Создания вероятностной матрицы решений + +## Получение данных +Для ретро-тестирования нужны данные в следующем формате + +| | date | open | close | high | low | +| --- | ------------------------- | ------- | ------- | ------- | ------- | +| 0 | 2020-09-01 03:00:00+03:00 | 1.19370 | 1.19388 | 1.19391 | 1.19368 | +| 1 | 2020-09-01 03:00:05+03:00 | 1.19370 | 1.19388 | 1.19391 | 1.19383 | +| ... | ... | ... | ... | ... | ... | + +Данные сохраняются в DataFrame + +```python +import pandas as pd + +df_candle = pd.read_csv("data.csv") +``` + +## Шиблон загрузки данных +Для ретро-тестирования необходимо задать, в каком формате будут приходить данные. Шаблон должен быть в следующем формате +```json +{ + 'имя_сигнала_1':{ + 'signalData': None, + 'indicatorData' :{'имя_индикатора_1': None, 'имя_индикатора_2': None} + }, + 'имя_сигнала_2':{ + 'signalData': None, + 'indicatorData' :{'имя_индикатора_3': None} + } +``` + +Пример шаблона который дальше будет использоваться +```python +sigAgrRetroTemplate = { + 'sig_BB':{ + 'signalData': None, + 'indicatorData' :{'ind_BB': None} + }, + 'sig_BB_2':{ + 'signalData': None, + 'indicatorData' :{'ind_BB': None} + } +} +``` + +## Получение результатов +Для получение результаов нужно задать размер скользящего окна. В примере ниже он равен 40. Так же нужно указать шаблон и какие данные нужно падать на вход. +```python +retroAns = test.getRetroTrendAns(sigAgrRetroTemplate,df_candle[:5000],40) +``` + +Результатом будет словарь в формате +```json +{ + 'signalsAns':[ + {'sig_BB': 'none', 'sig_BB_2': 'none'}, + {'sig_BB': 'none', 'sig_BB_2': 'down'}, + ], + 'rightAns':['up','down'] + +} +``` + +В signalsAns находится список из ответов сигналов для каждого окна +В rightAns находится список верных решений для этих окон +Возможные решения +- none - не изменится +- up - вверх +- down - вниз + +## Вероятностная матрица решений +### Описание +Вероятностная матрица решения - таблица, с помощью которой по заданным ответов сигналов можно опрделить вероятность исходов +Фомат матрицы для 2ух сигналов +| | | up | none | donw | +| ------------- | ------------- | --- | ---- | ---- | +| имя_сигнала_1 | имя_сигнала_2 | | | | +| up | up | | | | +| up | none | | | | +| up | donw | | | | +| none | up | | | | +| none | none | | | | +| none | donw | | | | +| donw | up | | | | +| donw | none | | | | +| donw | donw | | | | + +### Генерация +Для расчета вероятностной матрицы решений необходим передать словарь с ретро-ответами +```python +test.generateMatrixProbabilityFromDict(retroAns) +``` +## Итоговый код +```python +from decisionManager_v2 import * +from indicators_v2 import * +from signals_v2 import * +import pandas as pd + + +df_candle = pd.read_csv("data.csv") + + +sigAgrReq = { + 'sig_BB':{ + 'className':sig_BB, + 'params':{'source':'close','target':'close'}, + 'indicators':{ + 'ind_BB':{ + 'className':ind_BB, + 'params':{'MeanType':'SMA','window':30,'valueType':'close','kDev':2.5} + } + } + }, + 'sig_BB_2':{ + 'className':sig_BB, + 'params':{'source':'close','target':'close'}, + 'indicators':{ + 'ind_BB':{ + 'className':ind_BB, + 'params':{'MeanType':'SMA','window':30,'valueType':'close','kDev':2} + } + } + } +} + +sigAgrRetroTemplate = { + 'sig_BB':{ + 'signalData': None, + 'indicatorData' :{'ind_BB': None} + }, + 'sig_BB_2':{ + 'signalData': None, + 'indicatorData' :{'ind_BB': None} + } +} + + +test = decsionManager('Pipa', sigAgrReq) + + +retroAns = test.getRetroTrendAns(sigAgrRetroTemplate,df_candle[:5000],40) + + +test.generateMatrixProbabilityFromDict(retroAns) + +``` + +# Онлайн ответ +## Условия +Для работы онлай ответа неоходимо, чтобы были определны +1. dealManager +2. trandeVoter +3. riskManager +4. signalAgrigator +## Запуск +Для запуска нужно передать в метод текущую цену и данные, на основе которыйх будут рассчитаны сигналы и индикаторы в следующем формате +```json +{ + 'sig_BB':{ + 'signalData': data, + 'indicatorData' :{'ind_BB': data} + }, + 'sig_BB_2':{ + 'signalData': data, + 'indicatorData' :{'ind_BB': data} + } +} +``` +Пример словаря, который будет использорваться дальше +```python +sigAgrData = { + 'sig_BB':{ + 'signalData': df_candle[990:1000], + 'indicatorData' :{'ind_BB': df_candle[:1000]} + }, + 'sig_BB_2':{ + 'signalData': df_candle[990:1000], + 'indicatorData' :{'ind_BB': df_candle[:1000]} + } +} +``` + +Далее передам значения в мето +```python +test.getOnlineAns(sigAgrData, 0.0) +``` +и получаем ответ в формате +```json +{'decision': 'none'} +``` +# Дампы + +Сохранение объекта +```python +test.createDump('pupa') +``` +По итогу выполнения создается файл в текущей директории с названием data_pupa.pickle + +Загруיזть объеקт можно следующим образом +```python +import pickle + +with open('C:\\Users\\Redsandy\\PyProj\\Trade\\MVP\\data_pupa.pickle', 'rb') as f: + data_new = pickle.load(f) +```