Происхождение ZVT
Три основных принципа торговли акциями
Декларация
В настоящее время этот проект не гарантирует обратной совместимости, поэтому будьте осторожны при обновлении. По мере развития мыслей автора некоторые вещи, которые когда-то считались важными, могут стать менее значимыми и, следовательно, не поддерживаться. Нужно самостоятельно оценивать, будет ли полезно добавление некоторых новых элементов.
Читайте это на других языках: 中文.
Прочитайте документацию:https://zvt.readthedocs.io/en/latest/
python3 -m pip install -U zvt
Подходит для бэктестинга и исследований, но не применим для данных в реальном времени и взаимодействия с пользователем.
После завершения установки введите zvt в командной строке
zvt
откройте http://127.0.0.1:8050/
Приведённый здесь пример опирается на данные, фактор, трейдер, пожалуйста, прочитайте документацию.
Основная концепция системы визуальна, и название интерфейса соответствует ей один к одному, так что оно также единообразно и расширяемо.
Вы можете написать и запустить стратегию в своём любимом ide, а затем просмотреть связанные с ней цели, факторы, сигналы и производительность в пользовательском интерфейсе.
Более гибкий и масштабируемый, больше подходит для обработки данных в реальном времени и взаимодействия с пользователями. В сочетании с динамической системой тегов, предоставляемой 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
откройте http://127.0.0.1:8090/docs
Исходный код внешнего интерфейса: https://github.com/zvtvz/zvt_ui
Измените файл env: https://github.com/zvtvz/zvt_ui/blob/main/.env
Установите {ваш IP-адрес сервера} на IP-адрес zvt_сервера
NEXT_PUBLIC_SERVER = {your server IP}
Затем обратитесь к README внешнего интерфейса, чтобы запустить службу внешнего интерфейса.
откройте http://127.0.0.1:3000/trade
>>> from zvt.domain import Stock, Stock1dHfqKdata **Перевод текста:**
exchange code name list_date end_date 0 stockus_nasdaq_AAPL stockus_nasdaq_AAPL None stockus nasdaq AAPL 苹果 None None
#### Hong Kong stock
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 沛嘉医疗-B None None 09997 stockhk_hk_09997 stockhk_hk_09997 NaT stockhk hk 09997 康基医疗 None None 09998 stockhk_hk_09998 stockhk_hk_09998 NaT stockhk hk 09998 光荣控股 None None 09999 stockhk_hk_09999 stockhk_hk_09999 NaT stockhk hk 09999 网易-S None None 80737 stockhk_hk_80737 stockhk_hk_80737 NaT stockhk hk 80737 湾区发展-R None None
[2597 rows x 9 columns]
df[df.code=='00700']
id entity_id timestamp entity_type exchange code name list_date end_date
2112 stockhk_hk_00700 stockhk_hk_00700 None stockhk hk 00700 腾讯控股 None None
#### And more
from zvt.contract import * zvt_context.tradable_schema_map
{'stockus': zvt.domain.meta.stockus_meta.Stockus, 'stockhk': zvt.domain.meta.stockhk_meta.Stockhk, 'index': zvt.domain.meta.index_meta.Index, 'etf': zvt.domain.meta.etf_meta.Etf, 'stock': zvt.domain.meta.stock_meta.Stock, 'block': zvt.domain.meta.block_meta.Block, 'fund': zvt.domain.meta.fund_meta.Fund}
Ключ — это тип торгуемой сущности, а значение — схема. Система предоставляет унифицированные методы **записи (record_data)** и **запроса (query_data)** для схемы.
Index.record_data() df=Index.query_data(filters=[Index.category=='scope',Index.exchange='sh']) print(df) id entity_id timestamp entity_type exchange code name list_date end_date publisher category base_point 0 index_sh_000001 index_sh_000001 1990-12-19 index sh 000001 上证指数 1991-07-15 None csindex scope 100.00 1 index_sh_000002 index_sh_000002 1990-12-19 index sh 000002 A股指数 1992-02-21 None csindex scope 100.00 2 index_sh_000003 index_sh_000003 1992-02-21 index sh 000003 B股指数 1992-08-17 None csindex scope 100.00 3 index_sh_000010 index_sh_000010 2002-06-28 index sh 000010 上证180 2002-07-01 None csindex scope 3299.06 4 index_sh_000016 index_sh_000016 2003-12-31 index sh 000016 上证50 2004-01-02 None csindex scope 1000.00 .. ... ... ... ... ... ... ... ... ... ... ... ... 25 index_sh_000020 index_sh_000020 2007-12-28 index sh 000020 中型综指 2008-05-12 None csindex scope 1000.00 26 index_sh_000090 index_sh_000090 2009-12-31 index sh 000090 上证流通 2010-12-02 None csindex scope 1000.00 27 index_sh_930903 index_sh_930903 2012-12-31 index sh 930903 中证A股 2016-10-18 None csindex scope 1000.00 28 index_sh_000688 index_sh_000688 2019-12-31 index sh 000688 科创50 2020-07-23 None csindex scope 1000.00 29 index_sh_931643 index_sh_931643 2019-12-31 index sh 931643 科创创业50 2021-06-01
Примечание: в тексте запроса присутствуют фрагменты кода на языке Python, которые не были переведены. Что за данные представлены?
В тексте представлен фрагмент кода на языке Python, который выполняет запрос к базе данных с финансовыми показателями компаний. В результате запроса получается таблица с данными о различных финансовых показателях для ряда компаний.
Как записываются данные?
Данные записываются в базу данных при помощи кода на Python.
Как запросить данные?
Запрос данных осуществляется при помощи функции query_data() класса FinanceFactor. Запрос фильтрует данные по определённым условиям и возвращает только соответствующие им строки таблицы.
if self.entity_ids: filters = filters + [StockActorSummary.entity_id.in_(self.entity_ids)]
df = StockActorSummary.query_data(filters=filters)
if pd_is_not_null(df): self.logger.info(f'{df}') self.finish_date = recent_report_date
long_df = df[df['change_ratio'] > 0.05] short_df = df[df['change_ratio'] < -0.5] try: self.trade_the_targets(due_timestamp=timestamp, happen_timestamp=timestamp, long_selected=set(long_df['entity_id'].to_list()), short_selected=set(short_df['entity_id'].to_list())) except Exception as e: self.logger.error(e)
Это похоже на язык Python.
Основной язык текста запроса — Python. **2019-01-03 1d 55.06 stock_sh_601318_2019-01-03 stock_sh_601318 53.91 53.82 2019-01-03 54.42 NaN NaN NaN**
**2019-01-04 1d 55.71 stock_sh_601318_2019-01-04 stock_sh_601318 54.03 53.98 2019-01-04 55.31 NaN NaN NaN**
**2019-01-07 1d 55.88 stock_sh_601318_2019-01-07 stock_sh_601318 55.80 54.64 2019-01-07 55.03 NaN NaN NaN**
**2019-01-08 1d 54.83 stock_sh_601318_2019-01-08 stock_sh_601318 54.79 53.96 2019-01-08 54.54 NaN NaN NaN**
... ... ... ... ... ... ... ... ... ... ... ...
**stock_sz_000338 2019-06-03 1d 11.04 stock_sz_000338_2019-06-03 stock_sz_000338 10.93 10.74 2019-06-03 10.81 -0.121336 -0.145444 0.048215**
**2019-06-04 1d 10.85 stock_sz_000338_2019-06-04 stock_sz_000338 10.84 10.57 2019-06-04 10.73 -0.133829 -0.143121 0.018583**
**2019-06-05 1d 10.92 stock_sz_000338_2019-06-05 stock_sz_000338 10.87 10.59 2019-06-05 10.59 -0.153260 -0.145149 -0.016223**
**2019-06-06 1d 10.71 stock_sz_000338_2019-06-06 stock_sz_000338 10.59 10.49 2019-06-06 10.65 -0.161951 -0.148509 -0.026884**
**2019-06-10 1d 11.05 stock_sz_000338_2019-06-10 stock_sz_000338 10.73 10.71 2019-06-10 11.02 -0.137399 -0.146287 0.017776**
[208 rows x 11 columns]
### result_df
**two-dimensional index** DataFrame which calculating using factor_df or(and) data_df.
It's used by TargetSelector.
e.g.,[macd](https://github.com/zvtvz/zvt/blob/master/src/zvt/factors/technical_factor.py#L56)
In [14]: factor.result_df Out[14]: filter_result entity_id timestamp stock_sh_601318 2019-01-02 False 2019-01-03 False 2019-01-04 False 2019-01-07 False 2019-01-08 False ... ... stock_sz_000338 2019-06-03 False 2019-06-04 False 2019-06-05 False 2019-06-06 False 2019-06-10 False
[208 rows x 1 columns]
The format of result_df is as follows:
<p align="center"><img src='https://raw.githubusercontent.com/zvtvz/zvt/master/docs/imgs/result_df.png'/></p>
filter_result is True or False, score_result is from 0 to 1
Combining the stock picker and backtesting, the whole process is as follows:
<p align="center"><img src='https://raw.githubusercontent.com/zvtvz/zvt/master/docs/imgs/flow.png'/></p>
## Env settings(optional)
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_password 聚宽数据密码
* smtp_host 邮件服务器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')
> config others this way: init_config(current_config=zvt_config, **kv)
### History data
ZVT supports incremental data updates, and sharing historical data among users is encouraged for time-saving efficiency
#### Data providers
> The new UI's real-time quotes are based on the QMT data source. To obtain access, please contact the author.
the data could be updated from different provider, this make the system stable.
> add other providers, [Data extension tutorial](https://zvtvz.github.io/zvt/#/data_extending)
## Development
### Clone
git clone https://github.com/zvtvz/zvt.git
set up virtual env(python>=3.8),install requirements
pip3 install -r requirements.txt pip3 install pytest
### Tests
```shell
pytest ./tests --ignore=tests/recorders/
Most of the
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )