MCPcopy
hub / github.com/zvtvz/zvt

github.com/zvtvz/zvt @v0.13.5 sqlite

repository ↗ · DeepWiki ↗ · release v0.13.5 ↗
1,774 symbols 7,902 edges 413 files 182 documented · 10%
README

github image image image build package Documentation Status codecov.io Downloads

缘起

炒股的三大原理

声明

本项目目前不保证任何向后兼容性,请谨慎升级。
随着作者思想的变化,一些以前觉得重要的东西可能也变得不重要,从而可能不会进行维护。
而一些新的东西的加入对你是否有用,需要自己去评估。

Read this in other languages: English.

详细文档:https://zvt.readthedocs.io/en/latest/

市场模型

ZVT 将市场抽象为如下的模型:

  • TradableEntity (交易标的)
  • ActorEntity (市场参与者)
  • EntityEvent (交易标的 和 市场参与者 发生的事件)

快速开始

安装

python3 -m pip install -U zvt

使用展示

主界面

Dash & Plotly UI

适用于回测和研究,不太适用于实时行情和用户交互

安装完成后,在命令行下输入 zvt

zvt

打开 http://127.0.0.1:8050/

这里展示的例子依赖后面的下载历史数据,数据更新请参考后面文档

系统的核心概念是可视化的,界面的名称与其一一对应,因此也是统一可扩展的。

你可以在你喜欢的ide里编写和运行策略,然后运行界面查看其相关的标的,因子,信号和净值展示。

前后端分离的UI

更灵活和可扩展,更适合于处理实时行情和用户交互,结合ZVT的动态tag系统,提供了一种量化结合主观的交易方式

  • 初始化tag系统

运行以下脚本:

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

  • 安装 uvicorn
pip install uvicorn
  • 运行 zvt server

安装完成后,在命令行下输入 zvt_server

zvt_server

或者从代码运行: https://github.com/zvtvz/zvt/blob/master/src/zvt/zvt_server.py

  • api 文档

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 *

TradableEntity (交易标的)

A股交易标的

>>> Stock.record_data()
>>> df = Stock.query_data(index='code')
>>> print(df)

                     id        entity_id  timestamp entity_type exchange    code   name  list_date end_date
code
000001  stock_sz_000001  stock_sz_000001 1991-04-03       stock       sz  000001   平安银行 1991-04-03     None
000002  stock_sz_000002  stock_sz_000002 1991-01-29       stock       sz  000002  万  科A 1991-01-29     None
000004  stock_sz_000004  stock_sz_000004 1990-12-01       stock       sz  000004   国华网安 1990-12-01     None
000005  stock_sz_000005  stock_sz_000005 1990-12-10       stock       sz  000005   世纪星源 1990-12-10     None
000006  stock_sz_000006  stock_sz_000006 1992-04-27       stock       sz  000006   深振业A 1992-04-27     None
...                 ...              ...        ...         ...      ...     ...    ...        ...      ...
605507  stock_sh_605507  stock_sh_605507 2021-08-02       stock       sh  605507   国邦医药 2021-08-02     None
605577  stock_sh_605577  stock_sh_605577 2021-08-24       stock       sh  605577   龙版传媒 2021-08-24     None
605580  stock_sh_605580  stock_sh_605580 2021-08-19       stock       sh  605580   恒盛能源 2021-08-19     None
605588  stock_sh_605588  stock_sh_605588 2021-08-12       stock       sh  605588   冠石科技 2021-08-12     None
605589  stock_sh_605589  stock_sh_605589 2021-08-10       stock       sh  605589   圣泉集团 2021-08-10     None

[4136 rows x 9 columns]

美股交易标的

>>> 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
ZYME    stockus_nyse_ZYME    stockus_nyse_ZYME       NaT     stockus     nyse  ZYME                Zymeworks Inc      None     None
ZYNE  stockus_nasdaq_ZYNE  stockus_nasdaq_ZYNE       NaT     stockus   nasdaq  ZYNE  Zynerba Pharmaceuticals Inc      None     None
ZYXI  stockus_nasdaq_ZYXI  stockus_nasdaq_ZYXI       NaT     stockus   nasdaq  ZYXI                    Zynex Inc      None     None

[5826 rows x 9 columns]

>>> 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  沛嘉医疗-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

还有更多

>>> 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}

其中key为交易标的的类型,value为其schema,系统为schema提供了统一的 记录(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     None   csindex    scope     1000.00

[30 rows x 12 columns]

EntityEvent (交易标的 发生的事件)

有了交易标的,才有交易标的 发生的事。

行情数据

交易标的 行情schema 遵从如下的规则:

{entity_shema}{level}{adjust_type}Kdata
  • entity_schema

就是前面说的TradableEntity,比如Stock,Stockus等。

  • level
>>> for level in IntervalLevel:
        print(level.value)
  • adjust type
>>> for adjust_type in AdjustType:
        print(adjust_type.value)

注意: 为了兼容历史数据,前复权是个例外,{adjust_type}不填

前复权 ```

Stock1dKdata.record_data(code='000338', provider='em') df = Stock1dKdata.query_data(code='000338', provider='em') print(df)

                          id        entity_id  timestamp provider    code  name level   open  close   high    low     volume      turnover  change_pct  turnover_rate

0 stock_sz_000338_2007-04-30 stock_sz_000338 2007-04-30 None 000338 潍柴动力 1d 2.33 2.00 2.40 1.87 207375.0 1.365189e+09 3.2472 0.1182 1 stock_sz_000338_2007-05-08 stock_sz_000338 2007-05-08 None 000338 潍柴动力 1d 2.11 1.94 2.20 1.87 86299.0 5.563198e+08 -0.0300 0.0492 2 stock_sz_000338_2007-05-09 stock_sz_000338 2007-05-09 None 000338 潍柴动力 1d 1.90 1.81 1.94 1.66 93823.0 5.782065e+08 -0.0670 0.0535 3 stock_sz_000338_2007-05-10 stock_sz_000338 2007-05-10 None 000338 潍柴动力 1d 1.78 1.85 1.98 1.75 47720.0 2.999226e+08 0.0221 0.0272 4 stock_sz_000338_2007-05-11 stock_sz_000338 2007-05-11 None 000338 潍柴动力 1d 1.81 1.73 1.81 1.66 39273.0 2.373126e+08 -0.0649 0.0224 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 3426 stock_sz_000338_2021-08-27 stock_sz_000338 2021-08-27 None 000338 潍柴动力 1d 19.39 20.30 20.30 19.25 1688497.0 3.370241e+09 0.0601 0.0398 3427 stock_sz_000338_2021-08-30 stock_sz_000338 2021-08-30 None 000338 潍柴动力 1d 20.30 20.09 20.31 19.78 1187601.0 2.377957e+09 -0.0103 0.0280 3428 stock_sz_000338_2021-08-31 stock_sz_000338 2021-08-31 None 000338 潍柴动力 1d 20.20 20.07 20.63 19.70 1143985.0 2.295195e+09 -0.0010 0.0270 3429 stock_sz_000338_2021-09-01 stock_sz_000338 2021-09-01 None 000338 潍柴动力 1d 19.98 19.68 19.98 19.15 1218697.0 2.383841e+09 -0.0194 0.0287 3430 stock_sz_000338_2021-09-02 stock_sz_000338 2021-09-02 None 000338 潍柴动力 1d 19.71 19.85 19.97 19.24 1023545.0 2.012006e+09 0.0086 0.0241

[3431 rows x 15 columns]

Stockus1dKdata.record_data(code='AAPL', provider='em') df = Stockus1dKdata.query_data(code='AAPL', provider='em') print(df)

                              id            entity_id  timestamp provider  code

Core symbols most depended-on inside this repo

query_data
called by 240
src/zvt/contract/schema.py
to_pd_timestamp
called by 148
src/zvt/utils/time_utils.py
pd_is_not_null
called by 133
src/zvt/utils/pd_utils.py
to_date_time_str
called by 88
src/zvt/utils/time_utils.py
register_schema
called by 76
src/zvt/contract/register.py
df_to_db
called by 72
src/zvt/contract/api.py
now_pd_timestamp
called by 69
src/zvt/utils/time_utils.py
current_date
called by 50
src/zvt/utils/time_utils.py

Shape

Function 659
Method 624
Class 438
Route 53

Languages

Python100%

Modules by API surface

src/zvt/rest/work.py58 symbols
src/zvt/contract/factor.py49 symbols
src/zvt/contract/drawer.py42 symbols
src/zvt/recorders/em/em_api.py40 symbols
src/zvt/contract/schema.py37 symbols
src/zvt/trader/trader.py33 symbols
src/zvt/factors/algorithm.py32 symbols
src/zvt/contract/recorder.py31 symbols
src/zvt/tag/tag_service.py30 symbols
src/zvt/tag/tag_models.py29 symbols
src/zvt/broker/qmt/qmt_account.py28 symbols
src/zvt/tag/tag_utils.py27 symbols

Dependencies from manifests, versioned

SQLAlchemy2.0.36 · 1×
apscheduler3.10.4 · 1×
arrow1.3.0 · 1×
dash2.18.2 · 1×
dash-bootstrap-components1.3.1 · 1×
dash_daq0.5.0 · 1×
demjson33.0.6 · 1×
eastmoneypy0.2.0 · 1×
fastapi0.110.0 · 1×
fastapi-pagination0.12.23 · 1×
jqdatapy0.1.8 · 1×
numpy2.1.3 · 1×

For agents

$ claude mcp add zvt \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact