Зовёт
Три основных принципа торговли акциями
Заявление
В настоящее время этот проект не гарантирует никакой обратной совместимости, пожалуйста, будьте осторожны при обновлении.
По мере изменения мышления автора некоторые вещи, которые раньше считались важными, могут стать неважными и, следовательно, могут не поддерживаться.
А будет ли полезно для вас добавление новых вещей, вам нужно оценить самостоятельно.
Прочитайте это на других языках: English.
Подробная документация:https://zvt.readthedocs.io/en/latest/
ZVT абстрагирует рынок в виде следующей модели:
python3 -m pip install -U zvt
Подходит для бэктестинга и исследований, не очень подходит для реального времени и взаимодействия с пользователем
После установки введите zvt в командной строке:
zvt
Откройте http://127.0.0.1:8050/
Здесь показанный пример зависит от последующей загрузки исторических данных, обновление данных см. в документации ниже
Основные концепции системы визуальны, названия интерфейса соответствуют им один к одному, поэтому они также единообразно расширяемы.
Вы можете писать и запускать стратегии в предпочитаемой среде разработки, а затем просматривать соответствующие объекты, факторы, сигналы и чистую стоимость в интерфейсе.
Более гибкий и расширяемый, более подходящий для обработки реального времени и взаимодействия с пользователями, в сочетании с динамической системой тегов ZVT, предоставляет способ количественной оценки, сочетающий субъективную торговлю
Запустите следующий скрипт:
https://github.com/zvtvz/zvt/blob/master/src/zvt/tasks/init_tag_system.py https://github.com/zvtvz/zvt/blob/master/src/zvt/tasks/stock_pool_runner.py https://github.com/zvtvz/zvt/blob/master/src/zvt/tasks/qmt_data_runner.py https://github.com/zvtvz/zvt/blob/master/src/zvt/tasks/qmt_tick_runner.py
pip install uvicorn
После завершения установки введите zvt_server в командной строке:
zvt_server
Или запустите из кода: https://github.com/zvtvz/zvt/blob/master/src/zvt/zvt_server.py
open http://127.0.0.1:8090/docs
Код переднего плана: https://github.com/zvtvz/zvt_ui
Измените файл среды переднего плана: https://github.com/zvtvz/zvt_ui/blob/main/.env
Установите {your server IP}, то есть адрес службы zvt_server
NEXT_PUBLIC_SERVER = {your server IP}
Затем обратитесь к файлу readme переднего плана, чтобы запустить службу переднего плана.
Откройте http://127.0.0.1:3000/trade
>>> from zvt.domain import Stock, Stock1dHfqKdata
>>> from zvt.ml import MaStockMLMachine
>>> Stock.record_data(provider="em")
>>> entity_ids = ["stock_sz_000001", "stock_sz_000338", "stock_sh_601318"]
>>> Stock1dHfqKdata.record_data(provider="em", entity_ids=entity_ids, sleeping_time=1)
>>> machine = MaStockMLMachine(entity_ids=["stock_sz_000001"], data_provider="em")
>>> machine.train()
>>> machine.predict()
>>> machine.draw_result(entity_id="stock_sz_000001")
Эти несколько строк кода реализуют: сбор данных, постоянное хранение, инкрементное обновление, машинное обучение, прогнозирование, отображение результатов. После ознакомления с основными концепциями системы вы можете применить их к любому объекту торговли на рынке.
>>> from zvt.domain import *
``` **Перевод текста:**
#### Данные о ценных бумагах американских компаний
Stockus.record_data() df = Stockus.query_data(index='code') print(df)
id entity_id timestamp entity_type exchange code name list_date end_date
code A stockus_nyse_A stockus_nyse_A NaT stockus nyse A 安捷伦 None None AA stockus_nyse_AA stockus_nyse_AA NaT stockus nyse AA 美国铝业 None None AAC stockus_nyse_AAC stockus_nyse_AAC NaT stockus nyse AAC Ares Acquisition Corp-A None None ... ... ... ... ... ... ... ... ... ... ZWRK stockus_nasdaq_ZWRK stockus_nasdaq_ZWRK NaT stockus nasdaq ZWRK Z-Work Acquisition Corp-A None None ZY stockus_nasdaq_ZY stockus_nasdaq_ZY NaT stockus nasdaq ZY Zymergen Inc None None ... ... ... ... ... ... ... ... ... ...
[4136 строк x 9 столбцов]
#### Американские ценные бумаги
Stockus.record_data() df = Stockus.query_data(index='code') print(df)
id entity_id timestamp entity_type exchange code name list_date end_date
code A stockus_nyse_A stockus_nyse_A NaT stockus nyse A 安捷伦 None None AA stockus_nyse_AA stockus_nyse_AA NaT stockus nyse AA 美国铝业 None None AAC stockus_nyse_AAC stockus_nyse_AAC NaT stockus nyse AAC Ares Acquisition Corp-A None None AACG stockus_nasdaq_AACG stockus_nasdaq_AACG NaT stockus nasdaq AACG ATA Creativity Global ADR None None AACG stockus_nyse_AACG stockus_nyse_AACG NaT stockus nyse AACG ATA Creativity Global ADR None None ... ... ... ... ... ... ... ... ... ... ZWRK stockus_nasdaq_ZWRK stockus_nasdaq_ZWRK NaT stockus nasdaq ZWRK Z-Work Acquisition Corp-A None None ZY stockus_nasdaq_ZY stockus_nasdaq_ZY NaT stockus nasdaq ZY Zymergen Inc None None ... ... ... ... ... ... ... ... ... ...
[5826 строк x 9 столбцов]
Stockus.query_data(code='AAPL') id entity_id timestamp entity_type exchange code name list_date end_date 0 stockus_nasdaq_AAPL stockus_nasdaq_AAPL None stockus nasdaq AAPL 苹果 None None
#### Гонконгские ценные бумаги
Stockhk.record_data() df = Stockhk.query_data(index='code') print(df)
id entity_id timestamp entity_type exchange code name list_date end_date
code 00001 stockhk_hk_00001 stockhk_hk_00001 NaT stockhk hk 00001 长和 None None 00002 stockhk_hk_00002 stockhk_hk_00002 NaT stockhk hk 00002 中电控股 None None 00003 stockhk_hk_00003 stockhk_hk_00003 NaT stockhk hk 00003 香港中华煤气 None None 00004 stockhk_hk_00004 stockhk_hk_00004 NaT stockhk hk 00004 九龙仓集团 None None 00005 stockhk_hk_00005 stockhk_hk_00005 NaT stockhk hk 00005 汇丰控股 None None ... ... ... ... ... ... ... ... ... ... 09996 stockhk_hk_09996 stockhk_hk_09996 NaT stockhk hk 09996
|---------------------------------------------|------------------|---------------|--------------|--------|--------|-----|------|---------|
| 2007-05-09 | None | 2007-05-09 | 潍柴动力 | 1d | | | | |
| stock_sz_000338_2007-05-10 | stock_sz_000338 | 2007-05-10 | 潍柴动力 | 1d | | | | |
| stock_sz_000338_2007-05-11 | stock_sz_000338 | 2007-05-11 | 潍柴动力 | 1d | | | | |
| ... | ... | ... | ... | ... | ... | ... | | |
| 3426 stock_sz_000338_2021-08-27 | stock_sz_000338 | 2021-08-27 | 潍柴动力 | 1d | | | | |
| 3427 stock_sz_000338_2021-08-30 | stock_sz_000338 | 2021-08-30 | 潍柴动力 | 1d | | | | |
| 3428 stock_sz_000338_2021-08-31 | stock_sz_000338 | 2021-08-31 | 潍柴动力 | 1d | | | | |
| 3429 stock_sz_000338_2021-09-01 | stock_sz_000338 | 2021-09-01 | 潍柴动力 | 1d | | | | |
| 3430 stock_sz_000338_2021-09-02 | stock_sz_000338 | 2021-09-02 | 潍柴动力 | 1d | | | | |
[3431 строка x 15 столбцов]
Примечание: в запросе не хватает контекста, чтобы полностью понять и перевести текст. Однако, исходя из предоставленных данных, можно предположить, что это таблица с финансовыми данными о ценах акций на фондовом рынке. Финансовые факторы
В запросе представлен фрагмент таблицы с финансовыми показателями, такими как базовая прибыль на акцию (basic_eps), общий операционный доход (total_op_income), чистая прибыль (net_profit), рост операционного дохода и чистой прибыли за год (op_income_growth_yoy и net_profit_growth_yoy), рентабельность собственного капитала (roe), коэффициент общей рентабельности (rota), валовая маржа прибыли (gross_profit_margin), маржа чистой прибыли (net_margin) и дата (timestamp).
Данные охватывают период с 2002 по 2021 год. В таблице представлены значения этих показателей для разных дат.
Примечание: в запросе могут быть дополнительные данные, которые не были включены в перевод. Финансовая отчётность: три таблицы
# Актив и пассив баланса
>>> BalanceSheet.record_data(code='000338')
# Отчёт о прибылях и убытках
>>> IncomeStatement.record_data(code='000338')
# Денежный поток
>>> CashFlowStatement.record_data(code='000338')
>>> zvt_context.schemas
[zvt.domain.dividend_financing.DividendFinancing,
zvt.domain.dividend_financing.DividendDetail,
zvt.domain.dividend_financing.SpoDetail...]
zvt_context.schemas — это список схем, которые поддерживаются системой. Схема — это структура данных, которая определяет поля и их значения. Чтобы посмотреть, как работает схема, можно использовать следующие методы:
help() — выводит информацию о схеме.
source code — файлы в папке domain содержат определения схем. Можно посмотреть комментарии к полям.
На основе этих примеров можно понять, как записывать данные в систему:
Schema.record_data(provider='your provider',codes='the codes')
Обратите внимание на параметр provider. Он представляет поставщика данных. У одной схемы может быть несколько поставщиков. Это основа стабильности системы.
Чтобы посмотреть список доступных поставщиков:
>>> Stock.provider_map_recorder
{'joinquant': zvt.recorders.joinquant.meta.jq_stock_meta_recorder.JqChinaStockRecorder,
'exchange': zvt.recorders.exchange.exchange_stock_meta_recorder.ExchangeStockMetaRecorder,
'em': zvt.recorders.em.meta.em_stock_meta_recorder.EMStockRecorder,
'eastmoney': zvt.recorders.eastmoney.meta.eastmoney_stock_meta_recorder.EastmoneyChinaStockListRecorder}
Можно использовать любого поставщика для получения данных. По умолчанию используется первый.
Пример получения данных по акциям:
>>> Block.provider_map_recorder
{'eastmoney': zvt.recorders.eastmoney.meta.eastmoney_block_meta_recorder.EastmoneyChinaBlockRecorder,
'sina': zvt.recorders.sina.meta.sina_block_recorder.SinaBlockRecorder}
>>> Block.record_data(provider='sina')
Block registered recorders:{'eastmoney': <class 'zvt.recorders.eastmoney.meta.china_stock_category_recorder.EastmoneyChinaBlockRecorder'>, 'sina': <class 'zvt.recorders.sina.meta.sina_china_stock_category_recorder.SinaChinaBlockRecorder'>}
2020-03-04 23:56:48,931 INFO MainThread finish record sina blocks:industry
2020-03-04 23:56:49,450 INFO MainThread finish record sina blocks:concept
Дополнительные сведения о методе record_data:
Для обновления данных можно использовать запланированные задачи. Подробнее об этом можно узнать здесь: запланированное обновление.
После того как данные были сохранены с помощью метода query_data, их можно быстро найти локально.
Например, чтобы найти акции с доходностью собственного капитала (roe) более 8% и ростом выручки более 8%, а также с выручкой за прошлый год, можно выполнить следующий запрос:
>>> df=FinanceFactor.query_data(filters=[FinanceFactor.roe>0.08,FinanceFactor.report_period=='year',FinanceFactor.op_income_growth_yoy>0.08],start_timestamp='2019-01-01',order=FinanceFactor.roe.desc(),limit=20,columns=["code"]+FinanceFactor.important_cols(),index='code')
code basic_eps total_op_income net_profit op_income_growth_yoy net_profit_growth_yoy roe rota gross_profit_margin net_margin timestamp
code
000048 000048 2.7350 4.919000e+09 1.101000e+09 0.4311 1.5168 0.7035 0.1988 0.5243 0.2355 2020-04-30
000912 000912 0.3500 4.405000e+09 3.516000e+08 0.1796 1.2363 4.7847 0.0539 0.2175 0.0795 2019-03-20
002207 002207 0.2200 3.021000e+08 5.189000e+07 0.1600 1.1526 1.1175 0.1182 0.1565 0.1718 2020-04-27
002234 002234 5.3300 3.276000e+09 1.610000e+09 0.8023 3.2295 0.8361 0.5469 0.5968 0.4913 2020-04-21
002458 002458 3.7900 3.584000e+09 2.176000e+09 1.4326 4.9973 0.8318 0.6754 0.6537 0.6080 2020-02-20
... ... ... ... ... ... ... ... ... ... ... ...
600701 600701 -3.6858 7.830000e+08 -3.814000e+09 1.3579 -0.0325 1.9498 -0.7012 0.4173 -4.9293 2020-04-29
600747 600747 -1.5600 3.467000e+08 -2.290000e+09 2.1489 -0.4633 3.1922 -1.5886 0.0378 -6.6093 2020-06-30
600793 600793 1.6568 1.293000e+09 1.745000e+08 0.1164 0.8868 0.7490 0.0486 0.1622 0.1350 2019-04-30
600870 600870 0.0087 3.096000e+07 4.554000e+06 0.7773 1.3702 0.7458 0.0724 0.2688 0.1675 2019-03-30
688169 688169 15.6600 4.205000e+09 7.829000e+08 0.3781 1.5452 0.7172 0.4832 0.3612 0.1862 2020-04-28
[20 строк x 11 столбцов]
**Есть ли какие-то данные?**
В тексте приведены числовые значения, но нет информации о том, что они обозначают.
**Как записывать данные?**
Не удалось определить, как именно записываются данные.
**Как запрашивать данные?**
Также не удалось определить способ запроса данных.
* * *
Далее в тексте идёт описание стратегии, которая основана на использовании торговых моделей. В ней используются данные о сделках и событиях, связанных с этими сделками. Стратегия предполагает выполнение определённых действий при наступлении определённых событий.
Текст содержит фрагменты кода на языке Python, который реализует стратегию. Также в тексте есть описание более сложной стратегии, основанной на использовании системы индексов.
Для получения дополнительной информации рекомендуется обратиться к документации по системе. **factor_df**
factor_df — это данные, полученные в результате вычислений трансформатором (transformer) над data_df. В примере используется MacdTransformer().
**Пример:**
| level | high | id | entity_id | open | low | timestamp | close | diff | dea | macd |
|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
| 1d | 54.91 | stock_sh_601318_2019-01-02 | stock_sh_601318 | 54.78 | 53.70 | 2019-01-02 | 53.94 | NaN | NaN | NaN |
| 1d | 55.06 | stock_sh_601318_2019-01-03 | stock_sh_601318 | 53.91 | 53.82 | 2019-01-03 | 54.42 | NaN | NaN | NaN |
| 1d | 55.71 | stock_sh_601318_2019-01-04 | stock_sh_601318 | 54.03 | 53.98 | 2019-01-04 | 55.31 | NaN | NaN | NaN |
И так далее...
**result_df**
result_df — двумерный индекс DataFrame, который можно использовать для выбора акций. Он вычисляется на основе data_df или factor_df.
В этом примере после вычисления macd жёлто-белая линия находится на оси 0, если True, иначе False.
**Пример:**
| score |
|:--:|
| False |
| False |
| False |
| False |
| False |
И так далее…
Формат result_df:
* filter_result принимает значения True или False;
* score_result принимает значение от 0 до 1.
Весь процесс включает в себя выбор акций и тестирование на истории.
**Окружение**
from zvt import * zvt_env {'zvt_home': '/Users/foolcage/zvt-home', 'data_path': '/Users/foolcage/zvt-home/data', 'tmp_path': '/Users/foolcage/zvt-home/tmp', 'ui_path': '/Users/foolcage/zvt-home/ui', 'log_path': '/Users/foolcage/zvt-home/logs'}
zvt_config
* jq_username — имя пользователя для доступа к данным JQ;
* jq_password — пароль для доступа к данным JQ;
* smtp_host — хост почтового сервера;
* smtp_port — порт почтового сервера;
* email_username — учётная запись электронной почты SMTP;
* email_password — пароль электронной почты SMTP;
* wechat_app_id;
* wechat_app_secrect. **init_config(current_config=zvt_config, jq_username='xxx', jq_password='yyy')**
> Универсальный способ настройки: init_config(current_config=zvt_config, **kv).
### Исторические данные
ZVT поддерживает инкрементное обновление данных, пользователи могут совместно использовать исторические данные, что позволяет значительно сэкономить время.
#### Источник данных
> Расчёт новых данных в реальном времени для пользовательского интерфейса основан на источнике данных QMT. Если вам необходимо его использовать, свяжитесь с автором.
Проект поддерживает несколько провайдеров данных. На основе согласованности схем данных можно выбирать и расширять их по мере необходимости. В настоящее время поддерживаются бесплатные данные от таких поставщиков, как «Синьхуаньет», «Дунчай», биржи.
#### При проектировании данных предполагается, что провайдеры адаптируют схему, а не наоборот. Таким образом, даже если один из провайдеров станет недоступен, его можно будет заменить без влияния на использование всей системы.
Однако у бесплатных данных есть очевидные недостатки: нестабильность, трудоёмкость очистки и сбора данных, высокие затраты на обслуживание и возможность внезапной недоступности.
Личное предложение: если вы просто изучаете и исследуете, то можете использовать бесплатные данные; если же вы серьёзно намерены заниматься количественным анализом, лучше выбрать надёжного поставщика данных.
> Большинство бесплатных данных в проекте в настоящее время достаточно стабильны и прошли строгие испытания, особенно данные от «Дунчая», которыми можно пользоваться без опасений.
> Чтобы добавить других поставщиков данных, обратитесь к [руководству по расширению данных](https://zvtvz.github.io/zvt/#/data_extending).
## Разработка
### Клонирование кода
git clone https://github.com/zvtvz/zvt.git
Создайте виртуальную среду проекта (Python >= 3.6), установите зависимости.
pip3 install -r requirements.txt pip3 install pytest
### Тестирование
Импортируйте проект в PyCharm (рекомендуется, но вы также можете использовать другие IDE), затем запустите тесты с помощью pytest.
Большинство функций можно найти в разделе tests.
## Вклад
Мы надеемся, что больше разработчиков присоединятся к разработке zvt. Я постараюсь как можно быстрее рассмотреть PR и своевременно ответить. Но перед отправкой PR убедитесь, что:
1. Пройдены все модульные тесты. Для новых функций добавьте модульные тесты.
2. Соблюдены правила разработки.
3. Обновлены соответствующие документы, если это необходимо.
Также приветствуются разработчики, которые могут предоставить больше примеров для zvt и помочь улучшить документацию.
## Пожертвование автору
Если вы считаете, что проект был полезен для вас, вы можете угостить автора кофе.
<img src="https://raw.githubusercontent.com/zvtvz/zvt/master/docs/imgs/alipay-cn.png" width="25%" alt="Alipay">
<img src="https://raw.githubusercontent.com/zvtvz/zvt/master/docs/imgs/wechat-cn.png" width="25%" alt="Wechat">
## Контакты
Присоединяйтесь к группе WeChat: foolcage, добавив пароль: zvt.
<img src="https://raw.githubusercontent.com/zvtvz/zvt/master/docs/imgs/wechat.jpeg" width="25%" alt="Wechat">
Публичный аккаунт WeChat:
<img src="https://raw.githubusercontent.com/zvtvz/zvt/master/docs/imgs/gongzhonghao.jpg" width="25%" alt="Wechat">
Столбец Zhihu: https://zhuanlan.zhihu.com/automoney
## Спасибо
<p><a href=https://www.jetbrains.com/?from=zvt><img src="https://raw.githubusercontent.com/zvtvz/zvt/master/docs/imgs/jetbrains.png" width="25%" alt="jetbrains"></a></p>
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )