Coder Social home page Coder Social logo

zvtvz / zvt Goto Github PK

View Code? Open in Web Editor NEW
3.0K 133.0 838.0 42.78 MB

modular quant framework.

Home Page: https://zvt.readthedocs.io/en/latest/

License: MIT License

Shell 0.14% Python 98.40% CSS 1.46%
stock quant fintech trading-platform technical-analysis cryptocurrency fundamental-analysis algorithmic-trading trading-strategies backtesting

zvt's Introduction

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

Read this in other languages: 中文.

Read the docs:https://zvt.readthedocs.io/en/latest/

Install

python3 -m pip install -U zvt

Main ui

After the installation is complete, enter zvt on the command line

zvt

open http://127.0.0.1:8050/

The example shown here relies on data, factor, trader, please read docs

The core concept of the system is visual, and the name of the interface corresponds to it one-to-one, so it is also uniform and extensible.

You can write and run the strategy in your favorite ide, and then view its related targets, factor, signal and performance on the UI.

Behold, the power of zvt:

>>> 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")

The few lines of code above has done: data capture, persistence, incremental update, machine learning, prediction, and display results. Once you are familiar with the core concepts of the system, you can apply it to any target in the market.

Data

China stock

>>> from zvt.domain import *
>>> Stock.record_data(provider="em")
>>> df = Stock.query_data(provider="em", 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]

USA stock

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

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}

The key is tradable entity type, and the value is the schema. The system provides unified record (record_data) and query (query_data) methods for the schema.

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

We have tradable entity and then events about them.

Market quotes

the TradableEntity quote schema follows the following rules:

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

TradableEntity class,e.g., Stock,Stockus.

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

Note: In order to be compatible with historical data, the pre-reset is an exception, {adjust_type} is left empty

qfq

>>> 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 name level    open   close    high     low      volume      turnover  change_pct  turnover_rate
0     stockus_nasdaq_AAPL_1984-09-07  stockus_nasdaq_AAPL 1984-09-07     None  AAPL   苹果    1d   -5.59   -5.59   -5.58   -5.59   2981600.0  0.000000e+00      0.0000         0.0002
1     stockus_nasdaq_AAPL_1984-09-10  stockus_nasdaq_AAPL 1984-09-10     None  AAPL   苹果    1d   -5.59   -5.59   -5.58   -5.59   2346400.0  0.000000e+00      0.0000         0.0001
2     stockus_nasdaq_AAPL_1984-09-11  stockus_nasdaq_AAPL 1984-09-11     None  AAPL   苹果    1d   -5.58   -5.58   -5.58   -5.58   5444000.0  0.000000e+00      0.0018         0.0003
3     stockus_nasdaq_AAPL_1984-09-12  stockus_nasdaq_AAPL 1984-09-12     None  AAPL   苹果    1d   -5.58   -5.59   -5.58   -5.59   4773600.0  0.000000e+00     -0.0018         0.0003
4     stockus_nasdaq_AAPL_1984-09-13  stockus_nasdaq_AAPL 1984-09-13     None  AAPL   苹果    1d   -5.58   -5.58   -5.58   -5.58   7429600.0  0.000000e+00      0.0018         0.0004
...                              ...                  ...        ...      ...   ...  ...   ...     ...     ...     ...     ...         ...           ...         ...            ...
8765  stockus_nasdaq_AAPL_2021-08-27  stockus_nasdaq_AAPL 2021-08-27     None  AAPL   苹果    1d  147.48  148.60  148.75  146.83  55802388.0  8.265452e+09      0.0072         0.0034
8766  stockus_nasdaq_AAPL_2021-08-30  stockus_nasdaq_AAPL 2021-08-30     None  AAPL   苹果    1d  149.00  153.12  153.49  148.61  90956723.0  1.383762e+10      0.0304         0.0055
8767  stockus_nasdaq_AAPL_2021-08-31  stockus_nasdaq_AAPL 2021-08-31     None  AAPL   苹果    1d  152.66  151.83  152.80  151.29  86453117.0  1.314255e+10     -0.0084         0.0052
8768  stockus_nasdaq_AAPL_2021-09-01  stockus_nasdaq_AAPL 2021-09-01     None  AAPL   苹果    1d  152.83  152.51  154.98  152.34  80313711.0  1.235321e+10      0.0045         0.0049
8769  stockus_nasdaq_AAPL_2021-09-02  stockus_nasdaq_AAPL 2021-09-02     None  AAPL   苹果    1d  153.87  153.65  154.72  152.40  71171317.0  1.093251e+10      0.0075         0.0043

[8770 rows x 15 columns]

hfq

>>> Stock1dHfqKdata.record_data(code='000338', provider='em')
>>> df = Stock1dHfqKdata.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   70.00   64.93   71.00   62.88   207375.0  1.365189e+09      2.1720         0.1182
1     stock_sz_000338_2007-05-08  stock_sz_000338 2007-05-08     None  000338  潍柴动力    1d   66.60   64.00   68.00   62.88    86299.0  5.563198e+08     -0.0143         0.0492
2     stock_sz_000338_2007-05-09  stock_sz_000338 2007-05-09     None  000338  潍柴动力    1d   63.32   62.00   63.88   59.60    93823.0  5.782065e+08     -0.0313         0.0535
3     stock_sz_000338_2007-05-10  stock_sz_000338 2007-05-10     None  000338  潍柴动力    1d   61.50   62.49   64.48   61.01    47720.0  2.999226e+08      0.0079         0.0272
4     stock_sz_000338_2007-05-11  stock_sz_000338 2007-05-11     None  000338  潍柴动力    1d   61.90   60.65   61.90   59.70    39273.0  2.373126e+08     -0.0294         0.0224
...                          ...              ...        ...      ...     ...   ...   ...     ...     ...     ...     ...        ...           ...         ...            ...
3426  stock_sz_000338_2021-08-27  stock_sz_000338 2021-08-27     None  000338  潍柴动力    1d  331.97  345.95  345.95  329.82  1688497.0  3.370241e+09      0.0540         0.0398
3427  stock_sz_000338_2021-08-30  stock_sz_000338 2021-08-30     None  000338  潍柴动力    1d  345.95  342.72  346.10  337.96  1187601.0  2.377957e+09     -0.0093         0.0280
3428  stock_sz_000338_2021-08-31  stock_sz_000338 2021-08-31     None  000338  潍柴动力    1d  344.41  342.41  351.02  336.73  1143985.0  2.295195e+09     -0.0009         0.0270
3429  stock_sz_000338_2021-09-01  stock_sz_000338 2021-09-01     None  000338  潍柴动力    1d  341.03  336.42  341.03  328.28  1218697.0  2.383841e+09     -0.0175         0.0287
3430  stock_sz_000338_2021-09-02  stock_sz_000338 2021-09-02     None  000338  潍柴动力    1d  336.88  339.03  340.88  329.67  1023545.0  2.012006e+09      0.0078         0.0241

[3431 rows x 15 columns]

Finance factor

>>> FinanceFactor.record_data(code='000338')
>>> FinanceFactor.query_data(code='000338',columns=FinanceFactor.important_cols(),index='timestamp')

            basic_eps  total_op_income    net_profit  op_income_growth_yoy  net_profit_growth_yoy     roe    rota  gross_profit_margin  net_margin  timestamp
timestamp
2002-12-31        NaN     1.962000e+07  2.471000e+06                   NaN                    NaN     NaN     NaN               0.2068      0.1259 2002-12-31
2003-12-31       1.27     3.574000e+09  2.739000e+08              181.2022               109.8778  0.7729  0.1783               0.2551      0.0766 2003-12-31
2004-12-31       1.75     6.188000e+09  5.369000e+08                0.7313                 0.9598  0.3245  0.1474               0.2489      0.0868 2004-12-31
2005-12-31       0.93     5.283000e+09  3.065000e+08               -0.1463                -0.4291  0.1327  0.0603               0.2252      0.0583 2005-12-31
2006-03-31       0.33     1.859000e+09  1.079000e+08                   NaN                    NaN     NaN     NaN                  NaN      0.0598 2006-03-31
...               ...              ...           ...                   ...                    ...     ...     ...                  ...         ...        ...
2020-08-28       0.59     9.449000e+10  4.680000e+09                0.0400                -0.1148  0.0983  0.0229               0.1958      0.0603 2020-08-28
2020-10-31       0.90     1.474000e+11  7.106000e+09                0.1632                 0.0067  0.1502  0.0347               0.1949      0.0590 2020-10-31
2021-03-31       1.16     1.975000e+11  9.207000e+09                0.1327                 0.0112  0.1919  0.0444               0.1931      0.0571 2021-03-31
2021-04-30       0.42     6.547000e+10  3.344000e+09                0.6788                 0.6197  0.0622  0.0158               0.1916      0.0667 2021-04-30
2021-08-31       0.80     1.264000e+11  6.432000e+09                0.3375                 0.3742  0.1125  0.0287               0.1884      0.0653 2021-08-31

[66 rows x 10 columns]

Three financial tables

>>> BalanceSheet.record_data(code='000338')
>>> IncomeStatement.record_data(code='000338')
>>> CashFlowStatement.record_data(code='000338')

And more

>>> zvt_context.schemas
[zvt.domain.dividend_financing.DividendFinancing,
 zvt.domain.dividend_financing.DividendDetail,
 zvt.domain.dividend_financing.SpoDetail...]

All schemas is registered in zvt_context.schemas, schema is table, data structure. The fields and meaning could be checked in following ways:

  • help

type the schema. and press tab to show its fields or .help()

>>> FinanceFactor.help()
  • source code

Schemas defined in domain

From above examples, you should know the unified way of recording data:

Schema.record_data(provider='your provider',codes='the codes')

Note the optional parameter provider, which represents the data provider. A schema can have multiple providers, which is the cornerstone of system stability.

Check the provider has been implemented:

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

You can use any provider to get the data, the first one is used by default.

One more example, the stock sector data recording:

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

Learn more about record_data

  • The parameter code[single], codes[multiple] represent the stock codes to be recorded
  • Recording the whole market if not set code, codes
  • This method will store the data locally and only do incremental updates

Refer to the scheduling recoding waydata runner

Market-wide stock selection

After recording the data of the whole market, you can quickly query the required data locally.

An example: the top 20 stocks with roe>8% and revenue growth>8% in the 2018 annual report

>>> 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 rows x 11 columns]

So, you should be able to answer the following three questions now:

  • What data is there?
  • How to record data?
  • How to query data?

For more advanced usage and extended data, please refer to the data section in the detailed document.

Write strategy

Now we could write strategy basing on TradableEntity and EntityEvent. The so-called strategy backtesting is nothing but repeating the following process:

At a certain time, find the targets which matching conditions, buy and sell them, and see the performance.

Two modes to write strategy:

  • solo (free style)

At a certain time, calculate conditions according to the events, buy and sell

  • formal (正式的)

The calculation model of the two-dimensional index and multi-entity

a too simple,sometimes naive person (solo)

Well, this strategy is really too simple,sometimes naive, as we do most of the time.

When the report comes out, I look at the report. If the institution increases its position by more than 5%, I will buy it, and if the institution reduces its position by more than 50%, I will sell it.

Show you the code:

# -*- coding: utf-8 -*-
import pandas as pd

from zvt.api import get_recent_report_date
from zvt.contract import ActorType, AdjustType
from zvt.domain import StockActorSummary, Stock1dKdata
from zvt.trader import StockTrader
from zvt.utils import pd_is_not_null, is_same_date, to_pd_timestamp


class FollowIITrader(StockTrader):
    finish_date = None

    def on_time(self, timestamp: pd.Timestamp):
        recent_report_date = to_pd_timestamp(get_recent_report_date(timestamp))
        if self.finish_date and is_same_date(recent_report_date, self.finish_date):
            return
        filters = [StockActorSummary.actor_type == ActorType.raised_fund.value,
                   StockActorSummary.report_date == recent_report_date]

        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)


if __name__ == '__main__':
    entity_id = 'stock_sh_600519'
    Stock1dKdata.record_data(entity_id=entity_id, provider='em')
    StockActorSummary.record_data(entity_id=entity_id, provider='em')
    FollowIITrader(start_timestamp='2002-01-01', end_timestamp='2021-01-01', entity_ids=[entity_id],
                   provider='em', adjust_type=AdjustType.qfq, profit_threshold=None).run()

So, writing a strategy is not that complicated. Just use your imagination, find the relation of the price and the events.

Then refresh http://127.0.0.1:8050/,check the performance of your strategy.

More examples is in Strategy example

Be serious (formal)

Simple calculation can be done through query_data. Now it's time to introduce the two-dimensional index multi-entity calculation model.

Takes technical factors as an example to illustrate the calculation process:

In [7]: from zvt.factors.technical_factor import *
In [8]: factor = BullFactor(codes=['000338','601318'],start_timestamp='2019-01-01',end_timestamp='2019-06-10', transformer=MacdTransformer())

data_df

two-dimensional index DataFrame read from the schema by query_data.

In [11]: factor.data_df
Out[11]:
                           level   high                          id        entity_id   open    low  timestamp  close
entity_id       timestamp
stock_sh_601318 2019-01-02    1d  54.91  stock_sh_601318_2019-01-02  stock_sh_601318  54.78  53.70 2019-01-02  53.94
                2019-01-03    1d  55.06  stock_sh_601318_2019-01-03  stock_sh_601318  53.91  53.82 2019-01-03  54.42
                2019-01-04    1d  55.71  stock_sh_601318_2019-01-04  stock_sh_601318  54.03  53.98 2019-01-04  55.31
                2019-01-07    1d  55.88  stock_sh_601318_2019-01-07  stock_sh_601318  55.80  54.64 2019-01-07  55.03
                2019-01-08    1d  54.83  stock_sh_601318_2019-01-08  stock_sh_601318  54.79  53.96 2019-01-08  54.54
...                          ...    ...                         ...              ...    ...    ...        ...    ...
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
                2019-06-04    1d  10.85  stock_sz_000338_2019-06-04  stock_sz_000338  10.84  10.57 2019-06-04  10.73
                2019-06-05    1d  10.92  stock_sz_000338_2019-06-05  stock_sz_000338  10.87  10.59 2019-06-05  10.59
                2019-06-06    1d  10.71  stock_sz_000338_2019-06-06  stock_sz_000338  10.59  10.49 2019-06-06  10.65
                2019-06-10    1d  11.05  stock_sz_000338_2019-06-10  stock_sz_000338  10.73  10.71 2019-06-10  11.02

[208 rows x 8 columns]

factor_df

two-dimensional index DataFrame which calculating using data_df by transformer e.g., MacdTransformer.

In [12]: factor.factor_df
Out[12]:
                           level   high                          id        entity_id   open    low  timestamp  close      diff       dea      macd
entity_id       timestamp
stock_sh_601318 2019-01-02    1d  54.91  stock_sh_601318_2019-01-02  stock_sh_601318  54.78  53.70 2019-01-02  53.94       NaN       NaN       NaN
                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

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:

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:

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(optional)

baidu: https://pan.baidu.com/s/1kHAxGSxx8r5IBHe5I7MAmQ code: yb6c

google drive: https://drive.google.com/drive/folders/17Bxijq-PHJYrLDpyvFAm5P6QyhKL-ahn?usp=sharing

It contains daily/weekly post-restoration data, stock valuations, fund and its holdings data, financial data and other data.

Unzip the downloaded data to the data_path of the your environment (all db files are placed in this directory, there is no hierarchical structure)

The data could be updated incrementally. Downloading historical data is just to save time. It is also possible to update all by yourself.

Joinquant(optional)

the data could be updated from different provider, this make the system stable.

https://www.joinquant.com/default/index/sdk?channelId=953cbf5d1b8683f81f0c40c9d4265c0d

add other providers, Data extension tutorial

Development

Clone

git clone https://github.com/zvtvz/zvt.git

set up virtual env(python>=3.6),install requirements

pip3 install -r requirements.txt
pip3 install pytest

Tests

pytest ./tests

Most of the features can be referenced from the tests

Contribution

code of conduct

  1. Pass all unit tests, if it is a new feature, please add a new unit test for it
  2. Compliance with development specifications
  3. If necessary, please update the corresponding document

Developers are also very welcome to provide more examples for zvt, and work together to improve the documentation.

Buy me a coffee

Alipay      Wechat

Contact

wechat:foolcage
Wechat


wechat subscription:
Wechat

zhihu:
https://zhuanlan.zhihu.com/automoney

Thanks

jetbrains

zvt's People

Contributors

1216945411 avatar 140619 avatar 879051553 avatar buginux avatar eromoe avatar foolcage avatar godlikedad avatar gunsfirerose911 avatar hogwartsrico avatar licq201 avatar loveher147 avatar manstiilin avatar mili-li avatar nobodyet avatar otizis avatar ryanrussell avatar scanfyu avatar shiyup avatar stellar2016 avatar stone64 avatar tinybug avatar valley-joker avatar wanyy15083 avatar wisfern avatar wuhgogo avatar xieqiwen1993 avatar ybz94 avatar yeyang521 avatar yinianfangxia avatar zhoujunjie221 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

zvt's Issues

类语法错误 class ZenFactor -> def __init__

class ZenFactor(TechnicalFactor):
def init(self, data_schema: List[str], entity_ids: str = None, entity_type: List[str] = 'stock',
exchanges: List[str] = ['sh', 'sz'], codes: Union[str, pd.Timestamp] = None,
the_timestamp: Union[str, pd.Timestamp] = None, start_timestamp: Union[str, pd.Timestamp] = None,
end_timestamp: List = None, columns: List = None, filters: object = None, order: int = None,
limit: str = None, provider: Union[str, IntervalLevel] = 'eastmoney',
level: str = IntervalLevel.LEVEL_1DAY, category_field: str = 'entity_id',
time_field: int = 'timestamp', computing_window: bool = 250, keep_all_timestamp: str = False,
fill_method: int = 'ffill', effective_number: bool = 10, transformer: bool = None -> None:
self.factor_schema = get_zen_factor_schema(entity_type=entity_type, level=level)

Installation fails due to conflicting pandas version

Hi, users are unable to run Zvt due to dependency conflict with pandas package. As shown in the following full dependency graph of Zvt, Zvt requires pandas >=0.24.2,while jqdatasdk * requires pandas <=0.25.3,>=0.16.2.

According to pip’s “first found wins” installation strategy, pandas 1.0.3 is the actually installed version. However, pandas 1.0.3 does not satisfy pandas <=0.25.3,>=0.16.2.

Dependency tree-----------

zvt - 0.7.8
| +- apscheduler(install version:3.6.3 version range:>=3.4.0)
| | +- pytz(install version:2019.3 version range:*)
| | +- setuptools(install version:46.1.3 version range:>=0.7)
| | +- six(install version:1.14.0 version range:>=1.4.0)
| | +- tzlocal(install version:2.1b1 version range:>=1.2)
| +- arrow(install version:0.15.5 version range:>=0.11.0)
| | +- backports.functools-lru-cache(install version:1.6.1 version range:>=1.2.1)
| | +- python-dateutil(install version:2.8.1 version range:*)
| +- ccxt(install version:1.26.23 version range:>=1.17.191)
| +- demjson(install version:2.2.4 version range:>=2.2.4)
| +- html5lib(install version:1.0 version range:>=1.0.1)
| | +- six(install version:1.14.0 version range:>=1.9)
| | +- webencodings(install version:0.5.1 version range:*)
| +- jqdatasdk(install version:1.8.1 version range:*)
| | +- msgpack(install version:1.0.0 version range:>=0.4.7)
| | +- numpy(install version:1.18.2 version range:>=1.9.2)
| | +- pandas(install version:0.25.3 version range:<=0.25.3,>=0.16.2)
| | +- pymysql(install version:0.9.3 version range:>=0.7.6)
| | +- requests(install version:2.23.0 version range:*)
| | | +- certifi(install version:2020.4.5.1 version range:>=2017.4.17)
| | | +- chardet(install version:3.0.4 version range:>=3.0.2,<4)
| | | +- idna(install version:2.9 version range:>=2.5,<3)
| | | +- urllib3(install version:1.25.9 version range:>=1.21.1,<1.26)
| | +- six(install version:1.14.0 version range:*)
| | +- SQLAlchemy(install version:1.3.16 version range:>=1.2.8)
| | +- thriftpy2(install version:0.4.11 version range:>=0.3.9)
| | | +- ply(install version:3.11 version range:>=3.4,<4.0)
| +- marshmallow(install version:3.5.1 version range:>=3.2.2)
| +- marshmallow-sqlalchemy(install version:0.22.3 version range:>=0.19.0)
| | +- marshmallow(install version:3.5.1 version range:>=2.15.2)
| | +- SQLAlchemy(install version:1.3.16 version range:>=1.2.0)
| +- pandas(install version:1.0.3 version range:>=0.24.2)
| +- plotly(install version:4.6.0 version range:>=4.1.0)
| | +- retrying(install version:1.3.3 version range:>=1.3.3)
| | | +- six(install version:1.14.0 version range:>=1.7.0)
| | +- six(install version:1.14.0 version range:*)
| +- requests(install version:2.23.0 version range:>=2.20.1)
| | +- certifi(install version:2020.4.5.1 version range:>=2017.4.17)
| | +- chardet(install version:3.0.4 version range:>=3.0.2,<4)
| | +- idna(install version:2.9 version range:>=2.5,<3)
| | +- urllib3(install version:1.25.9 version range:>=1.21.1,<1.26)
| +- schedule(install version:0.6.0 version range:>=0.6.0)
| +- simplejson(install version:3.17.0 version range:>=3.16.0)
| +- sqlalchemy(install version:1.3.16 version range:>=1.2.14)
| +- tzlocal(install version:2.1b1 version range:>=1.5.1)
| +- xlrd(install version:1.2.0 version range:>=1.1.0)
| +- zvdata(install version:1.2.3 version range:>=1.2.3)

Thanks for your help.
Best,
Neolith

[data]北向资金(沪深港通)持股数据

class HkHolder(HolderBase, Mixin):
    __tablename__ = 'hk_holder'
    # 股票代码
    code = Column(String(length=32))
    # 股票名称
    name = Column(String(length=32))

    # 市场通编码	三种类型:310001-沪股通,310002-深股通,310005-港股通
    holder_code = Column(String(length=32))
    # 市场通名称	三种类型:沪股通,深股通,港股通
    holder_name = Column(String(length=32))

    # 持股数量
    share_number = Column(Float)
    # 持股比例
    share_ratio = Column(Float)
  • implement recorder

https://github.com/zvtvz/zvt/blob/master/zvt/recorders/joinquant/misc/joinquant_hk_holder_recorder.py

  • use in zvt

下载数据

from zvt.domain import *
HkHolder.record_data(provider='joinquant')

使用例子,最新的持仓比例前50

In [13]: df=HkHolder.query_data(start_timestamp='2020-08-07',order=HkHolder.share_ratio.desc(),limit=50,provider='joinquant',columns=['code','name','share_ratio'])

In [14]: df
Out[14]:
      code  name  share_ratio  timestamp
0   600009  上海机场        22.99 2020-08-07
1   603489  八方股份        22.97 2020-08-07
2   603501  韦尔股份        22.16 2020-08-07
3   002572   索菲亚        20.07 2020-08-07
4   300012  华测检测        19.93 2020-08-07
5   600201  生物股份        18.01 2020-08-07
6   601901  方正证券        17.87 2020-08-07
7   000333  美的集团        16.75 2020-08-07
8   603605   珀莱雅        16.48 2020-08-07
9   000651  格力电器        16.35 2020-08-07
10  300347  泰格医药        15.78 2020-08-07
11  600406  国电南瑞        15.71 2020-08-07
12  002008  大族激光        14.73 2020-08-07
13  002439  启明星辰        14.61 2020-08-07
14  002508  老板电器        14.14 2020-08-07
15  600887  伊利股份        12.97 2020-08-07
16  601138  工业富联        12.94 2020-08-07
17  600298  安琪酵母        12.90 2020-08-07
18  000338  潍柴动力        12.77 2020-08-07
19  603882  金域医学        12.60 2020-08-07
20  603259  药明康得        12.36 2020-08-07
21  603939  益丰药房        12.23 2020-08-07
22  002271  东方雨虹        11.68 2020-08-07
23  600276  恒瑞医药        11.53 2020-08-07
24  002557  洽洽食品        11.48 2020-08-07
25  300124  汇川技术        11.44 2020-08-07
26  600585  海螺水泥        11.31 2020-08-07
27  600872  中炬高新        11.31 2020-08-07
28  000157  中联重科        11.09 2020-08-07
29  300244  迪安诊断        11.08 2020-08-07
30  600885  宏发股份        10.86 2020-08-07
31  601888  **国旅        10.82 2020-08-07
32  002410   广联达        10.38 2020-08-07
33  600660  福耀玻璃        10.37 2020-08-07
34  300285  国瓷材料        10.22 2020-08-07
35  603713  密尔克卫        10.04 2020-08-07
36  601100  恒立液压         9.90 2020-08-07
37  600031  三一重工         9.86 2020-08-07
38  600690  海尔智家         9.73 2020-08-07
39  300383  光环新网         9.57 2020-08-07
40  603915  国茂股份         9.30 2020-08-07
41  002179  中航光电         9.15 2020-08-07
42  603056  德邦股份         9.02 2020-08-07
43  002027  分众传媒         8.87 2020-08-07
44  002697  红旗连锁         8.64 2020-08-07
45  603533  掌阅科技         8.51 2020-08-07
46  600066  宇通客车         8.45 2020-08-07
47  600519  贵州茅台         8.30 2020-08-07
48  600835  上海机电         8.30 2020-08-07
49  603737   三棵树         8.28 2020-08-07

请问如何触发全量更新,运行example 里的任务start之后没有输出了

Log:

2020-05-23 15:23:23,569  INFO  MainThread  Adding job tentatively -- it will be properly scheduled when the scheduler starts                                         Stock registered recorders:{'joinquant': <class 'zvt.recorders.joinquant.meta.china_stock_meta_recorder.JqChinaStockRecorder'>, 'exchange': <class 'zvt.recorders.exchange.china_stock_list_spider.ExchangeChinaStockListRecorder'>, 'eastmoney': <class 'zvt.recorders.eastmoney.meta.china_stock_meta_recorder.EastmoneyChinaStockListRecorder'>}                                                                                                                                                            Empty DataFrame                                                                                                                                                      Columns: [code, name, list_date]                                                                                                                                     Index: []                                                                                                                                                            2020-05-23 15:23:24,890  INFO  MainThread          code   name  list_date exchange entity_type               id        entity_id  timestamp                          1506  603996  *ST中新 2015-12-22       sh       stock  stock_sh_603996  stock_sh_603996 2015-12-22                                                                   1507  603997   继峰股份 2015-03-02       sh       stock  stock_sh_603997  stock_sh_603997 2015-03-02                                                                 1508  603998   方盛制药 2014-12-05       sh       stock  stock_sh_603998  stock_sh_603998 2014-12-05                                                                 1509  603999   读者传媒 2015-12-10       sh       stock  stock_sh_603999  stock_sh_603999 2015-12-10                                                                 1510  605001   威奥股份 2020-05-22       sh       stock  stock_sh_605001  stock_sh_605001 2020-05-22                                                                 2020-05-23 15:23:24,908  INFO  MainThread  persist stock list successs                                                                                               Empty DataFrame                                                                                                                                                      Columns: [code, name, list_date]                                                                                                                                     Index: []                                                                                                                                                            2020-05-23 15:23:26,546  INFO  MainThread          code  name  list_date exchange entity_type               id        entity_id  timestamp                           2223  300829  金丹科技 2020-04-22       sz       stock  stock_sz_300829  stock_sz_300829 2020-04-22                                                                  2224  300830   金现代 2020-05-06       sz       stock  stock_sz_300830  stock_sz_300830 2020-05-06                                                                   2225  300831  派瑞股份 2020-05-07       sz       stock  stock_sz_300831  stock_sz_300831 2020-05-07                                                                  2226  300832   新产业 2020-05-12       sz       stock  stock_sz_300832  stock_sz_300832 2020-05-12                                                                   2227  300833  浩洋股份 2020-05-20       sz       stock  stock_sz_300833  stock_sz_300833 2020-05-20                                                                  2020-05-23 15:23:26,567  INFO  MainThread  persist stock list successs                                                                                               FinanceFactor registered recorders:{'eastmoney': <class 'zvt.recorders.eastmoney.finance.china_stock_finance_factor_recorder.ChinaStockFinanceFactorRecorder'>}      auth success  ( 如需说明文档请查看:https://url.cn/5oB7EOO,更多问题请联系JQData管理员,微信号:JQData02 )                                                           已退出                                                                                                                                                               BalanceSheet registered recorders:{'eastmoney': <class 'zvt.recorders.eastmoney.finance.china_stock_balance_sheet_recorder.ChinaStockBalanceSheetRecorder'>}         auth success  ( 如需说明文档请查看:https://url.cn/5oB7EOO,更多问题请联系JQData管理员,微信号:JQData02 )                                                           已退出                                                                                                                                                               IncomeStatement registered recorders:{'eastmoney': <class 'zvt.recorders.eastmoney.finance.china_stock_income_statement_recorder.ChinaStockIncomeStatementRecorder'>}auth success  ( 如需说明文档请查看:https://url.cn/5oB7EOO,更多问题请联系JQData管理员,微信号:JQData02 )                                                           已退出                                                                                                                                                               CashFlowStatement registered recorders:{'eastmoney': <class 'zvt.recorders.eastmoney.finance.china_stock_cash_flow_recorder.ChinaStockCashFlowRecorder'>}            auth success  ( 如需说明文档请查看:https://url.cn/5oB7EOO,更多问题请联系JQData管理员,微信号:JQData02 )                                                           已退出                                                                                                                                                               2020-05-23 15:23:29,317  INFO  MainThread  Added job "run" to job store "default"                                                                                    2020-05-23 15:23:29,318  INFO  MainThread  Scheduler started                                                                                                         

我看文档说不传参数就是全量更新,我想更新全量股票,但是一点都没动。

从交易所获取的股票列表不包含科创板

版本0.7.0

In [1]: from zvt.domain import *
In [2]: Stock.provider_map_recorder
Out[2]:
{'joinquant': zvt.recorders.joinquant.meta.china_stock_meta_recorder.JqChinaStockRecorder,
 'exchange': zvt.recorders.exchange.china_stock_list_spider.ExchangeChinaStockListRecorder,
 'eastmoney': zvt.recorders.eastmoney.meta.china_stock_meta_recorder.EastmoneyChinaStockListRecorder}

In [3]: Stock.record_data(provider='exchange')
Stock registered recorders:{'joinquant': <class 'zvt.recorders.joinquant.meta.china_stock_meta_recorder.JqChinaStockRecorder'>, 'exchange': <class 'zvt.recorders.exchange.china_stock_list_spider.ExchangeChinaStockListRecorder'>, 'eastmoney': <class 'zvt.recorders.eastmoney.meta.china_stock_meta_recorder.EastmoneyChinaStockListRecorder'>}
Empty DataFrame
Columns: [code, name, list_date]
Index: []
INFO  MainThread  2020-01-21 11:33:56,402  ExchangeChinaStockListRecorder:china_stock_list_spider.py:63  download_stock_list          code  name  list_date exchange entity_type               id        entity_id  timestamp
1492  603995  甬金股份 2019-12-24       sh       stock  stock_sh_603995  stock_sh_603995 2019-12-24
1493  603996  ST中新 2015-12-22       sh       stock  stock_sh_603996  stock_sh_603996 2015-12-22
1494  603997  继峰股份 2015-03-02       sh       stock  stock_sh_603997  stock_sh_603997 2015-03-02
1495  603998  方盛制药 2014-12-05       sh       stock  stock_sh_603998  stock_sh_603998 2014-12-05
1496  603999  读者传媒 2015-12-10       sh       stock  stock_sh_603999  stock_sh_603999 2015-12-10
INFO  MainThread  2020-01-21 11:33:56,416  ExchangeChinaStockListRecorder:china_stock_list_spider.py:64  download_stock_list  persist stock list successs
Empty DataFrame
Columns: [code, name, list_date]
Index: []
INFO  MainThread  2020-01-21 11:33:57,883  ExchangeChinaStockListRecorder:china_stock_list_spider.py:63  download_stock_list          code  name  list_date exchange entity_type               id        entity_id  timestamp
2193  300809  华辰装备 2019-12-04       sz       stock  stock_sz_300809  stock_sz_300809 2019-12-04
2194  300810  中科海讯 2019-12-06       sz       stock  stock_sz_300810  stock_sz_300810 2019-12-06
2195  300811  铂科新材 2019-12-30       sz       stock  stock_sz_300811  stock_sz_300811 2019-12-30
2196  300812  易天股份 2020-01-09       sz       stock  stock_sz_300812  stock_sz_300812 2020-01-09
2197  300813  泰林生物 2020-01-14       sz       stock  stock_sz_300813  stock_sz_300813 2020-01-14
INFO  MainThread  2020-01-21 11:33:57,896  ExchangeChinaStockListRecorder:china_stock_list_spider.py:64  download_stock_list  persist stock list successs

In [4]: Stock.record_data(provider='joinquant')
Stock registered recorders:{'joinquant': <class 'zvt.recorders.joinquant.meta.china_stock_meta_recorder.JqChinaStockRecorder'>, 'exchange': <class 'zvt.recorders.exchange.china_stock_list_spider.ExchangeChinaStockListRecorder'>, 'eastmoney': <class 'zvt.recorders.eastmoney.meta.china_stock_meta_recorder.EastmoneyChinaStockListRecorder'>}
auth success  ( 如需说明文档请查看:https://url.cn/5oB7EOO,更多问题请联系JQData管理员,微信号:JQData02 )
INFO  MainThread  2020-01-21 11:34:05,015  JqChinaStockRecorder:china_stock_meta_recorder.py:54  run              entity_id display_name   name  timestamp   end_date   type  list_date               id entity_type exchange    code
0     stock_sz_000001         平安银行   平安银行 1991-04-03 2200-01-01  stock 1991-04-03  stock_sz_000001       stock       sz  000001
1     stock_sz_000002          万科A    万科A 1991-01-29 2200-01-01  stock 1991-01-29  stock_sz_000002       stock       sz  000002
2     stock_sz_000004         国农科技   国农科技 1990-12-01 2200-01-01  stock 1990-12-01  stock_sz_000004       stock       sz  000004
3     stock_sz_000005         世纪星源   世纪星源 1990-12-10 2200-01-01  stock 1990-12-10  stock_sz_000005       stock       sz  000005
4     stock_sz_000006         深振业A   深振业A 1992-04-27 2200-01-01  stock 1992-04-27  stock_sz_000006       stock       sz  000006
5     stock_sz_000007          全新好    全新好 1992-04-13 2200-01-01  stock 1992-04-13  stock_sz_000007       stock       sz  000007
6     stock_sz_000008         神州高铁   神州高铁 1992-05-07 2200-01-01  stock 1992-05-07  stock_sz_000008       stock       sz  000008
7     stock_sz_000009         **宝安   **宝安 1991-06-25 2200-01-01  stock 1991-06-25  stock_sz_000009       stock       sz  000009
8     stock_sz_000010        *ST美丽  *ST美丽 1995-10-27 2200-01-01  stock 1995-10-27  stock_sz_000010       stock       sz  000010
9     stock_sz_000011         深物业A   深物业A 1992-03-30 2200-01-01  stock 1992-03-30  stock_sz_000011       stock       sz  000011
10    stock_sz_000012          南玻A    南玻A 1992-02-28 2200-01-01  stock 1992-02-28  stock_sz_000012       stock       sz  000012
11    stock_sz_000014         沙河股份   沙河股份 1992-06-02 2200-01-01  stock 1992-06-02  stock_sz_000014       stock       sz  000014
12    stock_sz_000016         深康佳A   深康佳A 1992-03-27 2200-01-01  stock 1992-03-27  stock_sz_000016       stock       sz  000016
13    stock_sz_000017         深中华A   深中华A 1992-03-31 2200-01-01  stock 1992-03-31  stock_sz_000017       stock       sz  000017
14    stock_sz_000018         神城A退   神城A退 1992-06-16 2020-01-06  stock 1992-06-16  stock_sz_000018       stock       sz  000018
15    stock_sz_000019         深粮控股   深粮控股 1992-10-12 2200-01-01  stock 1992-10-12  stock_sz_000019       stock       sz  000019
16    stock_sz_000020         深华发A   深华发A 1992-04-28 2200-01-01  stock 1992-04-28  stock_sz_000020       stock       sz  000020
17    stock_sz_000021          深科技    深科技 1994-02-02 2200-01-01  stock 1994-02-02  stock_sz_000021       stock       sz  000021
18    stock_sz_000022         深赤湾A   深赤湾A 1993-05-05 2018-12-25  stock 1993-05-05  stock_sz_000022       stock       sz  000022
19    stock_sz_000023         深天地A   深天地A 1993-04-29 2200-01-01  stock 1993-04-29  stock_sz_000023       stock       sz  000023
20    stock_sz_000024         招商地产   招商地产 1993-06-07 2015-12-29  stock 1993-06-07  stock_sz_000024       stock       sz  000024
21    stock_sz_000025          特力A    特力A 1993-06-21 2200-01-01  stock 1993-06-21  stock_sz_000025       stock       sz  000025
22    stock_sz_000026          飞亚达    飞亚达 1993-06-03 2200-01-01  stock 1993-06-03  stock_sz_000026       stock       sz  000026
23    stock_sz_000027         深圳能源   深圳能源 1993-09-03 2200-01-01  stock 1993-09-03  stock_sz_000027       stock       sz  000027
24    stock_sz_000028         国药一致   国药一致 1993-08-09 2200-01-01  stock 1993-08-09  stock_sz_000028       stock       sz  000028
25    stock_sz_000029         深深房A   深深房A 1993-09-15 2200-01-01  stock 1993-09-15  stock_sz_000029       stock       sz  000029
26    stock_sz_000030         富奥股份   富奥股份 1993-09-29 2200-01-01  stock 1993-09-29  stock_sz_000030       stock       sz  000030
27    stock_sz_000031          大悦城    大悦城 1993-10-08 2200-01-01  stock 1993-10-08  stock_sz_000031       stock       sz  000031
28    stock_sz_000032         深桑达A   深桑达A 1993-10-28 2200-01-01  stock 1993-10-28  stock_sz_000032       stock       sz  000032
29    stock_sz_000033          新都退    新都退 1994-01-03 2017-07-06  stock 1994-01-03  stock_sz_000033       stock       sz  000033
...               ...          ...    ...        ...        ...    ...        ...              ...         ...      ...     ...
3830  stock_sh_688139         海尔生物   海尔生物 2019-10-25 2200-01-01  stock 2019-10-25  stock_sh_688139       stock       sh  688139
3831  stock_sh_688158          优刻得    优刻得 2020-01-20 2200-01-01  stock 2020-01-20  stock_sh_688158       stock       sh  688158
3832  stock_sh_688166         博瑞医药   博瑞医药 2019-11-08 2200-01-01  stock 2019-11-08  stock_sh_688166       stock       sh  688166
3833  stock_sh_688168          安博通    安博通 2019-09-06 2200-01-01  stock 2019-09-06  stock_sh_688168       stock       sh  688168
3834  stock_sh_688178          万德斯    万德斯 2020-01-14 2200-01-01  stock 2020-01-14  stock_sh_688178       stock       sh  688178
3835  stock_sh_688181         八亿时空   八亿时空 2020-01-06 2200-01-01  stock 2020-01-06  stock_sh_688181       stock       sh  688181
3836  stock_sh_688188         柏楚电子   柏楚电子 2019-08-08 2200-01-01  stock 2019-08-08  stock_sh_688188       stock       sh  688188
3837  stock_sh_688196         卓越新能   卓越新能 2019-11-21 2200-01-01  stock 2019-11-21  stock_sh_688196       stock       sh  688196
3838  stock_sh_688198         佰仁医疗   佰仁医疗 2019-12-09 2200-01-01  stock 2019-12-09  stock_sh_688198       stock       sh  688198
3839  stock_sh_688199         久日新材   久日新材 2019-11-05 2200-01-01  stock 2019-11-05  stock_sh_688199       stock       sh  688199
3840  stock_sh_688202          美迪西    美迪西 2019-11-05 2200-01-01  stock 2019-11-05  stock_sh_688202       stock       sh  688202
3841  stock_sh_688218         江苏北人   江苏北人 2019-12-11 2200-01-01  stock 2019-12-11  stock_sh_688218       stock       sh  688218
3842  stock_sh_688258         卓易信息   卓易信息 2019-12-09 2200-01-01  stock 2019-12-09  stock_sh_688258       stock       sh  688258
3843  stock_sh_688268         华特气体   华特气体 2019-12-26 2200-01-01  stock 2019-12-26  stock_sh_688268       stock       sh  688268
3844  stock_sh_688278         特宝生物   特宝生物 2020-01-17 2200-01-01  stock 2020-01-17  stock_sh_688278       stock       sh  688278
3845  stock_sh_688288         鸿泉物联   鸿泉物联 2019-11-06 2200-01-01  stock 2019-11-06  stock_sh_688288       stock       sh  688288
3846  stock_sh_688299         长阳科技   长阳科技 2019-11-06 2200-01-01  stock 2019-11-06  stock_sh_688299       stock       sh  688299
3847  stock_sh_688300         联瑞新材   联瑞新材 2019-11-15 2200-01-01  stock 2019-11-15  stock_sh_688300       stock       sh  688300
3848  stock_sh_688310         迈得医疗   迈得医疗 2019-12-03 2200-01-01  stock 2019-12-03  stock_sh_688310       stock       sh  688310
3849  stock_sh_688321         微芯生物   微芯生物 2019-08-12 2200-01-01  stock 2019-08-12  stock_sh_688321       stock       sh  688321
3850  stock_sh_688333          铂力特    铂力特 2019-07-22 2200-01-01  stock 2019-07-22  stock_sh_688333       stock       sh  688333
3851  stock_sh_688357         建龙微纳   建龙微纳 2019-12-04 2200-01-01  stock 2019-12-04  stock_sh_688357       stock       sh  688357
3852  stock_sh_688358         祥生医疗   祥生医疗 2019-12-03 2200-01-01  stock 2019-12-03  stock_sh_688358       stock       sh  688358
3853  stock_sh_688363         华熙生物   华熙生物 2019-11-06 2200-01-01  stock 2019-11-06  stock_sh_688363       stock       sh  688363
3854  stock_sh_688366         昊海生科   昊海生科 2019-10-30 2200-01-01  stock 2019-10-30  stock_sh_688366       stock       sh  688366
3855  stock_sh_688368         晶丰明源   晶丰明源 2019-10-14 2200-01-01  stock 2019-10-14  stock_sh_688368       stock       sh  688368
3856  stock_sh_688369         致远互联   致远互联 2019-10-31 2200-01-01  stock 2019-10-31  stock_sh_688369       stock       sh  688369
3857  stock_sh_688388         嘉元科技   嘉元科技 2019-07-22 2200-01-01  stock 2019-07-22  stock_sh_688388       stock       sh  688388
3858  stock_sh_688389         普门科技   普门科技 2019-11-05 2200-01-01  stock 2019-11-05  stock_sh_688389       stock       sh  688389
3859  stock_sh_688399         硕世生物   硕世生物 2019-12-05 2200-01-01  stock 2019-12-05  stock_sh_688399       stock       sh  688399

[3860 rows x 11 columns]
INFO  MainThread  2020-01-21 11:34:05,058  JqChinaStockRecorder:china_stock_meta_recorder.py:55  run  persist stock list success
已退出

In [5]: df=Stock.query_data(provider='eastmoney')

In [6]: len(df)
Out[6]: 3695

In [7]: df=Stock.query_data(provider='joinquant')

In [8]: len(df)
Out[8]: 3860

聚宽的有科创板数据,需要对ExchangeChinaStockListRecorder增强一下。

东财财务数据BUG

东财数据下的财务数据,新的中报,年报,有如下的数据:
图片

没有这个数据,还是可以查询出来,不知道是不是BUG。

更新数据出错

从百度网盘下载数据库,然后替换data文件夹中默认的,执行下面命令,

import os
from zvt.api import *
from zvt.domain import *
FinanceFactor.recorders
Traceback (most recent call last):
File "", line 1, in
AttributeError: type object 'FinanceFactor' has no attribute 'recorders'

Stock.record_data(provider='eastmoney')
Stock registered recorders:{'joinquant': <class 'zvt.recorders.joinquant.meta.china_stock_meta_recorder.JqChinaStockRecorder'>, 'exchange': <class 'zvt.recorders.exchange.china_stock_list_spider.ExchangeChinaStockListRecorder'>, 'eastmoney': <class 'zvt.recorders.eastmoney.meta.china_stock_meta_recorder.EastmoneyChinaStockListRecorder'>}
Empty DataFrame
Columns: [code, name, list_date]
Index: []
Traceback (most recent call last):
File "D:\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1193, in _execute_context
context)
File "D:\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 509, in do_execute
cursor.execute(statement, parameters)
sqlite3.OperationalError: too many SQL variables

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "", line 1, in
File "D:\Anaconda3\lib\site-packages\zvdata_init_.py", line 260, in record_data
r.run()
File "E:\AITrader\SourceCode\zvt\zvt\recorders\exchange\china_stock_list_spider.py", line 23, in run
self.download_stock_list(response=resp, exchange='sh')
File "E:\AITrader\SourceCode\zvt\zvt\recorders\exchange\china_stock_list_spider.py", line 64, in download_stock_list
df_to_db(df=df, data_schema=self.data_schema, provider=self.provider, force_update=False)
File "D:\Anaconda3\lib\site-packages\zvdata\api.py", line 246, in df_to_db
ids=df_current['id'].tolist())
File "D:\Anaconda3\lib\site-packages\zvdata\api.py", line 128, in get_data
df = pd.read_sql(query.statement, query.session.bind)
File "D:\Anaconda3\lib\site-packages\pandas\io\sql.py", line 397, in read_sql
chunksize=chunksize)
File "D:\Anaconda3\lib\site-packages\pandas\io\sql.py", line 1099, in read_query
result = self.execute(*args)
File "D:\Anaconda3\lib\site-packages\pandas\io\sql.py", line 990, in execute
return self.connectable.execute(*args, **kwargs)
File "D:\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 2075, in execute
return connection.execute(statement, *multiparams, **params)
File "D:\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 948, in execute
return meth(self, multiparams, params)
File "D:\Anaconda3\lib\site-packages\sqlalchemy\sql\elements.py", line 269, in _execute_on_connection
return connection._execute_clauseelement(self, multiparams, params)
File "D:\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1060, in _execute_clauseelement
compiled_sql, distilled_params
File "D:\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1200, in _execute_context
context)
File "D:\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1413, in _handle_dbapi_exception
exc_info
File "D:\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 265, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb, cause=cause)
File "D:\Anaconda3\lib\site-packages\sqlalchemy\util\compat.py", line 248, in reraise
raise value.with_traceback(tb)
File "D:\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1193, in _execute_context
context)
File "D:\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 509, in do_execute
cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) too many SQL variables [SQL: 'SELECT stock.id, stock.timestamp \nFROM stock \nWHERE stock.id IN (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?
, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?,
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ORDER BY stock.timestamp ASC'] [parameters: ('stock_sh_600000', 'stock_sh_600004', 'stock_sh_600006', 'stock_sh_600007', 'stock_sh_600008', 'stock_sh_600009', 'stock_sh_600010', 'stock_sh_600011', 'stock_sh_600012', 'stock_sh_600015', 'stock_sh_600016', 'stock_sh_600017', 'stock_sh_600018', 'stock_sh_600019', 'stock_sh_600020', 'stock_sh_600021', 'stock_sh_600022', 'stock_sh_600023', 'stock_sh_600025', 'stock_sh_600026', 'stock_sh_600027', 'stock_sh_600028', 'stock_sh_600029', 'stock_sh_600030', 'stock_sh_600031', 'stock_sh_600033', 'stock_sh_600035', 'stock_sh_600036', 'stock_sh_600037', 'stock_sh_600038', 'stock_sh_600039', 'stock_sh_600048', 'stock_sh_600050', 'stock_sh_600051', 'stock_sh_600052', 'stock_sh_600053', 'stock_sh_600054', 'stock_sh_600055', 'stock_sh_600056', 'stock_sh_600057', 'stock_sh_600058', 'stock_sh_600059', 'stock_sh_600060', 'stock_sh_600061', 'stock_sh_600062', 'stock_sh_600063', 'stock_sh_600064', 'stock_sh_600066', 'stock_sh_600067', 'stock_sh_600068', 'stock_sh_600069', 'stock_sh_600070', 'stock_sh_600071', 'stock_sh_600072', 'stock_sh_600073', 'stock_sh_600074', 'stock_sh_600075', 'stock_sh_600076', 'stock_sh_600077', 'stock_sh_600078', 'stock_sh_600079', 'stock_sh_600080', 'stock_sh_600081', 'stock_sh_600082', 'stock_sh_600083', 'stock_sh_600084', 'stock_sh_600085', 'stock_sh_600086', 'stock_sh_600088', 'stock_sh_600089', 'stock_sh_600090', 'stock_sh_600091', 'stock_sh_600093', 'stock_sh_600094', 'stock_sh_600095', 'stock_sh_600096', 'stock_sh_600097', 'stock_sh_600098', 'stock_sh_600099', 'stock_sh_600100', 'stock_sh_600101', 'stock_sh_600103', 'stock_sh_600104', 'stock_sh_600105', 'stock_sh_600106', 'stock_sh_600107', 'stock_sh_600108', 'stock_sh_600109', 'stock_sh_600110', 'stock_sh_600111', 'stock_sh_600112', 'stock_sh_600113', 'stock_sh_600114', 'stock_sh_600115', 'stock_sh_600116', 'stock_sh_600117', 'stock_sh_600118', 'stock_sh_600119', 'stock_sh_600120', 'stock_sh_600121', 'stock_sh_600122', 'stock_sh_600123', 'stock_sh_600125', 'stock_sh_600126', 'stock_sh_600127', 'stock_sh_600128', 'stock_sh_600129', 'stock_sh_600130', 'stock_sh_600131', 'stock_sh_600132', 'stock_sh_600133', 'stock_sh_600135', 'stock_sh_600136', 'stock_sh_600137', 'stock_sh_600138', 'stock_sh_600139', 'stock_sh_600141', 'stock_sh_600143', 'stock_sh_600145', 'stock_sh_600146', 'stock_sh_600148', 'stock_sh_600149', 'stock_sh_600150', 'stock_sh_600151', 'stock_sh_600152', 'stock_sh_600153', 'stock_sh_600155', 'stock_sh_600156', 'stock_sh_600157', 'stock_sh_600158', 'stock_sh_600159', 'stock_sh_600160', 'stock_sh_600161', 'stock_sh_600162', 'stock_sh_600163', 'stock_sh_600165', 'stock_sh_600166', 'stock_sh_600167', 'stock_sh_600168', 'stock_sh_600169', 'stock_sh_600170', 'stock_sh_600171', 'stock_sh_600172', 'stock_sh_600173', 'stock_sh_600175', 'stock_sh_600176', 'stock_sh_600177', 'stock_sh_600178', 'stock_sh_600179', 'stock_sh_600180', 'stock_sh_600182', 'stock_sh_600183', 'stock_sh_600184', 'stock_sh_600185', 'stock_sh_600186', 'stock_sh_600187', 'stock_sh_600188', 'stock_sh_600189', 'stock_sh_600190', 'stock_sh_600191', 'stock_sh_600192', 'stock_sh_600193', 'stock_sh_600195', 'stock_sh_600196', 'stock_sh_600197', 'stock_sh_600198', 'stock_sh_600199', 'stock_sh_600200', 'stock_sh_600201', 'stock_sh_600202', 'stock_sh_600203', 'stock_sh_600206', 'stock_sh_600207',
'stock_sh_600208', 'stock_sh_600209', 'stock_sh_600210', 'stock_sh_600211', 'stock_sh_600212', 'stock_sh_600213', 'stock_sh_600215', 'stock_sh_600216', 'stock_sh_600217', 'stock_sh_600218', 'stock_sh_600219', 'stock_sh_600220', 'stock_sh_600221', 'stock_sh_600222', 'stock_sh_600223', 'stock_sh_600225', 'stock_sh_600226', 'stock_sh_600227', 'stock_sh_600228', 'stock_sh_600229', 'stock_sh_600230', 'stock_sh_600231', 'stock_sh_600232', 'stock_sh_600233', 'stock_sh_600234', 'stock_sh_600235', 'stock_sh_600236', 'stock_sh_600237', 'stock_sh_600238', 'stock_sh_600239', 'stock_sh_600241', 'stock_sh_600242', 'stock_sh_600243', 'stock_sh_600246', 'stock_sh_600247', 'stock_sh_600248', 'stock_sh_600249', 'stock_sh_600250', 'stock_sh_600251', 'stock_sh_600252', 'stock_sh_600255', 'stock_sh_600256', 'stock_sh_600257', 'stock_sh_600258', 'stock_sh_600259', 'stock_sh_600260', 'stock_sh_600261', 'stock_sh_600262', 'stock_sh_600265', 'stock_sh_600266', 'stock_sh_600267', 'stock_sh_600268', 'stock_sh_600269', 'stock_sh_600271', 'stock_sh_600272', 'stock_sh_600273', 'stock_sh_600275', 'stock_sh_600276', 'stock_sh_600277', 'stock_sh_600278', 'stock_sh_600279', 'stock_sh_600280', 'stock_sh_600281', 'stock_sh_600282', 'stock_sh_600283', 'stock_sh_600284', 'stock_sh_600285', 'stock_sh_600287', 'stock_sh_600288', 'stock_sh_600289', 'stock_sh_600290', 'stock_sh_600291', 'stock_sh_600292', 'stock_sh_600293', 'stock_sh_600295', 'stock_sh_600297', 'stock_sh_600298', 'stock_sh_600299', 'stock_sh_600300', 'stock_sh_600301', 'stock_sh_600302', 'stock_sh_600303', 'stock_sh_600305', 'stock_sh_600306', 'stock_sh_600307', 'stock_sh_600308', 'stock_sh_600309', 'stock_sh_600310', 'stock_sh_600311', 'stock_sh_600312', 'stock_sh_600313', 'stock_sh_600315', 'stock_sh_600316', 'stock_sh_600317', 'stock_sh_600318', 'stock_sh_600319', 'stock_sh_600320', 'stock_sh_600321', 'stock_sh_600322', 'stock_sh_600323', 'stock_sh_600325', 'stock_sh_600326', 'stock_sh_600327', 'stock_sh_600328', 'stock_sh_600329', 'stock_sh_600330', 'stock_sh_600331', 'stock_sh_600332', 'stock_sh_600333', 'stock_sh_600335', 'stock_sh_600336', 'stock_sh_600337', 'stock_sh_600338', 'stock_sh_600339', 'stock_sh_600340', 'stock_sh_600343', 'stock_sh_600345', 'stock_sh_600346', 'stock_sh_600348', 'stock_sh_600350', 'stock_sh_600351', 'stock_sh_600352', 'stock_sh_600353', 'stock_sh_600354', 'stock_sh_600355', 'stock_sh_600356', 'stock_sh_600358', 'stock_sh_600359', 'stock_sh_600360', 'stock_sh_600361', 'stock_sh_600362', 'stock_sh_600363', 'stock_sh_600365', 'stock_sh_600366', 'stock_sh_600367', 'stock_sh_600368', 'stock_sh_600369', 'stock_sh_600370', 'stock_sh_600371', 'stock_sh_600372', 'stock_sh_600373', 'stock_sh_600375', 'stock_sh_600376', 'stock_sh_600377', 'stock_sh_600378', 'stock_sh_600379', 'stock_sh_600380', 'stock_sh_600381', 'stock_sh_600382', 'stock_sh_600383', 'stock_sh_600385', 'stock_sh_600386', 'stock_sh_600387', 'stock_sh_600388', 'stock_sh_600389', 'stock_sh_600390', 'stock_sh_600391', 'stock_sh_600392', 'stock_sh_600393', 'stock_sh_600395', 'stock_sh_600396', 'stock_sh_600397', 'stock_sh_600398', 'stock_sh_600399', 'stock_sh_600400', 'stock_sh_600403', 'stock_sh_600405', 'stock_sh_600406', 'stock_sh_600408', 'stock_sh_600409', 'stock_sh_600410', 'stock_sh_600415', 'stock_sh_600416', 'stock_sh_600418', 'stock_sh_600419', 'stock_sh_600420', 'stock_sh_600421', 'stock_sh_600422', 'stock_sh_600423', 'stock_sh_600425', 'stock_sh_600426', 'stock_sh_600428', 'stock_sh_600429', 'stock_sh_600433', 'stock_sh_600435', 'stock_sh_600436', 'stock_sh_600438', 'stock_sh_600439', 'stock_sh_600444', 'stock_sh_600446', 'stock_sh_600448', 'stock_sh_600449', 'stock_sh_600452', 'stock_sh_600455', 'stock_sh_600456', 'stock_sh_600458', 'stock_sh_600459', 'stock_sh_600460', 'stock_sh_600461', 'stock_sh_600462', 'stock_sh_600463', 'stock_sh_600466', 'stock_sh_600467', 'stock_sh_600468', 'stock_sh_600469', 'stock_sh_600470', 'stock_sh_600475', 'stock_sh_600476', 'stock_sh_600477', 'stock_sh_600478', 'stock_sh_600479', 'stock_sh_600480', 'stock_sh_600481', 'stock_sh_600482', 'stock_sh_600483', 'stock_sh_600485', 'stock_sh_600486', 'stock_sh_600487', 'stock_sh_600488', 'stock_sh_600489', 'stock_sh_600490', 'stock_sh_600491', 'stock_sh_600493', 'stock_sh_600495', 'stock_sh_600496', 'stock_sh_600497', 'stock_sh_600498', 'stock_sh_600499', 'stock_sh_600500', 'stock_sh_600501', 'stock_sh_600502', 'stock_sh_600503', 'stock_sh_600505', 'stock_sh_600506', 'stock_sh_600507', 'stock_sh_600508', 'stock_sh_600509', 'stock_sh_600510', 'stock_sh_600511', 'stock_sh_600512', 'stock_sh_600513', 'stock_sh_600515', 'stock_sh_600516', 'stock_sh_600517', 'stock_sh_600518', 'stock_sh_600519', 'stock_sh_600520', 'stock_sh_600521', 'stock_sh_600522', 'stock_sh_600523', 'stock_sh_600525', 'stock_sh_600526', 'stock_sh_600527', 'stock_sh_600528', 'stock_sh_600529', 'stock_sh_600530', 'stock_sh_600531', 'stock_sh_600532', 'stock_sh_600533', 'stock_sh_600535', 'stock_sh_600536', 'stock_sh_600537', 'stock_sh_600538', 'stock_sh_600539', 'stock_sh_600540', 'stock_sh_600543', 'stock_sh_600545', 'stock_sh_600546', 'stock_sh_600547', 'stock_sh_600548', 'stock_sh_600549', 'stock_sh_600550', 'stock_sh_600551', 'stock_sh_600552', 'stock_sh_600555', 'stock_sh_600556', 'stock_sh_600557', 'stock_sh_600558', 'stock_sh_600559', 'stock_sh_600560', 'stock_sh_600561', 'stock_sh_600562', 'stock_sh_600563', 'stock_sh_600565', 'stock_sh_600566', 'stock_sh_600567', 'stock_sh_600568', 'stock_sh_600569', 'stock_sh_600570', 'stock_sh_600571', 'stock_sh_600572', 'stock_sh_600573', 'stock_sh_600575', 'stock_sh_600576', 'stock_sh_600577', 'stock_sh_600578', 'stock_sh_600579', 'stock_sh_600580', 'stock_sh_600581', 'stock_sh_600582', 'stock_sh_600583', 'stock_sh_600584', 'stock_sh_600585', 'stock_sh_600586', 'stock_sh_600587', 'stock_sh_600588', 'stock_sh_600589', 'stock_sh_600590', 'stock_sh_600592', 'stock_sh_600593', 'stock_sh_600594', 'stock_sh_600595', 'stock_sh_600596', 'stock_sh_600597', 'stock_sh_600598', 'stock_sh_600599', 'stock_sh_600600', 'stock_sh_600601', 'stock_sh_600602', 'stock_sh_600603', 'stock_sh_600604', 'stock_sh_600605', 'stock_sh_600606', 'stock_sh_600608', 'stock_sh_600609', 'stock_sh_600610', 'stock_sh_600611', 'stock_sh_600612', 'stock_sh_600613', 'stock_sh_600614', 'stock_sh_600615', 'stock_sh_600616', 'stock_sh_600617', 'stock_sh_600618', 'stock_sh_600619', 'stock_sh_600620', 'stock_sh_600621', 'stock_sh_600622', 'stock_sh_600623', 'stock_sh_600624', 'stock_sh_600626', 'stock_sh_600628', 'stock_sh_600629', 'stock_sh_600630', 'stock_sh_600633', 'stock_sh_600634', 'stock_sh_600635', 'stock_sh_600636', 'stock_sh_600637', 'stock_sh_600638', 'stock_sh_600639', 'stock_sh_600640', 'stock_sh_600641', 'stock_sh_600642', 'stock_sh_600643', 'stock_sh_600644', 'stock_sh_600645', 'stock_sh_600647', 'stock_sh_600648', 'stock_sh_600649', 'stock_sh_600650', 'stock_sh_600651', 'stock_sh_600652', 'stock_sh_600653', 'stock_sh_600654', 'stock_sh_600655', 'stock_sh_600657', 'stock_sh_600658', 'stock_sh_600660', 'stock_sh_600661', 'stock_sh_600662', 'stock_sh_600663', 'stock_sh_600664', 'stock_sh_600665', 'stock_sh_600666', 'stock_sh_600667', 'stock_sh_600668', 'stock_sh_600671', 'stock_sh_600673', 'stock_sh_600674', 'stock_sh_600675', 'stock_sh_600676', 'stock_sh_600677', 'stock_sh_600678', 'stock_sh_600679', 'stock_sh_600681', 'stock_sh_600682', 'stock_sh_600683', 'stock_sh_600684', 'stock_sh_600685', 'stock_sh_600686', 'stock_sh_600687', 'stock_sh_600688', 'stock_sh_600689', 'stock_sh_600690', 'stock_sh_600691', 'stock_sh_600692', 'stock_sh_600693', 'stock_sh_600694', 'stock_sh_600695', 'stock_sh_600696', 'stock_sh_600697', 'stock_sh_600698', 'stock_sh_600699', 'stock_sh_600701', 'stock_sh_600702', 'stock_sh_600703', 'stock_sh_600704', 'stock_sh_600705', 'stock_sh_600706', 'stock_sh_600707', 'stock_sh_600708', 'stock_sh_600710', 'stock_sh_600711', 'stock_sh_600712', 'stock_sh_600713', 'stock_sh_600714', 'stock_sh_600715', 'stock_sh_600716', 'stock_sh_600717', 'stock_sh_600718','stock_sh_600719', 'stock_sh_600720', 'stock_sh_600721', 'stock_sh_600722', 'stock_sh_600723', 'stock_sh_600724', 'stock_sh_600725', 'stock_sh_600726', 'stock_sh_600727', 'stock_sh_600728', 'stock_sh_600729', 'stock_sh_600730', 'stock_sh_600731', 'stock_sh_600732', 'stock_sh_600733', 'stock_sh_600734', 'stock_sh_600735', 'stock_sh_600736', 'stock_sh_600737', 'stock_sh_600738', 'stock_sh_600739', 'stock_sh_600740', 'stock_sh_600741', 'stock_sh_600742', 'stock_sh_600743', 'stock_sh_600744', 'stock_sh_600745', 'stock_sh_600746', 'stock_sh_600748', 'stock_sh_600749', 'stock_sh_600750', 'stock_sh_600751', 'stock_sh_600753', 'stock_sh_600754', 'stock_sh_600755', 'stock_sh_600756', 'stock_sh_600757', 'stock_sh_600758', 'stock_sh_600759', 'stock_sh_600760', 'stock_sh_600761', 'stock_sh_600763', 'stock_sh_600764', 'stock_sh_600765', 'stock_sh_600766', 'stock_sh_600767', 'stock_sh_600768', 'stock_sh_600769', 'stock_sh_600770', 'stock_sh_600771', 'stock_sh_600773', 'stock_sh_600774', 'stock_sh_600775', 'stock_sh_600776', 'stock_sh_600777', 'stock_sh_600778', 'stock_sh_600779', 'stock_sh_600780', 'stock_sh_600781', 'stock_sh_600782', 'stock_sh_600783', 'stock_sh_600784', 'stock_sh_600785', 'stock_sh_600787', 'stock_sh_600789', 'stock_sh_600790', 'stock_sh_600791', 'stock_sh_600792', 'stock_sh_600793', 'stock_sh_600794', 'stock_sh_600795', 'stock_sh_600796', 'stock_sh_600797', 'stock_sh_600798', 'stock_sh_600800', 'stock_sh_600801', 'stock_sh_600802', 'stock_sh_600803', 'stock_sh_600804', 'stock_sh_600805', 'stock_sh_600807', 'stock_sh_600808', 'stock_sh_600809', 'stock_sh_600810', 'stock_sh_600811', 'stock_sh_600812', 'stock_sh_600814', 'stock_sh_600815', 'stock_sh_600816', 'stock_sh_600817', 'stock_sh_600818', 'stock_sh_600819', 'stock_sh_600820', 'stock_sh_600821', 'stock_sh_600822', 'stock_sh_600823', 'stock_sh_600824', 'stock_sh_600825', 'stock_sh_600826', 'stock_sh_600827', 'stock_sh_600828', 'stock_sh_600829', 'stock_sh_600830', 'stock_sh_600831', 'stock_sh_600833', 'stock_sh_600834', 'stock_sh_600835', 'stock_sh_600836', 'stock_sh_600837', 'stock_sh_600838', 'stock_sh_600839', 'stock_sh_600841', 'stock_sh_600843', 'stock_sh_600844', 'stock_sh_600845', 'stock_sh_600846', 'stock_sh_600847', 'stock_sh_600848', 'stock_sh_600850', 'stock_sh_600851', 'stock_sh_600853', 'stock_sh_600854', 'stock_sh_600855', 'stock_sh_600856', 'stock_sh_600857', 'stock_sh_600858', 'stock_sh_600859', 'stock_sh_600860', 'stock_sh_600861', 'stock_sh_600862', 'stock_sh_600863', 'stock_sh_600864', 'stock_sh_600865', 'stock_sh_600866', 'stock_sh_600867', 'stock_sh_600868', 'stock_sh_600869', 'stock_sh_600870', 'stock_sh_600871', 'stock_sh_600872', 'stock_sh_600873', 'stock_sh_600874', 'stock_sh_600875', 'stock_sh_600876', 'stock_sh_600877', 'stock_sh_600879', 'stock_sh_600880', 'stock_sh_600881', 'stock_sh_600882', 'stock_sh_600883', 'stock_sh_600884', 'stock_sh_600885', 'stock_sh_600886', 'stock_sh_600887', 'stock_sh_600888', 'stock_sh_600889', 'stock_sh_600890', 'stock_sh_600891', 'stock_sh_600892', 'stock_sh_600893', 'stock_sh_600894', 'stock_sh_600895', 'stock_sh_600896', 'stock_sh_600897', 'stock_sh_600898', 'stock_sh_600900', 'stock_sh_600901', 'stock_sh_600903', 'stock_sh_600908', 'stock_sh_600909', 'stock_sh_600917', 'stock_sh_600919', 'stock_sh_600926', 'stock_sh_600928', 'stock_sh_600929', 'stock_sh_600933', 'stock_sh_600936', 'stock_sh_600939', 'stock_sh_600958', 'stock_sh_600959', 'stock_sh_600960', 'stock_sh_600961', 'stock_sh_600962', 'stock_sh_600963', 'stock_sh_600965', 'stock_sh_600966', 'stock_sh_600967', 'stock_sh_600968', 'stock_sh_600969', 'stock_sh_600970', 'stock_sh_600971', 'stock_sh_600973', 'stock_sh_600975', 'stock_sh_600976', 'stock_sh_600977', 'stock_sh_600978', 'stock_sh_600979', 'stock_sh_600980', 'stock_sh_600981', 'stock_sh_600982', 'stock_sh_600983', 'stock_sh_600984', 'stock_sh_600985', 'stock_sh_600986', 'stock_sh_600987', 'stock_sh_600988', 'stock_sh_600989', 'stock_sh_600990', 'stock_sh_600992', 'stock_sh_600993', 'stock_sh_600995', 'stock_sh_600996', 'stock_sh_600997', 'stock_sh_600998', 'stock_sh_600999', 'stock_sh_601000', 'stock_sh_601001', 'stock_sh_601002', 'stock_sh_601003', 'stock_sh_601005', 'stock_sh_601006', 'stock_sh_601007', 'stock_sh_601008', 'stock_sh_601009', 'stock_sh_601010', 'stock_sh_601011', 'stock_sh_601012', 'stock_sh_601015', 'stock_sh_601016', 'stock_sh_601018', 'stock_sh_601019', 'stock_sh_601020', 'stock_sh_601021', 'stock_sh_601028', 'stock_sh_601038', 'stock_sh_601058', 'stock_sh_601066', 'stock_sh_601068', 'stock_sh_601069', 'stock_sh_601077', 'stock_sh_601086', 'stock_sh_601088', 'stock_sh_601098', 'stock_sh_601099', 'stock_sh_601100', 'stock_sh_601101', 'stock_sh_601106', 'stock_sh_601107', 'stock_sh_601108', 'stock_sh_601111', 'stock_sh_601113', 'stock_sh_601116', 'stock_sh_601117', 'stock_sh_601118', 'stock_sh_601126', 'stock_sh_601127', 'stock_sh_601128', 'stock_sh_601137', 'stock_sh_601138', 'stock_sh_601139', 'stock_sh_601155', 'stock_sh_601158', 'stock_sh_601162', 'stock_sh_601163', 'stock_sh_601166', 'stock_sh_601168', 'stock_sh_601169', 'stock_sh_601177', 'stock_sh_601179', 'stock_sh_601186', 'stock_sh_601188', 'stock_sh_601198', 'stock_sh_601199', 'stock_sh_601200', 'stock_sh_601208', 'stock_sh_601211', 'stock_sh_601212', 'stock_sh_601216', 'stock_sh_601218', 'stock_sh_601222', 'stock_sh_601225', 'stock_sh_601226', 'stock_sh_601228', 'stock_sh_601229', 'stock_sh_601231', 'stock_sh_601233', 'stock_sh_601236', 'stock_sh_601238', 'stock_sh_601258', 'stock_sh_601288', 'stock_sh_601298', 'stock_sh_601311', 'stock_sh_601318', 'stock_sh_601319', 'stock_sh_601326', 'stock_sh_601328', 'stock_sh_601330', 'stock_sh_601333', 'stock_sh_601336', 'stock_sh_601339', 'stock_sh_601360', 'stock_sh_601366', 'stock_sh_601368', 'stock_sh_601369', 'stock_sh_601375', 'stock_sh_601377', 'stock_sh_601388', 'stock_sh_601390', 'stock_sh_601398', 'stock_sh_601500', 'stock_sh_601512', 'stock_sh_601515', 'stock_sh_601518', 'stock_sh_601519', 'stock_sh_601555', 'stock_sh_601558', 'stock_sh_601566', 'stock_sh_601567', 'stock_sh_601577', 'stock_sh_601579', 'stock_sh_601588', 'stock_sh_601595', 'stock_sh_601598', 'stock_sh_601599', 'stock_sh_601600', 'stock_sh_601601', 'stock_sh_601606', 'stock_sh_601607', 'stock_sh_601608', 'stock_sh_601611', 'stock_sh_601615', 'stock_sh_601616', 'stock_sh_601618', 'stock_sh_601619', 'stock_sh_601628', 'stock_sh_601633', 'stock_sh_601636', 'stock_sh_601658', 'stock_sh_601666', 'stock_sh_601668', 'stock_sh_601669', 'stock_sh_601677', 'stock_sh_601678', 'stock_sh_601688', 'stock_sh_601689', 'stock_sh_601696', 'stock_sh_601698', 'stock_sh_601699', 'stock_sh_601700', 'stock_sh_601717', 'stock_sh_601718', 'stock_sh_601727', 'stock_sh_601766', 'stock_sh_601777', 'stock_sh_601788', 'stock_sh_601789', 'stock_sh_601798', 'stock_sh_601799', 'stock_sh_601800', 'stock_sh_601801', 'stock_sh_601808', 'stock_sh_601811', 'stock_sh_601816', 'stock_sh_601818', 'stock_sh_601828', 'stock_sh_601838', 'stock_sh_601857', 'stock_sh_601858', 'stock_sh_601860', 'stock_sh_601865', 'stock_sh_601866', 'stock_sh_601869', 'stock_sh_601872', 'stock_sh_601877', 'stock_sh_601878', 'stock_sh_601880', 'stock_sh_601881', 'stock_sh_601882', 'stock_sh_601886', 'stock_sh_601888', 'stock_sh_601890', 'stock_sh_601898', 'stock_sh_601899', 'stock_sh_601900', 'stock_sh_601901', 'stock_sh_601908', 'stock_sh_601916', 'stock_sh_601918', 'stock_sh_601919', 'stock_sh_601928', 'stock_sh_601929', 'stock_sh_601933', 'stock_sh_601939', 'stock_sh_601949', 'stock_sh_601952', 'stock_sh_601958', 'stock_sh_601965', 'stock_sh_601966', 'stock_sh_601968', 'stock_sh_601969', 'stock_sh_601975', 'stock_sh_601985', 'stock_sh_601988', 'stock_sh_601989', 'stock_sh_601990', 'stock_sh_601991', 'stock_sh_601992', 'stock_sh_601996', 'stock_sh_601997', 'stock_sh_601998', 'stock_sh_601999', 'stock_sh_603000', 'stock_sh_603001', 'stock_sh_603002', 'stock_sh_603003', 'stock_sh_603005', 'stock_sh_603006', 'stock_sh_603007', 'stock_sh_603008', 'stock_sh_603009', 'stock_sh_603010', 'stock_sh_603011', 'stock_sh_603012', 'stock_sh_603013', 'stock_sh_603015', 'stock_sh_603016', 'stock_sh_603017', 'stock_sh_603018', 'stock_sh_603019', 'stock_sh_603020', 'stock_sh_603021', 'stock_sh_603022', 'stock_sh_603023', 'stock_sh_603025', 'stock_sh_603026', 'stock_sh_603027', 'stock_sh_603028', 'stock_sh_603029', 'stock_sh_603030', 'stock_sh_603031', 'stock_sh_603032', 'stock_sh_603033', 'stock_sh_603035', 'stock_sh_603036', 'stock_sh_603037', 'stock_sh_603038', 'stock_sh_603039', 'stock_sh_603040', 'stock_sh_603041', 'stock_sh_603042', 'stock_sh_603043', 'stock_sh_603045', 'stock_sh_603050', 'stock_sh_603053', 'stock_sh_603055', 'stock_sh_603056', 'stock_sh_603058', 'stock_sh_603059', 'stock_sh_603060', 'stock_sh_603063', 'stock_sh_603066', 'stock_sh_603067', 'stock_sh_603068', 'stock_sh_603069', 'stock_sh_603076', 'stock_sh_603077', 'stock_sh_603078', 'stock_sh_603079', 'stock_sh_603080', 'stock_sh_603081', 'stock_sh_603083', 'stock_sh_603085', 'stock_sh_603086', 'stock_sh_603088', 'stock_sh_603089', 'stock_sh_603090', 'stock_sh_603093', 'stock_sh_603096', 'stock_sh_603098', 'stock_sh_603099', 'stock_sh_603100', 'stock_sh_603101', 'stock_sh_603103', 'stock_sh_603105', 'stock_sh_603106', 'stock_sh_603108', 'stock_sh_603109', 'stock_sh_603110', 'stock_sh_603111', 'stock_sh_603113', 'stock_sh_603115', 'stock_sh_603116', 'stock_sh_603117', 'stock_sh_603118', 'stock_sh_603121', 'stock_sh_603123', 'stock_sh_603126', 'stock_sh_603127', 'stock_sh_603128', 'stock_sh_603129', 'stock_sh_603131', 'stock_sh_603133', 'stock_sh_603136', 'stock_sh_603138', 'stock_sh_603139', 'stock_sh_603156', 'stock_sh_603157', 'stock_sh_603158', 'stock_sh_603159', 'stock_sh_603160', 'stock_sh_603161', 'stock_sh_603165', 'stock_sh_603166', 'stock_sh_603167', 'stock_sh_603168', 'stock_sh_603169', 'stock_sh_603177', 'stock_sh_603178', 'stock_sh_603179', 'stock_sh_603180', 'stock_sh_603181', 'stock_sh_603183', 'stock_sh_603185', 'stock_sh_603186', 'stock_sh_603187', 'stock_sh_603188', 'stock_sh_603189', 'stock_sh_603192', 'stock_sh_603195', 'stock_sh_603196', 'stock_sh_603197', 'stock_sh_603198', 'stock_sh_603199', 'stock_sh_603200', 'stock_sh_603203', 'stock_sh_603208', 'stock_sh_603214', 'stock_sh_603217', 'stock_sh_603218', 'stock_sh_603220', 'stock_sh_603221', 'stock_sh_603222', 'stock_sh_603223', 'stock_sh_603225', 'stock_sh_603226', 'stock_sh_603227', 'stock_sh_603228', 'stock_sh_603229', 'stock_sh_603232', 'stock_sh_603233', 'stock_sh_603236', 'stock_sh_603238', 'stock_sh_603239', 'stock_sh_603256', 'stock_sh_603258', 'stock_sh_603259', 'stock_sh_603260', 'stock_sh_603266', 'stock_sh_603267', 'stock_sh_603268', 'stock_sh_603269', 'stock_sh_603277', 'stock_sh_603278', 'stock_sh_603279', 'stock_sh_603283', 'stock_sh_603286', 'stock_sh_603288', 'stock_sh_603289', 'stock_sh_603290', 'stock_sh_603297', 'stock_sh_603298', 'stock_sh_603299', 'stock_sh_603300', 'stock_sh_603301', 'stock_sh_603303', 'stock_sh_603305', 'stock_sh_603306', 'stock_sh_603308', 'stock_sh_603309', 'stock_sh_603311', 'stock_sh_603313', 'stock_sh_603315', 'stock_sh_603316', 'stock_sh_603317', 'stock_sh_603318', 'stock_sh_603319', 'stock_sh_603320', 'stock_sh_603321', 'stock_sh_603322', 'stock_sh_603323', 'stock_sh_603326', 'stock_sh_603327', 'stock_sh_603328', 'stock_sh_603329', 'stock_sh_603330', 'stock_sh_603331', 'stock_sh_603332', 'stock_sh_603333', 'stock_sh_603335', 'stock_sh_603336', 'stock_sh_603337', 'stock_sh_603338', 'stock_sh_603339', 'stock_sh_603345', 'stock_sh_603348', 'stock_sh_603351', 'stock_sh_603355', 'stock_sh_603356', 'stock_sh_603357', 'stock_sh_603358', 'stock_sh_603359', 'stock_sh_603360', 'stock_sh_603363', 'stock_sh_603365', 'stock_sh_603366', 'stock_sh_603367', 'stock_sh_603368', 'stock_sh_603369', 'stock_sh_603377', 'stock_sh_603378', 'stock_sh_603379', 'stock_sh_603380', 'stock_sh_603383', 'stock_sh_603385', 'stock_sh_603386', 'stock_sh_603387', 'stock_sh_603388', 'stock_sh_603389', 'stock_sh_603390', 'stock_sh_603393', 'stock_sh_603396', 'stock_sh_603398', 'stock_sh_603399', 'stock_sh_603416', 'stock_sh_603421', 'stock_sh_603429', 'stock_sh_603444', 'stock_sh_603456', 'stock_sh_603458', 'stock_sh_603466', 'stock_sh_603477', 'stock_sh_603486', 'stock_sh_603488', 'stock_sh_603489', 'stock_sh_603496', 'stock_sh_603499', 'stock_sh_603500', 'stock_sh_603501', 'stock_sh_603505', 'stock_sh_603506', 'stock_sh_603507', 'stock_sh_603508', 'stock_sh_603515', 'stock_sh_603516', 'stock_sh_603517', 'stock_sh_603518', 'stock_sh_603519', 'stock_sh_603520', 'stock_sh_603527', 'stock_sh_603528', 'stock_sh_603530', 'stock_sh_603533', 'stock_sh_603535', 'stock_sh_603536', 'stock_sh_603538', 'stock_sh_603551', 'stock_sh_603555', 'stock_sh_603556', 'stock_sh_603557', 'stock_sh_603558', 'stock_sh_603559', 'stock_sh_603566', 'stock_sh_603567', 'stock_sh_603568', 'stock_sh_603569', 'stock_sh_603577', 'stock_sh_603578', 'stock_sh_603579', 'stock_sh_603580', 'stock_sh_603583', 'stock_sh_603585', 'stock_sh_603586', 'stock_sh_603587', 'stock_sh_603588', 'stock_sh_603589', 'stock_sh_603590', 'stock_sh_603595', 'stock_sh_603596', 'stock_sh_603598', 'stock_sh_603599', 'stock_sh_603600', 'stock_sh_603601', 'stock_sh_603602', 'stock_sh_603603', 'stock_sh_603605', 'stock_sh_603606', 'stock_sh_603607', 'stock_sh_603608', 'stock_sh_603609', 'stock_sh_603610', 'stock_sh_603611', 'stock_sh_603612', 'stock_sh_603613', 'stock_sh_603615', 'stock_sh_603616', 'stock_sh_603617', 'stock_sh_603618', 'stock_sh_603619', 'stock_sh_603626', 'stock_sh_603628', 'stock_sh_603629', 'stock_sh_603630', 'stock_sh_603633', 'stock_sh_603636', 'stock_sh_603637', 'stock_sh_603638', 'stock_sh_603639', 'stock_sh_603648', 'stock_sh_603650', 'stock_sh_603655', 'stock_sh_603656', 'stock_sh_603657', 'stock_sh_603658', 'stock_sh_603659', 'stock_sh_603660', 'stock_sh_603661', 'stock_sh_603662', 'stock_sh_603663', 'stock_sh_603665', 'stock_sh_603666', 'stock_sh_603667', 'stock_sh_603668', 'stock_sh_603669', 'stock_sh_603676', 'stock_sh_603677', 'stock_sh_603678', 'stock_sh_603679', 'stock_sh_603680', 'stock_sh_603681', 'stock_sh_603683', 'stock_sh_603685', 'stock_sh_603686', 'stock_sh_603687', 'stock_sh_603688', 'stock_sh_603689', 'stock_sh_603690', 'stock_sh_603693', 'stock_sh_603696', 'stock_sh_603697', 'stock_sh_603698', 'stock_sh_603699', 'stock_sh_603700', 'stock_sh_603701', 'stock_sh_603703', 'stock_sh_603706', 'stock_sh_603707', 'stock_sh_603708', 'stock_sh_603709', 'stock_sh_603711', 'stock_sh_603712', 'stock_sh_603713', 'stock_sh_603716', 'stock_sh_603717', 'stock_sh_603718', 'stock_sh_603719', 'stock_sh_603721', 'stock_sh_603722', 'stock_sh_603725', 'stock_sh_603726', 'stock_sh_603727', 'stock_sh_603728', 'stock_sh_603729', 'stock_sh_603730', 'stock_sh_603733', 'stock_sh_603737', 'stock_sh_603738', 'stock_sh_603739', 'stock_sh_603755', 'stock_sh_603757', 'stock_sh_603758', 'stock_sh_603766', 'stock_sh_603767', 'stock_sh_603768', 'stock_sh_603773', 'stock_sh_603776', 'stock_sh_603777', 'stock_sh_603778', 'stock_sh_603779', 'stock_sh_603786', 'stock_sh_603787', 'stock_sh_603788', 'stock_sh_603789', 'stock_sh_603790', 'stock_sh_603797', 'stock_sh_603798', 'stock_sh_603799', 'stock_sh_603800', 'stock_sh_603801', 'stock_sh_603803', 'stock_sh_603806','stock_sh_603808', 'stock_sh_603809', 'stock_sh_603810', 'stock_sh_603811', 'stock_sh_603813', 'stock_sh_603815', 'stock_sh_603816', 'stock_sh_603817', 'stock_sh_603818', 'stock_sh_603819', 'stock_sh_603822', 'stock_sh_603823', 'stock_sh_603825', 'stock_sh_603826', 'stock_sh_603828', 'stock_sh_603829', 'stock_sh_603833', 'stock_sh_603838', 'stock_sh_603839', 'stock_sh_603843', 'stock_sh_603848', 'stock_sh_603855', 'stock_sh_603856', 'stock_sh_603858', 'stock_sh_603859', 'stock_sh_603860', 'stock_sh_603861', 'stock_sh_603863', 'stock_sh_603866', 'stock_sh_603867', 'stock_sh_603868', 'stock_sh_603869', 'stock_sh_603871', 'stock_sh_603876', 'stock_sh_603877', 'stock_sh_603878', 'stock_sh_603879', 'stock_sh_603880', 'stock_sh_603881', 'stock_sh_603882', 'stock_sh_603883', 'stock_sh_603885', 'stock_sh_603886', 'stock_sh_603887', 'stock_sh_603888', 'stock_sh_603889', 'stock_sh_603890', 'stock_sh_603893', 'stock_sh_603895', 'stock_sh_603896', 'stock_sh_603897', 'stock_sh_603898', 'stock_sh_603899', 'stock_sh_603900', 'stock_sh_603901', 'stock_sh_603903', 'stock_sh_603906', 'stock_sh_603908', 'stock_sh_603909', 'stock_sh_603912', 'stock_sh_603915', 'stock_sh_603916', 'stock_sh_603917', 'stock_sh_603918', 'stock_sh_603919', 'stock_sh_603920', 'stock_sh_603922', 'stock_sh_603926', 'stock_sh_603927', 'stock_sh_603928', 'stock_sh_603929', 'stock_sh_603933', 'stock_sh_603936', 'stock_sh_603937', 'stock_sh_603938', 'stock_sh_603939', 'stock_sh_603948', 'stock_sh_603949', 'stock_sh_603955', 'stock_sh_603956', 'stock_sh_603958', 'stock_sh_603959', 'stock_sh_603960', 'stock_sh_603963', 'stock_sh_603966', 'stock_sh_603967', 'stock_sh_603968', 'stock_sh_603969', 'stock_sh_603970', 'stock_sh_603976', 'stock_sh_603977', 'stock_sh_603978', 'stock_sh_603979', 'stock_sh_603980', 'stock_sh_603982', 'stock_sh_603983', 'stock_sh_603985', 'stock_sh_603986', 'stock_sh_603987', 'stock_sh_603988', 'stock_sh_603989', 'stock_sh_603990', 'stock_sh_603991', 'stock_sh_603992', 'stock_sh_603993', 'stock_sh_603995', 'stock_sh_603996', 'stock_sh_603997', 'stock_sh_603998', 'stock_sh_603999')] (Background on this error at: http://sqlalche.me/e/e3q8)

对于报表的调整如何处理

有些报表的数据会存在调整,比如万华化学本年三季报就对去年的三季节进行了调整,这种情况下程序应该是无感知的,有没有办法让程序去进行更新?

factor的展示增加幅图选项

目前factor计算的indicator和k线是同样的坐标系,应该添加一个展示幅图的选项,这样macd之类的indicator展示会更加清晰.

[dev][bug]运行一定时间后,recoder抛异常

异常如下:

sqlalchemy.exc.ProgrammingError: (sqlite3.ProgrammingError) SQLite objects created in a thread can only be used in that same thread. The object was created in thread id 139991270131456 
and this is thread id 139991166502656. [SQL: 'SELECT "index".id AS index_id, "index".entity_id AS index_entity_id, "index".timestamp AS index_timestamp, "index".entity_type AS index_ent
ity_type, "index".exchange AS index_exchange, "index".code AS index_code, "index".name AS index_name, "index".is_delisted AS index_is_delisted, "index".category AS index_category, "inde
x".base_point AS index_base_point, "index".list_date AS index_list_date \nFROM "index" \nWHERE "index".exchange IN (?) ORDER BY "index".code ASC'] [parameters: [{}]] (Background on this
 error at: http://sqlalche.me/e/f405)
ERROR  ThreadPoolExecutor-0_0  2019-09-08 07:37:41,624  __main__:25  run  sina runner error:(sqlite3.ProgrammingError) SQLite objects created in a thread can only be used in that same t
hread. The object was created in thread id 139991270131456 and this is thread id 139991166502656. [SQL: 'SELECT "index".id AS index_id, "index".entity_id AS index_entity_id, "index".tim
estamp AS index_timestamp, "index".entity_type AS index_entity_type, "index".exchange AS index_exchange, "index".code AS index_code, "index".name AS index_name, "index".is_delisted AS i
ndex_is_delisted, "index".category AS index_category, "index".base_point AS index_base_point, "index".list_date AS index_list_date \nFROM "index" \nWHERE "index".exchange IN (?) ORDER B
Y "index".code ASC'] [parameters: [{}]] (Background on this error at: http://sqlalche.me/e/f405)
Traceback (most recent call last):
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1127, in _execute_context
    context = constructor(dialect, self, conn, *args)
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 639, in _init_compiled
    self.cursor = self.create_cursor()
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 954, in create_cursor
    return self._dbapi_connection.cursor()
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/pool.py", line 977, in cursor
    return self.connection.cursor(*args, **kwargs)
sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread. The object was created in thread id 139991270131456 and this is thread id 139991166502656.

The above exception was the direct cause of the following exception:
The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "zvt/recorders/sina/sina_runner.py", line 20, in run
    SinaChinaStockCategoryRecorder().run()
  File "/home/xuanqi/workspace/github/zvtvz/zvt/zvt/recorders/sina/meta/sina_china_stock_category_recorder.py", line 34, in __init__
    return_type='domain', provider=self.provider)
  File "/home/xuanqi/workspace/github/zvtvz/zvt/zvdata/api.py", line 215, in get_entities
    index=index, index_is_time=index_is_time)
  File "/home/xuanqi/workspace/github/zvtvz/zvt/zvdata/api.py", line 115, in get_data
    return query.all()
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 2843, in all
    return list(self)
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 2995, in __iter__
    return self._execute_and_instances(context)
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/orm/query.py", line 3018, in _execute_and_instances
    result = conn.execute(querycontext.statement, self._params)
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 948, in execute
    return meth(self, multiparams, params)
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/sql/elements.py", line 269, in _execute_on_connection
    return connection._execute_clauseelement(self, multiparams, params)
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1060, in _execute_clauseelement
    compiled_sql, distilled_params
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1132, in _execute_context
    None, None)
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1413, in _handle_dbapi_exception
    exc_info
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 265, in raise_from_cause
    reraise(type(exception), exception, tb=exc_tb, cause=cause)
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/util/compat.py", line 248, in reraise
    raise value.with_traceback(tb)
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/engine/base.py", line 1127, in _execute_context
    context = constructor(dialect, self, conn, *args)
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 639, in _init_compiled
    self.cursor = self.create_cursor()
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/engine/default.py", line 954, in create_cursor
    return self._dbapi_connection.cursor()
  File "/home/xuanqi/workspace/github/zvtvz/zvt/ve/lib/python3.6/site-packages/sqlalchemy/pool.py", line 977, in cursor
    return self.connection.cursor(*args, **kwargs)
sqlalchemy.exc.ProgrammingError: (sqlite3.ProgrammingError) SQLite objects created in a thread can only be used in that same thread. The object was created in thread id 139991270131456 and this is thread id 139991166502656. [SQL: 'SELECT "index".id AS index_id, "index".entity_id AS index_entity_id, "index".timestamp AS index_timestamp, "index".entity_type AS index_entity_type, "index".exchange AS index_exchange, "index".code AS index_code, "index".name AS index_name, "index".is_delisted AS index_is_delisted, "index".category AS index_category, "index".base_point AS index_base_point, "index".list_date AS index_list_date \nFROM "index" \nWHERE "index".exchange IN (?) ORDER BY "index".code ASC'] [parameters: [{}]] (Background on this error at: http://sqlalche.me/e/f405)

初步怀疑是跟全局session的修改有关

[bug]informer模块报错

报错内容:server_hostname cannot be an empty string or start with a leading dot.

原因与解决:
当你遇到这个问题,你很有可能和我一样使用了python3.7。
python 3.7 修改了 ssl.py 导致了 smtplib.SMTP_SSL 的问题,如果按照原来的
import smtplib smtplib.SMTP_SSL().connect(host='smtp.gmail.com', port=465)
会报错
ValueError: server_hostname cannot be an empty string or start with a leading dot.

解决方法:
import smtplib smtplib.SMTP_SSL(host='smtp.gmail.com').connect(host='smtp.gmail.com', port=465)

其他需修改部分:
ZVT_HOME:config.json的"smtp_port": "80",需改为"smtp_port": "465"

记录。

可否更新一份最新的data数据

我更新了最新的数据之后,发现东财的年报数据更新不全, 目前我手上的数据量,不到800只股票有19年的年报,一季度的数据量更少。
看了数据更新日志,不少获取 不到数据的。
大概类似这样的
could not get data for nested_fields:['GaoGuanZengJianList']

因此,我想问一下,能否提供一下最新的db数据放到百度盘,提供下载?

开发计划

  • 聚宽数据补全
  • 统一的主图,附图,标记绘图
  • 多级别交易的例子
  • 优化实时行情的演示
  • 优化实时数据的计算

记录tick数据报错

IntegrityError: (sqlite3.IntegrityError) UNIQUE constraint failed: coin_tick_kdata.id [SQL: 'INSERT INTO coin_tick_kdata (id, entity_id, timestamp, provider, code, name, level, "order", price, volume, turnover, direction, order_type) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'] [parameters: (('coin_binance_BTC/USDT_2019-12-26T14:51:31.552', 'coin_binance_BTC/USDT', '2019-12-26 14:51:31.552000', 'ccxt', 'BTC/USDT', 'BTC/USDT', 'tick', None, 7215.15, 0.161462, 1164.9725492999999, 'sell', None), ('coin_binance_BTC/USDT_2019-12-26T14:51:31.552_1', 'coin_binance_BTC/USDT', '2019-12-26 14:51:31.552000', 'ccxt', 'BTC/USDT', 'BTC/USDT', 'tick', None, 7215.91, 0.041979, 302.91668589, 'buy', None), ('coin_binance_BTC/USDT_2019-12-26T14:51:31.552_2', 'coin_binance_BTC/USDT', '2019-12-26 14:51:31.552000', 'ccxt', 'BTC/USDT', 'BTC/USDT', 'tick', None, 7215.94, 0.251136, 1812.18230784, 'buy', None), ('coin_binance_BTC/USDT_2019-12-26T14:51:31.961', 'coin_binance_BTC/USDT', '2019-12-26 14:51:31.961000', 'ccxt', 'BTC/USDT', 'BTC/USDT', 'tick', None, 7215.91, 0.001551, 11.19187641, 'buy', None), ('coin_binance_BTC/USDT_2019-12-26T14:51:34.138', 'coin_binance_BTC/USDT', '2019-12-26 14:51:34.138000', 'ccxt', 'BTC/USDT', 'BTC/USDT', 'tick', None, 7215.43, 0.088969, 641.94959167, 'buy', None), ('coin_binance_BTC/USDT_2019-12-26T14:51:36.413', 'coin_binance_BTC/USDT', '2019-12-26 14:51:36.413000', 'ccxt', 'BTC/USDT', 'BTC/USDT', 'tick', None, 7214.91, 0.142148, 1025.58502668, 'sell', None), ('coin_binance_BTC/USDT_2019-12-26T14:51:36.413_3', 'coin_binance_BTC/USDT', '2019-12-26 14:51:36.413000', 'ccxt', 'BTC/USDT', 'BTC/USDT', 'tick', None, 7214.9, 0.24856, 1793.335544, 'sell', None), ('coin_binance_BTC/USDT_2019-12-26T14:51:36.413_4', 'coin_binance_BTC/USDT', '2019-12-26 14:51:36.413000', 'ccxt', 'BTC/USDT', 'BTC/USDT', 'tick', None, 7214.88, 0.109292, 788.52866496, 'sell', None), ('coin_binance_BTC/USDT_2019-12-26T14:51:37.382', 'coin_binance_BTC/USDT', '2019-12-26 14:51:37.382000', 'ccxt', 'BTC/USDT', 'BTC/USDT', 'tick', None, 7215.37, 0.711563, 5134.190323309999, 'buy', None))] (Background on this error at: http://sqlalche.me/e/gkpj)

相同的时间点,多个数据,重新生成的id跟数据库已经存储的重复。

更新数据报"too many SQL variables"的解决办法

安装完以后执行 Stock.record_data()接口,provider指定eastmoney和exchange都报错误

Stock.record_data(provider='exchange')

Stock registered recorders:{'joinquant': <class 'zvt.recorders.joinquant.meta.china_stock_meta_recorder.JqChinaStockRecorder'>, 'exchange': <class 'zvt.recorders.exchange.china_stock_list_spider.ExchangeChinaStockListRecorder'>, 'eastmoney': <class 'zvt.recorders.eastmoney.meta.china_stock_meta_recorder.EastmoneyChinaStockListRecorder'>}
Empty DataFrame
Columns: [code, name, list_date]
Index: []
Traceback (most recent call last):
File "D:\Anaconda3\lib\site-packages\sqlalchemy\engine\base.py", line 1193, in _execute_context
context)
File "D:\Anaconda3\lib\site-packages\sqlalchemy\engine\default.py", line 509, in do_execute
cursor.execute(statement, parameters)
sqlite3.OperationalError: too many SQL variables

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "", line 1, in
File "D:\Anaconda3\lib\site-packages\zvt\contract\schema.py", line 152, in record_data
r.run()
File "D:\Anaconda3\lib\site-packages\zvt\recorders\exchange\china_stock_list_spider.py", line 23, in run
self.download_stock_list(response=resp, exchange='sh')
File "D:\Anaconda3\lib\site-packages\zvt\recorders\exchange\china_stock_list_spider.py", line 60, in download_stock_list
df_to_db(df=df, data_schema=self.data_schema, provider=self.provider, force_update=False)
File "D:\Anaconda3\lib\site-packages\zvt\contract\api.py", line 446, in df_to_db

从3月31日版本升级到4月最新的版本,出现结构异常

AttributeError: 'Stock' object has no attribute 'industries'

请问,是否有如下东西:
1、模型升级的sql文件
2、migration脚本?

如东财,有一段更数账务数据,会遇到判断这个票是什么类型的东西,更新后的代码就没有这个归属关系,导致跑数异常
def get_company_type(stock_domain: StockDetail):
industries = stock_domain.industries.split(',')
if ('银行' in industries) or ('信托' in industries):
return CompanyType.yinhang
if '保险' in industries:
return CompanyType.baoxian
if '证券' in industries:
return CompanyType.quanshang
return CompanyType.qiye

def company_type_flag(security_item):
try:
company_type = get_company_type(security_item)

    if company_type == CompanyType.qiye:
        return "4"
    if company_type == CompanyType.quanshang:
        return "1"
    if company_type == CompanyType.baoxian:
        return "2"
    if company_type == CompanyType.yinhang:
        return "3"
except Exception as e:
    logger.exception(f"id{security_item.code}-{security_item.industries}", e)

param = {
    "color": "w",
    "fc": get_fc(security_item)
}

resp = requests.post('https://emh5.eastmoney.com/api/CaiWuFenXi/GetCompanyType', json=param)

ct = resp.json().get('Result').get('CompanyType')

logger.warning("{} not catching company type:{}".format(security_item, ct))

return ct

BlockStock记录新浪板块资金流入出错

In [2]: BlockMoneyFlow.record_data(codes=['gn_jght'])
BlockMoneyFlow registered recorders:{'sina': <class 'zvt.recorders.sina.money_flow.sina_block_money_flow_recorder.SinaBlockMoneyFlowRecorder'>}
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-3b3704d6ea6e> in <module>
----> 1 BlockMoneyFlow.record_data(codes=['gn_jght'])

~/workspace/github/zvtvz/zvt/zvdata/__init__.py in record_data(cls, provider_index, provider, exchanges, entity_ids, codes, batch_size, force_update, sleeping_time, default_size, real_time, fix_duplicate_way, start_timestamp, end_timestamp, close_hour, close_minute)
    232                 # 2)the table of schema with IntervalLevel format is {entity}_{level}_{event}
    233                 table: str = cls.__tablename__
--> 234                 level = IntervalLevel(table.split('_')[1])
    235                 r = recorder_class(exchanges=exchanges, entity_ids=entity_ids, codes=codes, batch_size=batch_size,
    236                                    force_update=force_update, sleeping_time=sleeping_time, default_size=default_size,

~/workspace/github/zvtvz/zvt/ve/lib/python3.6/enum.py in __call__(cls, value, names, module, qualname, type, start)
    289         """
    290         if names is None:  # simple value lookup
--> 291             return cls.__new__(cls, value)
    292         # otherwise, functional API: we're creating a new Enum type
    293         return cls._create_(value, names, module=module, qualname=qualname, type=type, start=start)

~/workspace/github/zvtvz/zvt/ve/lib/python3.6/enum.py in __new__(cls, value)
    531                     return member
    532         # still not found -- try _missing_ hook
--> 533         return cls._missing_(value)
    534
    535     def _generate_next_value_(name, start, count, last_values):

~/workspace/github/zvtvz/zvt/ve/lib/python3.6/enum.py in _missing_(cls, value)
    544     @classmethod
    545     def _missing_(cls, value):
--> 546         raise ValueError("%r is not a valid %s" % (value, cls.__name__))
    547
    548     def __repr__(self):

ValueError: 'money' is not a valid IntervalLevel

直接使用SinaBlockMoneyFlowRecorder可以,应该是代理的构造函数的问题

小类Graph导入错误

dcc.Graph无法找到,具体看下面。

def get_trader_detail_figures(trader_domain: business.Trader,
account_reader: AccountReader,
order_reader: OrderReader):
graph_list = []

if account_reader:
    account_data, account_layout = account_reader.data_drawer().draw_line(render=None, keep_ui_state=False)

    for trader_name in account_reader.trader_names:
        graph_list.append(dcc.Graph(

把通用的逻辑放到zvdata

zvdata是recorder,factor的抽象实现,不包含具体的实现,zvt通过注册的方式实现相应的金融数据的recorder和factor.

抓取和分析其他类型的数据使用zvdata也很容易实现。

文档不足,难以学习使用?

我是刚开始量化这方面的学习,一直在寻找一个简单易用的本地量化程序。
我发现这个项目的数据是很齐全的,不过我不知道该如何开始编写我自己的策略,并用它来走遍全部流程。
如果有这方面的example就好了。或者希望能在Readme中添加相关知识文档的链接,比如我现在其实不太懂Factor该怎么自定义和使用。

jq的k线数据记录问题

目前是只保存前复权数据,当数据变动时,在on_finish_entity里面把之前的数据按最新的factor计算,这里有一个问题,on_finish_entity可能在全部抓完后才回调,可能出现用最后entity的factor计算其他entity的错误。

  • 建议计算逻辑直接放在抓取后

  • 建议保存后复权数据,因为后面factor的计算如果用qfq,当数据变动,也需要重新计算,有时作回测hfq是个好选择

东财数据维护

目前东财数据的recorder没有开源,为了该数据源能够更长久的使用,打算使用基础数据+patch中转更新的方式来提供.

基础数据(到2019-07-06):

https://pan.baidu.com/s/17iLVJDcRnmu-LgRGFqItNA

提取码: pv9d

增量数据更新方案:
可以使用sqlite diff工具来生成diff,把diff单独放一个repo,或者自己的服务器,或者ocs

zvt_trader.py get error

/Users/leo/Github/zvt/ve/bin/python /Users/leo/Github/zvt/zvt/trader/zvt_trader.py
Traceback (most recent call last):
File "/Users/leo/Github/zvt/zvt/trader/zvt_trader.py", line 29, in
end_timestamp='2019-05-01', provider=Provider.NETEASE).run()
File "/Users/leo/Github/zvt/zvt/trader/trader.py", line 145, in init
codes=self.codes, start_timestamp=self.start_timestamp, end_timestamp=self.end_timestamp)
TypeError: init_selectors() got an unexpected keyword argument 'security_list'

etf估值支持

实现1

1)etf作为index的一种,其category为etf

2)StockIndex里面增加字段

    # 报告期,season1,half_year,season2,year
    report_period = Column(String(length=32))
    # 3-31,6-30,9-30,12-31
    report_date = Column(DateTime)

    # 占净值比例
    proportion = Column(Float)
    # 持有股票
    shares = Column(Float)
    # 持有股票的市值
    market_cap = Column(Float)

影响,stock_meta相关的数据库需要做migration

alter table stock_index
	add entity_id VARCHAR(128);

alter table stock_index
	add report_date DATETIME;

alter table stock_index
	add report_period VARCHAR(128);

alter table stock_index
	add proportion FLOAT;

alter table stock_index
	add shares FLOAT ;

alter table stock_index
	add market_cap FLOAT;

实现2
实现1过于复杂,不易理解。
决定重新设计 股票组合 和 股票 的关系

主要原则:
1)不使用关系,适当冗余
2)只保留 股票和组合 必要的字段
3)支持持仓变化

由于etf大扩容,很长一段时间内,**的各类etf都是极好的资产,并且下一轮牛市跟这个将极度相关,故花些时间实现这个。

之前@yinianfangxia的文章:
https://zhuanlan.zhihu.com/p/83168857

基于EastmoneyMoreDataRecorder的记录问题

class EastmoneyMoreDataRecorder(BaseEastmoneyRecorder, TimeSeriesDataRecorder):
def evaluate_start_end_size_timestamps(self, entity):
。。。。。
if latest_record:
remote_record = self.get_remote_latest_record(entity)
if not remote_record or (
latest_record[0].id == remote_record.id):
return None, None, 0, None
else:
return None, None, 10, None

    return None, None, 1000, None

貌似evaluate_start_end_size_timestamps这里的处理有问题,如果第一次获取数据超过1000只能获取最新的1000条,增量更新时超过10条将只能获取最新10条。

东财板块行情数据

抓取东财板块(行业,概念)历史行情(周线,月线)数据,用于大方向选股。

[dev][bug] 如果函数放在常驻程序里面运行,会出现异常

Traceback (most recent call last):
File "/home/devis/2.OutlierAnalysis/zvt/zvdata/recorder.py", line 342, in run
domain_item = self.generate_domain(entity_item, original_item)
File "/home/devis/2.OutlierAnalysis/zvt/zvdata/recorder.py", line 242, in generate_domain
entity_id=entity.id, filters=[self.data_schema.id == the_id], return_type='domain')
File "/home/devis/2.OutlierAnalysis/zvt/zvdata/api.py", line 115, in get_data
return query.all()
File "/home/devis/2.OutlierAnalysis/zvt/ve/lib/python3.7/site-packages/sqlalchemy/orm/query.py", line 2843, in all
return list(self)
File "/home/devis/2.OutlierAnalysis/zvt/ve/lib/python3.7/site-packages/sqlalchemy/orm/query.py", line 2995, in iter
return self._execute_and_instances(context)
File "/home/devis/2.OutlierAnalysis/zvt/ve/lib/python3.7/site-packages/sqlalchemy/orm/query.py", line 3016, in _execute_and_instances
close_with_result=True)
File "/home/devis/2.OutlierAnalysis/zvt/ve/lib/python3.7/site-packages/sqlalchemy/orm/query.py", line 3025, in _get_bind_args
**kw
File "/home/devis/2.OutlierAnalysis/zvt/ve/lib/python3.7/site-packages/sqlalchemy/orm/query.py", line 3007, in _connection_from_session
conn = self.session.connection(**kw)
File "/home/devis/2.OutlierAnalysis/zvt/ve/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 1046, in connection
execution_options=execution_options)
File "/home/devis/2.OutlierAnalysis/zvt/ve/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 1051, in _connection_for_bind
engine, execution_options)
File "/home/devis/2.OutlierAnalysis/zvt/ve/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 388, in _connection_for_bind
self._assert_active()
File "/home/devis/2.OutlierAnalysis/zvt/ve/lib/python3.7/site-packages/sqlalchemy/orm/session.py", line 264, in _assert_active
"This session is in 'prepared' state; no further "
sqlalchemy.exc.InvalidRequestError: This session is in 'prepared' state; no further SQL can be emitted within this transaction.

个人怀疑,跟session的状态有关。我现在的做法是恢复之前的异常捕捉代码。

示例里重复运行 t = MyMaTrader, t.run,会报错

t = MyMaTrader(codes=['000338'], level=IntervalLevel.LEVEL_1DAY, start_timestamp='2019-01-01',
...: ...: end_timestamp='2019-06-30', trader_name='000338_ma_trader')
InvalidRequestError: This Session's transaction has been rolled back due to a previous exception during flush. To begin a new transaction with this Session, first issue Session.rollback(). Origi
nal exception was: (sqlite3.IntegrityError) UNIQUE constraint failed: sim_account.id

更新东方财富时报这个错误,请问怎么解决?

更新东方财富时报这个错误,请问怎么解决?

2020-07-02 15:29:45,843  INFO  MainThread  run to 2213/3758
2020-07-02 15:29:46,014  INFO  MainThread  entity_id:stock_sz_300813,evaluate_start_end_size_timestamps result:None,None,2,None
2020-07-02 15:29:46,014  INFO  MainThread  sleeping 5 seconds
2020-07-02 15:30:01,188  ERROR  MainThread  code:200,content:�V
J-.�)Q��+���Q
.I,)-V��5400�Q�M-.NLOU�Rz��������>�_�bC��)+�.��b�R%%����"ϼ�|%�j�J����J�f90�@l�ĒD
                                                                               ������\=���������b=�ԼԢ�d=�L�@bQe�Q4T]pIQf^�
/V�����_�
Traceback (most recent call last):
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/zvt/recorders/eastmoney/common.py", line 75, in call_eastmoney_api
    origin_result = resp.json().get('Result')
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/requests-2.24.0-py3.7.egg/requests/models.py", line 898, in json
    return complexjson.loads(self.text, **kwargs)
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/simplejson-3.16.0-py3.7-linux-x86_64.egg/simplejson/__init__.py", line 518, in loads
    return _default_decoder.decode(s)
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/simplejson-3.16.0-py3.7-linux-x86_64.egg/simplejson/decoder.py", line 370, in decode
    obj, end = self.raw_decode(s)
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/simplejson-3.16.0-py3.7-linux-x86_64.egg/simplejson/decoder.py", line 400, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
2020-07-02 15:30:01,190  ERROR  MainThread  recording data for entity_id:stock_sz_300813,<class 'zvt.domain.fundamental.dividend_financing.DividendFinancing'>,error:Expecting value: line 1 column 1 (char 0)
Traceback (most recent call last):
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/zvt/contract/recorder.py", line 400, in run
    timestamps=timestamps)
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/zvt/recorders/eastmoney/common.py", line 136, in record
    path_fields=self.path_fields)
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/zvt/recorders/eastmoney/common.py", line 104, in request
    return call_eastmoney_api(url=url, method=method, param=param, path_fields=path_fields)
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/zvt/recorders/eastmoney/common.py", line 78, in call_eastmoney_api
    raise e
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/zvt/recorders/eastmoney/common.py", line 75, in call_eastmoney_api
    origin_result = resp.json().get('Result')
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/requests-2.24.0-py3.7.egg/requests/models.py", line 898, in json
    return complexjson.loads(self.text, **kwargs)
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/simplejson-3.16.0-py3.7-linux-x86_64.egg/simplejson/__init__.py", line 518, in loads
    return _default_decoder.decode(s)
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/simplejson-3.16.0-py3.7-linux-x86_64.egg/simplejson/decoder.py", line 370, in decode
    obj, end = self.raw_decode(s)
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/simplejson-3.16.0-py3.7-linux-x86_64.egg/simplejson/decoder.py", line 400, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
2020-07-02 15:30:22,182  ERROR  MainThread  eastmoney runner2 error:Expecting value: line 1 column 1 (char 0)
Traceback (most recent call last):
  File "examples/recorders/eastmoney_data_runner2.py", line 24, in run
    DividendFinancing.record_data(provider='eastmoney')
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/zvt/contract/schema.py", line 152, in record_data
    r.run()
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/zvt/contract/recorder.py", line 481, in run
    raise raising_exception
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/zvt/contract/recorder.py", line 400, in run
    timestamps=timestamps)
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/zvt/recorders/eastmoney/common.py", line 136, in record
    path_fields=self.path_fields)
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/zvt/recorders/eastmoney/common.py", line 104, in request
    return call_eastmoney_api(url=url, method=method, param=param, path_fields=path_fields)
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/zvt/recorders/eastmoney/common.py", line 78, in call_eastmoney_api
    raise e
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/zvt/recorders/eastmoney/common.py", line 75, in call_eastmoney_api
    origin_result = resp.json().get('Result')
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/requests-2.24.0-py3.7.egg/requests/models.py", line 898, in json
    return complexjson.loads(self.text, **kwargs)
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/simplejson-3.16.0-py3.7-linux-x86_64.egg/simplejson/__init__.py", line 518, in loads
    return _default_decoder.decode(s)
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/simplejson-3.16.0-py3.7-linux-x86_64.egg/simplejson/decoder.py", line 370, in decode
    obj, end = self.raw_decode(s)
  File "/home/markqiu/.pyenv/versions/3.7.7/lib/python3.7/site-packages/simplejson-3.16.0-py3.7-linux-x86_64.egg/simplejson/decoder.py", line 400, in raw_decode
    return self.scan_once(s, idx=_w(s, idx).end())
simplejson.errors.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

少文档少说明,不便学习使用

不知数据都支持什么级别的,分钟和tick的回测支持么。

目前使用过几个聚宽、米筐等,觉得易用性还是聚宽好一点,米筐的网站使用分钟数据回测也可以。
但米筐开源的rqalpha在本地没有分钟或tick数据,也没有换手率数据,本地写策略不甚方便。

另外,策略不止使用标的的K线数据;使用了持仓数据,不知ZVT是否有类似聚宽、米筐的context对象供写策略时调用持仓信息.

回测和模拟交易是否支持bar的开盘价撮合。

聚宽的回测支持开盘价撮合,模拟交易在09:27就发交易信号了,实盘跟单很是方便.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.