hikyuu 2.6.2__py3-none-win_amd64.whl → 2.6.5__py3-none-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. hikyuu/__init__.py +1 -1
  2. hikyuu/__init__.pyi +28 -13
  3. hikyuu/analysis/__init__.pyi +20 -0
  4. hikyuu/analysis/analysis.pyi +21 -1
  5. hikyuu/core.pyi +22 -2
  6. hikyuu/cpp/core310.pyd +0 -0
  7. hikyuu/cpp/core310.pyi +499 -50
  8. hikyuu/cpp/core311.pyd +0 -0
  9. hikyuu/cpp/core311.pyi +499 -50
  10. hikyuu/cpp/core312.pyd +0 -0
  11. hikyuu/cpp/core312.pyi +499 -50
  12. hikyuu/cpp/core313.pyd +0 -0
  13. hikyuu/cpp/core313.pyi +499 -50
  14. hikyuu/cpp/core39.pyd +0 -0
  15. hikyuu/cpp/core39.pyi +499 -50
  16. hikyuu/cpp/hikyuu.dll +0 -0
  17. hikyuu/cpp/hikyuu.lib +0 -0
  18. hikyuu/data/common.py +1 -1
  19. hikyuu/data/common_mysql.py +19 -0
  20. hikyuu/data/common_pytdx.py +2 -0
  21. hikyuu/data/common_sqlite3.py +1 -0
  22. hikyuu/data/hku_config_template.py +14 -0
  23. hikyuu/data/mysql_upgrade/0028.sql +95 -0
  24. hikyuu/data/pytdx_to_h5.py +53 -13
  25. hikyuu/data/pytdx_to_mysql.py +42 -9
  26. hikyuu/data/pytdx_to_taos.py +736 -0
  27. hikyuu/data/sqlite_upgrade/0028.sql +97 -0
  28. hikyuu/draw/__init__.pyi +1 -1
  29. hikyuu/draw/drawplot/__init__.pyi +1 -1
  30. hikyuu/draw/drawplot/bokeh_draw.pyi +24 -9
  31. hikyuu/draw/drawplot/echarts_draw.pyi +24 -9
  32. hikyuu/draw/drawplot/matplotlib_draw.py +26 -4
  33. hikyuu/draw/drawplot/matplotlib_draw.pyi +24 -9
  34. hikyuu/draw/kaufman.py +2 -2
  35. hikyuu/draw/kaufman.pyi +2 -2
  36. hikyuu/examples/notebook/001-overview.ipynb +65 -100
  37. hikyuu/examples/notebook/004-IndicatorOverview.ipynb +34 -32
  38. hikyuu/examples/notebook/007-SystemDetails.ipynb +64 -50
  39. hikyuu/examples/notebook/010-Portfolio.ipynb +120 -124
  40. hikyuu/extend.py +1 -1
  41. hikyuu/extend.pyi +24 -9
  42. hikyuu/fetcher/stock/zh_block_em.py +349 -5
  43. hikyuu/fetcher/stock/zh_stock_a_pytdx.py +2 -1
  44. hikyuu/gui/HikyuuTDX.py +47 -24
  45. hikyuu/gui/data/ImportBlockInfoTask.py +1 -1
  46. hikyuu/gui/data/ImportHistoryFinanceTask.py +48 -44
  47. hikyuu/gui/data/ImportPytdxTimeToH5Task.py +3 -1
  48. hikyuu/gui/data/ImportPytdxToH5Task.py +4 -2
  49. hikyuu/gui/data/ImportPytdxTransToH5Task.py +3 -1
  50. hikyuu/gui/data/ImportWeightToSqliteTask.py +2 -1
  51. hikyuu/gui/data/ImportZhBond10Task.py +1 -1
  52. hikyuu/gui/data/MainWindow.py +123 -106
  53. hikyuu/gui/data/UsePytdxImportToH5Thread.py +7 -3
  54. hikyuu/gui/data/UseQmtImportToH5Thread.py +1 -0
  55. hikyuu/gui/data/UseTdxImportToH5Thread.py +2 -1
  56. hikyuu/hub.pyi +6 -6
  57. hikyuu/include/hikyuu/Block.h +20 -0
  58. hikyuu/include/hikyuu/KQuery.h +8 -0
  59. hikyuu/include/hikyuu/MarketInfo.h +6 -0
  60. hikyuu/include/hikyuu/Stock.h +1 -1
  61. hikyuu/include/hikyuu/StockManager.h +6 -0
  62. hikyuu/include/hikyuu/data_driver/BaseInfoDriver.h +35 -0
  63. hikyuu/include/hikyuu/indicator/Indicator.h +5 -0
  64. hikyuu/include/hikyuu/indicator/IndicatorImp.h +8 -3
  65. hikyuu/include/hikyuu/indicator/build_in.h +1 -0
  66. hikyuu/include/hikyuu/indicator/crt/BARSLASTCOUNT.h +33 -0
  67. hikyuu/include/hikyuu/indicator/crt/INSUM.h +5 -10
  68. hikyuu/include/hikyuu/indicator/crt/RSI.h +2 -18
  69. hikyuu/include/hikyuu/indicator/imp/IBarsLastCount.h +27 -0
  70. hikyuu/include/hikyuu/plugin/backtest.h +3 -2
  71. hikyuu/include/hikyuu/plugin/device.h +6 -3
  72. hikyuu/include/hikyuu/plugin/extind.h +150 -0
  73. hikyuu/include/hikyuu/plugin/interface/BackTestPluginInterface.h +2 -1
  74. hikyuu/include/hikyuu/plugin/interface/DevicePluginInterface.h +1 -0
  75. hikyuu/include/hikyuu/plugin/interface/ExtendIndicatorsPluginInterface.h +26 -0
  76. hikyuu/include/hikyuu/plugin/interface/TMReportPluginInterface.h +80 -0
  77. hikyuu/include/hikyuu/plugin/interface/plugins.h +4 -0
  78. hikyuu/include/hikyuu/strategy/BrokerTradeManager.h +7 -5
  79. hikyuu/include/hikyuu/strategy/Strategy.h +22 -9
  80. hikyuu/include/hikyuu/trade_manage/OrderBrokerBase.h +11 -4
  81. hikyuu/include/hikyuu/trade_manage/Performance.h +17 -9
  82. hikyuu/include/hikyuu/trade_manage/PositionExtInfo.h +92 -0
  83. hikyuu/include/hikyuu/trade_manage/PositionRecord.h +7 -1
  84. hikyuu/include/hikyuu/trade_manage/TradeManager.h +8 -5
  85. hikyuu/include/hikyuu/trade_manage/TradeManagerBase.h +66 -5
  86. hikyuu/include/hikyuu/trade_manage/TradeRecord.h +9 -1
  87. hikyuu/include/hikyuu/trade_sys/multifactor/MultiFactorBase.h +8 -5
  88. hikyuu/include/hikyuu/trade_sys/multifactor/crt/MF_EqualWeight.h +4 -1
  89. hikyuu/include/hikyuu/trade_sys/multifactor/crt/MF_ICIRWeight.h +4 -1
  90. hikyuu/include/hikyuu/trade_sys/multifactor/crt/MF_ICWeight.h +4 -1
  91. hikyuu/include/hikyuu/trade_sys/multifactor/crt/MF_Weight.h +4 -1
  92. hikyuu/include/hikyuu/trade_sys/multifactor/imp/EqualWeightMultiFactor.h +2 -1
  93. hikyuu/include/hikyuu/trade_sys/multifactor/imp/ICIRMultiFactor.h +2 -1
  94. hikyuu/include/hikyuu/trade_sys/multifactor/imp/ICMultiFactor.h +2 -1
  95. hikyuu/include/hikyuu/trade_sys/multifactor/imp/WeightMultiFactor.h +1 -1
  96. hikyuu/include/hikyuu/trade_sys/selector/crt/SE_Optimal.h +8 -0
  97. hikyuu/include/hikyuu/trade_sys/selector/imp/optimal/OptimalEvaluateSelector.h +28 -0
  98. hikyuu/include/hikyuu/trade_sys/selector/imp/optimal/OptimalSelectorBase.h +1 -0
  99. hikyuu/include/hikyuu/trade_sys/system/TradeRequest.h +7 -4
  100. hikyuu/include/hikyuu/trade_sys/system/imp/WalkForwardTradeManager.h +17 -13
  101. hikyuu/include/hikyuu/utilities/DllLoader.h +226 -0
  102. hikyuu/include/hikyuu/utilities/datetime/Datetime.h +20 -0
  103. hikyuu/include/hikyuu/utilities/datetime/TimeDelta.h +6 -0
  104. hikyuu/include/hikyuu/utilities/plugin/PluginLoader.h +10 -10
  105. hikyuu/include/hikyuu/utilities/thread/{MQStealThreadPool.h → GlobalMQStealThreadPool.h} +12 -12
  106. hikyuu/include/hikyuu/utilities/thread/GlobalMQThreadPool.h +271 -0
  107. hikyuu/include/hikyuu/utilities/thread/{StealThreadPool.h → GlobalStealThreadPool.h} +11 -10
  108. hikyuu/include/hikyuu/utilities/thread/GlobalThreadPool.h +224 -0
  109. hikyuu/include/hikyuu/utilities/thread/InterruptFlag.h +16 -0
  110. hikyuu/include/hikyuu/utilities/thread/MQThreadPool.h +40 -77
  111. hikyuu/include/hikyuu/utilities/thread/ThreadPool.h +31 -59
  112. hikyuu/include/hikyuu/utilities/thread/ThreadSafeQueue.h +4 -0
  113. hikyuu/include/hikyuu/utilities/thread/algorithm.h +9 -9
  114. hikyuu/include/hikyuu/utilities/thread/thread.h +4 -0
  115. hikyuu/include/hikyuu/version.h +4 -4
  116. hikyuu/plugin/backtest.dll +0 -0
  117. hikyuu/plugin/dataserver.dll +0 -0
  118. hikyuu/plugin/device.dll +0 -0
  119. hikyuu/plugin/extind.dll +0 -0
  120. hikyuu/plugin/import2hdf5.dll +0 -0
  121. hikyuu/plugin/tmreport.dll +0 -0
  122. hikyuu/trade_manage/__init__.pyi +23 -8
  123. hikyuu/trade_manage/broker.py +8 -8
  124. hikyuu/trade_manage/broker.pyi +4 -4
  125. hikyuu/trade_manage/broker_easytrader.py +3 -3
  126. hikyuu/trade_manage/broker_easytrader.pyi +2 -2
  127. hikyuu/trade_manage/broker_mail.py +2 -2
  128. hikyuu/trade_manage/broker_mail.pyi +2 -2
  129. hikyuu/trade_manage/trade.pyi +23 -8
  130. hikyuu/util/singleton.pyi +1 -1
  131. {hikyuu-2.6.2.dist-info → hikyuu-2.6.5.dist-info}/METADATA +4 -3
  132. {hikyuu-2.6.2.dist-info → hikyuu-2.6.5.dist-info}/RECORD +136 -121
  133. {hikyuu-2.6.2.dist-info → hikyuu-2.6.5.dist-info}/LICENSE +0 -0
  134. {hikyuu-2.6.2.dist-info → hikyuu-2.6.5.dist-info}/WHEEL +0 -0
  135. {hikyuu-2.6.2.dist-info → hikyuu-2.6.5.dist-info}/entry_points.txt +0 -0
  136. {hikyuu-2.6.2.dist-info → hikyuu-2.6.5.dist-info}/top_level.txt +0 -0
hikyuu/extend.py CHANGED
@@ -9,7 +9,7 @@ from .core import *
9
9
  import os
10
10
  os.environ["NUMEXPR_MAX_THREADS"] = str(os.cpu_count())
11
11
 
12
- from datetime import * # NOQA: E402
12
+ from datetime import datetime, timedelta, date # NOQA: E402
13
13
  import numpy as np # NOQA: E402
14
14
  import pandas as pd # NOQA: E402
15
15
 
hikyuu/extend.pyi CHANGED
@@ -1,10 +1,7 @@
1
1
  from __future__ import annotations
2
2
  from datetime import date
3
3
  from datetime import datetime
4
- from datetime import time
5
4
  from datetime import timedelta
6
- from datetime import timezone
7
- from datetime import tzinfo
8
5
  import hikyuu.cpp.core39
9
6
  from hikyuu.cpp.core39 import ABS
10
7
  from hikyuu.cpp.core39 import ACOS
@@ -24,6 +21,7 @@ from hikyuu.cpp.core39 import AllocateFundsBase
24
21
  from hikyuu.cpp.core39 import BACKSET
25
22
  from hikyuu.cpp.core39 import BARSCOUNT
26
23
  from hikyuu.cpp.core39 import BARSLAST
24
+ from hikyuu.cpp.core39 import BARSLASTCOUNT
27
25
  from hikyuu.cpp.core39 import BARSSINCE
28
26
  from hikyuu.cpp.core39 import BARSSINCEN
29
27
  from hikyuu.cpp.core39 import BETWEEN
@@ -173,6 +171,7 @@ from hikyuu.cpp.core39 import PositionRecord
173
171
  from hikyuu.cpp.core39 import PositionRecordList
174
172
  from hikyuu.cpp.core39 import ProfitGoalBase
175
173
  from hikyuu.cpp.core39 import Query
174
+ from hikyuu.cpp.core39 import RANK
176
175
  from hikyuu.cpp.core39 import RECOVER_BACKWARD
177
176
  from hikyuu.cpp.core39 import RECOVER_EQUAL_BACKWARD
178
177
  from hikyuu.cpp.core39 import RECOVER_EQUAL_FORWARD
@@ -190,6 +189,7 @@ from hikyuu.cpp.core39 import ROUNDDOWN
190
189
  from hikyuu.cpp.core39 import ROUNDUP
191
190
  from hikyuu.cpp.core39 import RSI
192
191
  from hikyuu.cpp.core39 import SAFTYLOSS
192
+ from hikyuu.cpp.core39 import SE_EvaluateOptimal
193
193
  from hikyuu.cpp.core39 import SE_Fixed
194
194
  from hikyuu.cpp.core39 import SE_MaxFundsOptimal
195
195
  from hikyuu.cpp.core39 import SE_MultiFactor
@@ -433,22 +433,38 @@ from hikyuu.cpp.core39 import TradeRequest
433
433
  from hikyuu.cpp.core39 import TransList
434
434
  from hikyuu.cpp.core39 import TransRecord
435
435
  from hikyuu.cpp.core39 import UPNDAY
436
+ from hikyuu.cpp.core39 import UTCOffset
436
437
  from hikyuu.cpp.core39 import VAR
437
438
  from hikyuu.cpp.core39 import VARP
438
439
  from hikyuu.cpp.core39 import VIGOR
439
440
  from hikyuu.cpp.core39 import WEAVE
440
441
  from hikyuu.cpp.core39 import WEEK
441
442
  from hikyuu.cpp.core39 import WINNER
443
+ from hikyuu.cpp.core39 import WITHDAY
444
+ from hikyuu.cpp.core39 import WITHHALFYEAR
445
+ from hikyuu.cpp.core39 import WITHHOUR
446
+ from hikyuu.cpp.core39 import WITHHOUR2
447
+ from hikyuu.cpp.core39 import WITHHOUR4
448
+ from hikyuu.cpp.core39 import WITHKTYPE
449
+ from hikyuu.cpp.core39 import WITHMIN
450
+ from hikyuu.cpp.core39 import WITHMIN15
451
+ from hikyuu.cpp.core39 import WITHMIN30
452
+ from hikyuu.cpp.core39 import WITHMIN5
453
+ from hikyuu.cpp.core39 import WITHMIN60
454
+ from hikyuu.cpp.core39 import WITHMONTH
455
+ from hikyuu.cpp.core39 import WITHQUARTER
456
+ from hikyuu.cpp.core39 import WITHWEEK
457
+ from hikyuu.cpp.core39 import WITHYEAR
442
458
  from hikyuu.cpp.core39 import WMA
443
459
  from hikyuu.cpp.core39 import YEAR
444
460
  from hikyuu.cpp.core39 import ZHBOND10
445
461
  from hikyuu.cpp.core39 import ZONGGUBEN
446
462
  from hikyuu.cpp.core39 import ZSCORE
447
- from hikyuu.cpp.core39 import __add__ as __old_TimeDelta_add__
448
463
  from hikyuu.cpp.core39 import __add__ as __old_Datetime_add__
449
- from hikyuu.cpp.core39 import __init__ as __old_Datetime_init__
450
- from hikyuu.cpp.core39 import __init__ as __old_TimeDelta_init__
464
+ from hikyuu.cpp.core39 import __add__ as __old_TimeDelta_add__
451
465
  from hikyuu.cpp.core39 import __init__ as old_Query_init
466
+ from hikyuu.cpp.core39 import __init__ as __old_TimeDelta_init__
467
+ from hikyuu.cpp.core39 import __init__ as __old_Datetime_init__
452
468
  from hikyuu.cpp.core39 import __sub__ as __old_TimeDelta_sub__
453
469
  from hikyuu.cpp.core39 import __sub__ as __old_Datetime_sub__
454
470
  from hikyuu.cpp.core39 import active_device
@@ -484,6 +500,7 @@ from hikyuu.cpp.core39 import hikyuu_init
484
500
  from hikyuu.cpp.core39 import inner_analysis_sys_list
485
501
  from hikyuu.cpp.core39 import inner_combinate_ind_analysis
486
502
  from hikyuu.cpp.core39 import inner_combinate_ind_analysis_with_block
503
+ from hikyuu.cpp.core39 import is_valid_license
487
504
  from hikyuu.cpp.core39 import isinf
488
505
  from hikyuu.cpp.core39 import isnan
489
506
  from hikyuu.cpp.core39 import open_ostream_to_python
@@ -506,7 +523,7 @@ import numpy as np
506
523
  import os as os
507
524
  import pandas as pd
508
525
  import sys as sys
509
- __all__ = ['ABS', 'ACOS', 'AD', 'ADVANCE', 'AF_EqualWeight', 'AF_FixedWeight', 'AF_FixedWeightList', 'AF_MultiFactor', 'ALIGN', 'AMA', 'ASIN', 'ATAN', 'ATR', 'AVEDEV', 'AllocateFundsBase', 'BACKSET', 'BARSCOUNT', 'BARSLAST', 'BARSSINCE', 'BARSSINCEN', 'BETWEEN', 'BLOCKSETNUM', 'BUSINESS', 'Block', 'BlockInfoDriver', 'BorrowRecord', 'BrokerPositionRecord', 'CEILING', 'CN_Bool', 'CN_OPLine', 'CONTEXT', 'CONTEXT_K', 'CORR', 'COS', 'COST', 'COUNT', 'CROSS', 'CVAL', 'CYCLE', 'C_AMO', 'C_CLOSE', 'C_HIGH', 'C_KDATA', 'C_LOW', 'C_OPEN', 'C_VOL', 'ConditionBase', 'Constant', 'CostRecord', 'DATE', 'DAY', 'DEBUG', 'DECLINE', 'DEVSQ', 'DIFF', 'DIRECT', 'DISCARD', 'DMA', 'DOWNNDAY', 'DROPNA', 'DataDriverFactory', 'Datetime', 'DatetimeList', 'DatetimeList_to_df', 'DatetimeList_to_np', 'Datetime_date', 'Datetime_datetime', 'Days', 'EMA', 'ERROR', 'EVERY', 'EV_Bool', 'EV_TwoLine', 'EXIST', 'EXP', 'EnvironmentBase', 'FATAL', 'FILTER', 'FINANCE', 'FLOOR', 'FundsRecord', 'HHV', 'HHVBARS', 'HKUException', 'HOUR', 'HSL', 'Hours', 'IC', 'ICIR', 'IF', 'INBLOCK', 'INDEXA', 'INDEXADV', 'INDEXC', 'INDEXDEC', 'INDEXH', 'INDEXL', 'INDEXO', 'INDEXV', 'INFO', 'INSUM', 'INTPART', 'IR', 'ISINF', 'ISINFA', 'ISLASTBAR', 'ISNA', 'IndParam', 'Indicator', 'IndicatorImp', 'JUMPDOWN', 'JUMPUP', 'KALMAN', 'KDATA_PART', 'KData', 'KDataDriver', 'KDataToHdf5Importer', 'KData_getitem', 'KData_iter', 'KData_to_df', 'KData_to_np', 'KRecord', 'KRecordList', 'LAST', 'LASTVALUE', 'LIUTONGPAN', 'LLV', 'LLVBARS', 'LN', 'LOG', 'LOG_LEVEL', 'LONGCROSS', 'LoanRecord', 'MA', 'MACD', 'MAX', 'MAXYEAR', 'MDD', 'MF_EqualWeight', 'MF_ICIRWeight', 'MF_ICWeight', 'MF_Weight', 'MIN', 'MINUTE', 'MINYEAR', 'MM_FixedCapital', 'MM_FixedCapitalFunds', 'MM_FixedCount', 'MM_FixedCountTps', 'MM_FixedPercent', 'MM_FixedRisk', 'MM_FixedUnits', 'MM_Nothing', 'MM_WilliamsFixedRisk', 'MOD', 'MONTH', 'MRR', 'MarketInfo', 'Microseconds', 'Milliseconds', 'Minutes', 'MoneyManagerBase', 'MultiFactorBase', 'NDAY', 'NOT', 'OFF', 'OrderBrokerBase', 'PF_Simple', 'PF_WithoutAF', 'PG_FixedHoldDays', 'PG_FixedPercent', 'PG_NoGoal', 'POS', 'POW', 'PRICELIST', 'Parameter', 'Parameter_items', 'Parameter_iter', 'Parameter_keys', 'Parameter_to_dict', 'Performance', 'Portfolio', 'PositionRecord', 'PositionRecordList', 'ProfitGoalBase', 'Query', 'RECOVER_BACKWARD', 'RECOVER_EQUAL_BACKWARD', 'RECOVER_EQUAL_FORWARD', 'RECOVER_FORWARD', 'REF', 'REPLACE', 'RESULT', 'REVERSE', 'ROC', 'ROCP', 'ROCR', 'ROCR100', 'ROUND', 'ROUNDDOWN', 'ROUNDUP', 'RSI', 'SAFTYLOSS', 'SE_Fixed', 'SE_MaxFundsOptimal', 'SE_MultiFactor', 'SE_PerformanceOptimal', 'SE_Signal', 'SGN', 'SG_Add', 'SG_AllwaysBuy', 'SG_And', 'SG_Band', 'SG_Bool', 'SG_Buy', 'SG_Cross', 'SG_CrossGold', 'SG_Cycle', 'SG_Div', 'SG_Flex', 'SG_Mul', 'SG_OneSide', 'SG_Or', 'SG_Sell', 'SG_Single', 'SG_Single2', 'SG_Sub', 'SIN', 'SLICE', 'SLOPE', 'SMA', 'SPEARMAN', 'SP_FixedPercent', 'SP_FixedValue', 'SQRT', 'STDEV', 'STDP', 'ST_FixedPercent', 'ST_Indicator', 'ST_Saftyloss', 'SUM', 'SUMBARS', 'SYS_Simple', 'SYS_WalkForward', 'ScoreRecord', 'ScoreRecordList', 'Seconds', 'SelectorBase', 'SignalBase', 'SlippageBase', 'SpotRecord', 'Stock', 'StockManager', 'StockTypeInfo', 'StockWeight', 'StockWeightList', 'StoplossBase', 'Strategy', 'StrategyContext', 'System', 'SystemPart', 'SystemWeight', 'SystemWeightList', 'TAN', 'TA_ACCBANDS', 'TA_ACOS', 'TA_AD', 'TA_ADD', 'TA_ADOSC', 'TA_ADX', 'TA_ADXR', 'TA_APO', 'TA_AROON', 'TA_AROONOSC', 'TA_ASIN', 'TA_ATAN', 'TA_ATR', 'TA_AVGDEV', 'TA_AVGPRICE', 'TA_BBANDS', 'TA_BETA', 'TA_BOP', 'TA_CCI', 'TA_CDL2CROWS', 'TA_CDL3BLACKCROWS', 'TA_CDL3INSIDE', 'TA_CDL3LINESTRIKE', 'TA_CDL3OUTSIDE', 'TA_CDL3STARSINSOUTH', 'TA_CDL3WHITESOLDIERS', 'TA_CDLABANDONEDBABY', 'TA_CDLADVANCEBLOCK', 'TA_CDLBELTHOLD', 'TA_CDLBREAKAWAY', 'TA_CDLCLOSINGMARUBOZU', 'TA_CDLCONCEALBABYSWALL', 'TA_CDLCOUNTERATTACK', 'TA_CDLDARKCLOUDCOVER', 'TA_CDLDOJI', 'TA_CDLDOJISTAR', 'TA_CDLDRAGONFLYDOJI', 'TA_CDLENGULFING', 'TA_CDLEVENINGDOJISTAR', 'TA_CDLEVENINGSTAR', 'TA_CDLGAPSIDESIDEWHITE', 'TA_CDLGRAVESTONEDOJI', 'TA_CDLHAMMER', 'TA_CDLHANGINGMAN', 'TA_CDLHARAMI', 'TA_CDLHARAMICROSS', 'TA_CDLHIGHWAVE', 'TA_CDLHIKKAKE', 'TA_CDLHIKKAKEMOD', 'TA_CDLHOMINGPIGEON', 'TA_CDLIDENTICAL3CROWS', 'TA_CDLINNECK', 'TA_CDLINVERTEDHAMMER', 'TA_CDLKICKING', 'TA_CDLKICKINGBYLENGTH', 'TA_CDLLADDERBOTTOM', 'TA_CDLLONGLEGGEDDOJI', 'TA_CDLLONGLINE', 'TA_CDLMARUBOZU', 'TA_CDLMATCHINGLOW', 'TA_CDLMATHOLD', 'TA_CDLMORNINGDOJISTAR', 'TA_CDLMORNINGSTAR', 'TA_CDLONNECK', 'TA_CDLPIERCING', 'TA_CDLRICKSHAWMAN', 'TA_CDLRISEFALL3METHODS', 'TA_CDLSEPARATINGLINES', 'TA_CDLSHOOTINGSTAR', 'TA_CDLSHORTLINE', 'TA_CDLSPINNINGTOP', 'TA_CDLSTALLEDPATTERN', 'TA_CDLSTICKSANDWICH', 'TA_CDLTAKURI', 'TA_CDLTASUKIGAP', 'TA_CDLTHRUSTING', 'TA_CDLTRISTAR', 'TA_CDLUNIQUE3RIVER', 'TA_CDLUPSIDEGAP2CROWS', 'TA_CDLXSIDEGAP3METHODS', 'TA_CEIL', 'TA_CMO', 'TA_CORREL', 'TA_COS', 'TA_COSH', 'TA_DEMA', 'TA_DIV', 'TA_DX', 'TA_EMA', 'TA_EXP', 'TA_FLOOR', 'TA_HT_DCPERIOD', 'TA_HT_DCPHASE', 'TA_HT_PHASOR', 'TA_HT_SINE', 'TA_HT_TRENDLINE', 'TA_HT_TRENDMODE', 'TA_IMI', 'TA_KAMA', 'TA_LINEARREG', 'TA_LINEARREG_ANGLE', 'TA_LINEARREG_INTERCEPT', 'TA_LINEARREG_SLOPE', 'TA_LN', 'TA_LOG10', 'TA_MA', 'TA_MACD', 'TA_MACDEXT', 'TA_MACDFIX', 'TA_MAMA', 'TA_MAVP', 'TA_MAX', 'TA_MAXINDEX', 'TA_MEDPRICE', 'TA_MFI', 'TA_MIDPOINT', 'TA_MIDPRICE', 'TA_MIN', 'TA_MININDEX', 'TA_MINMAX', 'TA_MINMAXINDEX', 'TA_MINUS_DI', 'TA_MINUS_DM', 'TA_MOM', 'TA_MULT', 'TA_NATR', 'TA_OBV', 'TA_PLUS_DI', 'TA_PLUS_DM', 'TA_PPO', 'TA_ROC', 'TA_ROCP', 'TA_ROCR', 'TA_ROCR100', 'TA_RSI', 'TA_SAR', 'TA_SAREXT', 'TA_SIN', 'TA_SINH', 'TA_SMA', 'TA_SQRT', 'TA_STDDEV', 'TA_STOCH', 'TA_STOCHF', 'TA_STOCHRSI', 'TA_SUB', 'TA_SUM', 'TA_T3', 'TA_TAN', 'TA_TANH', 'TA_TEMA', 'TA_TRANGE', 'TA_TRIMA', 'TA_TRIX', 'TA_TSF', 'TA_TYPPRICE', 'TA_ULTOSC', 'TA_VAR', 'TA_WCLPRICE', 'TA_WILLR', 'TA_WMA', 'TC_FixedA', 'TC_FixedA2015', 'TC_FixedA2017', 'TC_TestStub', 'TC_Zero', 'TIME', 'TIMELINE', 'TIMELINEVOL', 'TR', 'TRACE', 'TURNOVER', 'TimeDelta', 'TimeDelta_timedelta', 'TimeLineList', 'TimeLineRecord', 'TimeLine_to_df', 'TimeLine_to_np', 'TradeCostBase', 'TradeManager', 'TradeRecord', 'TradeRecordList', 'TradeRequest', 'TransList', 'TransList_to_df', 'TransList_to_np', 'TransRecord', 'UPNDAY', 'VAR', 'VARP', 'VIGOR', 'WARN', 'WEAVE', 'WEEK', 'WINNER', 'WMA', 'YEAR', 'ZHBOND10', 'ZONGGUBEN', 'ZSCORE', 'active_device', 'backtest', 'batch_calculate_inds', 'can_upgrade', 'close_ostream_to_python', 'close_spend_time', 'combinate_ind', 'combinate_index', 'constant', 'crtBrokerTM', 'crtSEOptimal', 'crtTM', 'crt_pf_strategy', 'crt_sys_strategy', 'date', 'datetime', 'fetch_trial_license', 'find_optimal_system', 'find_optimal_system_multi', 'get_block', 'get_business_name', 'get_data_from_buffer_server', 'get_date_range', 'get_kdata', 'get_last_version', 'get_log_level', 'get_stock', 'get_system_part_enum', 'get_system_part_name', 'get_version', 'get_version_git', 'get_version_with_build', 'hikyuu_init', 'inner_analysis_sys_list', 'inner_combinate_ind_analysis', 'inner_combinate_ind_analysis_with_block', 'isinf', 'isnan', 'new_Query_init', 'np', 'old_Query_init', 'open_ostream_to_python', 'open_spend_time', 'os', 'pd', 'remove_license', 'roundDown', 'roundEx', 'roundUp', 'run_in_strategy', 'set_log_level', 'set_python_in_interactive', 'set_python_in_jupyter', 'start_data_server', 'start_spot_agent', 'stop_data_server', 'stop_spot_agent', 'sys', 'time', 'timedelta', 'timezone', 'toPriceList', 'tzinfo', 'view_license']
526
+ __all__ = ['ABS', 'ACOS', 'AD', 'ADVANCE', 'AF_EqualWeight', 'AF_FixedWeight', 'AF_FixedWeightList', 'AF_MultiFactor', 'ALIGN', 'AMA', 'ASIN', 'ATAN', 'ATR', 'AVEDEV', 'AllocateFundsBase', 'BACKSET', 'BARSCOUNT', 'BARSLAST', 'BARSLASTCOUNT', 'BARSSINCE', 'BARSSINCEN', 'BETWEEN', 'BLOCKSETNUM', 'BUSINESS', 'Block', 'BlockInfoDriver', 'BorrowRecord', 'BrokerPositionRecord', 'CEILING', 'CN_Bool', 'CN_OPLine', 'CONTEXT', 'CONTEXT_K', 'CORR', 'COS', 'COST', 'COUNT', 'CROSS', 'CVAL', 'CYCLE', 'C_AMO', 'C_CLOSE', 'C_HIGH', 'C_KDATA', 'C_LOW', 'C_OPEN', 'C_VOL', 'ConditionBase', 'Constant', 'CostRecord', 'DATE', 'DAY', 'DEBUG', 'DECLINE', 'DEVSQ', 'DIFF', 'DIRECT', 'DISCARD', 'DMA', 'DOWNNDAY', 'DROPNA', 'DataDriverFactory', 'Datetime', 'DatetimeList', 'DatetimeList_to_df', 'DatetimeList_to_np', 'Datetime_date', 'Datetime_datetime', 'Days', 'EMA', 'ERROR', 'EVERY', 'EV_Bool', 'EV_TwoLine', 'EXIST', 'EXP', 'EnvironmentBase', 'FATAL', 'FILTER', 'FINANCE', 'FLOOR', 'FundsRecord', 'HHV', 'HHVBARS', 'HKUException', 'HOUR', 'HSL', 'Hours', 'IC', 'ICIR', 'IF', 'INBLOCK', 'INDEXA', 'INDEXADV', 'INDEXC', 'INDEXDEC', 'INDEXH', 'INDEXL', 'INDEXO', 'INDEXV', 'INFO', 'INSUM', 'INTPART', 'IR', 'ISINF', 'ISINFA', 'ISLASTBAR', 'ISNA', 'IndParam', 'Indicator', 'IndicatorImp', 'JUMPDOWN', 'JUMPUP', 'KALMAN', 'KDATA_PART', 'KData', 'KDataDriver', 'KDataToHdf5Importer', 'KData_getitem', 'KData_iter', 'KData_to_df', 'KData_to_np', 'KRecord', 'KRecordList', 'LAST', 'LASTVALUE', 'LIUTONGPAN', 'LLV', 'LLVBARS', 'LN', 'LOG', 'LOG_LEVEL', 'LONGCROSS', 'LoanRecord', 'MA', 'MACD', 'MAX', 'MDD', 'MF_EqualWeight', 'MF_ICIRWeight', 'MF_ICWeight', 'MF_Weight', 'MIN', 'MINUTE', 'MM_FixedCapital', 'MM_FixedCapitalFunds', 'MM_FixedCount', 'MM_FixedCountTps', 'MM_FixedPercent', 'MM_FixedRisk', 'MM_FixedUnits', 'MM_Nothing', 'MM_WilliamsFixedRisk', 'MOD', 'MONTH', 'MRR', 'MarketInfo', 'Microseconds', 'Milliseconds', 'Minutes', 'MoneyManagerBase', 'MultiFactorBase', 'NDAY', 'NOT', 'OFF', 'OrderBrokerBase', 'PF_Simple', 'PF_WithoutAF', 'PG_FixedHoldDays', 'PG_FixedPercent', 'PG_NoGoal', 'POS', 'POW', 'PRICELIST', 'Parameter', 'Parameter_items', 'Parameter_iter', 'Parameter_keys', 'Parameter_to_dict', 'Performance', 'Portfolio', 'PositionRecord', 'PositionRecordList', 'ProfitGoalBase', 'Query', 'RANK', 'RECOVER_BACKWARD', 'RECOVER_EQUAL_BACKWARD', 'RECOVER_EQUAL_FORWARD', 'RECOVER_FORWARD', 'REF', 'REPLACE', 'RESULT', 'REVERSE', 'ROC', 'ROCP', 'ROCR', 'ROCR100', 'ROUND', 'ROUNDDOWN', 'ROUNDUP', 'RSI', 'SAFTYLOSS', 'SE_EvaluateOptimal', 'SE_Fixed', 'SE_MaxFundsOptimal', 'SE_MultiFactor', 'SE_PerformanceOptimal', 'SE_Signal', 'SGN', 'SG_Add', 'SG_AllwaysBuy', 'SG_And', 'SG_Band', 'SG_Bool', 'SG_Buy', 'SG_Cross', 'SG_CrossGold', 'SG_Cycle', 'SG_Div', 'SG_Flex', 'SG_Mul', 'SG_OneSide', 'SG_Or', 'SG_Sell', 'SG_Single', 'SG_Single2', 'SG_Sub', 'SIN', 'SLICE', 'SLOPE', 'SMA', 'SPEARMAN', 'SP_FixedPercent', 'SP_FixedValue', 'SQRT', 'STDEV', 'STDP', 'ST_FixedPercent', 'ST_Indicator', 'ST_Saftyloss', 'SUM', 'SUMBARS', 'SYS_Simple', 'SYS_WalkForward', 'ScoreRecord', 'ScoreRecordList', 'Seconds', 'SelectorBase', 'SignalBase', 'SlippageBase', 'SpotRecord', 'Stock', 'StockManager', 'StockTypeInfo', 'StockWeight', 'StockWeightList', 'StoplossBase', 'Strategy', 'StrategyContext', 'System', 'SystemPart', 'SystemWeight', 'SystemWeightList', 'TAN', 'TA_ACCBANDS', 'TA_ACOS', 'TA_AD', 'TA_ADD', 'TA_ADOSC', 'TA_ADX', 'TA_ADXR', 'TA_APO', 'TA_AROON', 'TA_AROONOSC', 'TA_ASIN', 'TA_ATAN', 'TA_ATR', 'TA_AVGDEV', 'TA_AVGPRICE', 'TA_BBANDS', 'TA_BETA', 'TA_BOP', 'TA_CCI', 'TA_CDL2CROWS', 'TA_CDL3BLACKCROWS', 'TA_CDL3INSIDE', 'TA_CDL3LINESTRIKE', 'TA_CDL3OUTSIDE', 'TA_CDL3STARSINSOUTH', 'TA_CDL3WHITESOLDIERS', 'TA_CDLABANDONEDBABY', 'TA_CDLADVANCEBLOCK', 'TA_CDLBELTHOLD', 'TA_CDLBREAKAWAY', 'TA_CDLCLOSINGMARUBOZU', 'TA_CDLCONCEALBABYSWALL', 'TA_CDLCOUNTERATTACK', 'TA_CDLDARKCLOUDCOVER', 'TA_CDLDOJI', 'TA_CDLDOJISTAR', 'TA_CDLDRAGONFLYDOJI', 'TA_CDLENGULFING', 'TA_CDLEVENINGDOJISTAR', 'TA_CDLEVENINGSTAR', 'TA_CDLGAPSIDESIDEWHITE', 'TA_CDLGRAVESTONEDOJI', 'TA_CDLHAMMER', 'TA_CDLHANGINGMAN', 'TA_CDLHARAMI', 'TA_CDLHARAMICROSS', 'TA_CDLHIGHWAVE', 'TA_CDLHIKKAKE', 'TA_CDLHIKKAKEMOD', 'TA_CDLHOMINGPIGEON', 'TA_CDLIDENTICAL3CROWS', 'TA_CDLINNECK', 'TA_CDLINVERTEDHAMMER', 'TA_CDLKICKING', 'TA_CDLKICKINGBYLENGTH', 'TA_CDLLADDERBOTTOM', 'TA_CDLLONGLEGGEDDOJI', 'TA_CDLLONGLINE', 'TA_CDLMARUBOZU', 'TA_CDLMATCHINGLOW', 'TA_CDLMATHOLD', 'TA_CDLMORNINGDOJISTAR', 'TA_CDLMORNINGSTAR', 'TA_CDLONNECK', 'TA_CDLPIERCING', 'TA_CDLRICKSHAWMAN', 'TA_CDLRISEFALL3METHODS', 'TA_CDLSEPARATINGLINES', 'TA_CDLSHOOTINGSTAR', 'TA_CDLSHORTLINE', 'TA_CDLSPINNINGTOP', 'TA_CDLSTALLEDPATTERN', 'TA_CDLSTICKSANDWICH', 'TA_CDLTAKURI', 'TA_CDLTASUKIGAP', 'TA_CDLTHRUSTING', 'TA_CDLTRISTAR', 'TA_CDLUNIQUE3RIVER', 'TA_CDLUPSIDEGAP2CROWS', 'TA_CDLXSIDEGAP3METHODS', 'TA_CEIL', 'TA_CMO', 'TA_CORREL', 'TA_COS', 'TA_COSH', 'TA_DEMA', 'TA_DIV', 'TA_DX', 'TA_EMA', 'TA_EXP', 'TA_FLOOR', 'TA_HT_DCPERIOD', 'TA_HT_DCPHASE', 'TA_HT_PHASOR', 'TA_HT_SINE', 'TA_HT_TRENDLINE', 'TA_HT_TRENDMODE', 'TA_IMI', 'TA_KAMA', 'TA_LINEARREG', 'TA_LINEARREG_ANGLE', 'TA_LINEARREG_INTERCEPT', 'TA_LINEARREG_SLOPE', 'TA_LN', 'TA_LOG10', 'TA_MA', 'TA_MACD', 'TA_MACDEXT', 'TA_MACDFIX', 'TA_MAMA', 'TA_MAVP', 'TA_MAX', 'TA_MAXINDEX', 'TA_MEDPRICE', 'TA_MFI', 'TA_MIDPOINT', 'TA_MIDPRICE', 'TA_MIN', 'TA_MININDEX', 'TA_MINMAX', 'TA_MINMAXINDEX', 'TA_MINUS_DI', 'TA_MINUS_DM', 'TA_MOM', 'TA_MULT', 'TA_NATR', 'TA_OBV', 'TA_PLUS_DI', 'TA_PLUS_DM', 'TA_PPO', 'TA_ROC', 'TA_ROCP', 'TA_ROCR', 'TA_ROCR100', 'TA_RSI', 'TA_SAR', 'TA_SAREXT', 'TA_SIN', 'TA_SINH', 'TA_SMA', 'TA_SQRT', 'TA_STDDEV', 'TA_STOCH', 'TA_STOCHF', 'TA_STOCHRSI', 'TA_SUB', 'TA_SUM', 'TA_T3', 'TA_TAN', 'TA_TANH', 'TA_TEMA', 'TA_TRANGE', 'TA_TRIMA', 'TA_TRIX', 'TA_TSF', 'TA_TYPPRICE', 'TA_ULTOSC', 'TA_VAR', 'TA_WCLPRICE', 'TA_WILLR', 'TA_WMA', 'TC_FixedA', 'TC_FixedA2015', 'TC_FixedA2017', 'TC_TestStub', 'TC_Zero', 'TIME', 'TIMELINE', 'TIMELINEVOL', 'TR', 'TRACE', 'TURNOVER', 'TimeDelta', 'TimeDelta_timedelta', 'TimeLineList', 'TimeLineRecord', 'TimeLine_to_df', 'TimeLine_to_np', 'TradeCostBase', 'TradeManager', 'TradeRecord', 'TradeRecordList', 'TradeRequest', 'TransList', 'TransList_to_df', 'TransList_to_np', 'TransRecord', 'UPNDAY', 'UTCOffset', 'VAR', 'VARP', 'VIGOR', 'WARN', 'WEAVE', 'WEEK', 'WINNER', 'WITHDAY', 'WITHHALFYEAR', 'WITHHOUR', 'WITHHOUR2', 'WITHHOUR4', 'WITHKTYPE', 'WITHMIN', 'WITHMIN15', 'WITHMIN30', 'WITHMIN5', 'WITHMIN60', 'WITHMONTH', 'WITHQUARTER', 'WITHWEEK', 'WITHYEAR', 'WMA', 'YEAR', 'ZHBOND10', 'ZONGGUBEN', 'ZSCORE', 'active_device', 'backtest', 'batch_calculate_inds', 'can_upgrade', 'close_ostream_to_python', 'close_spend_time', 'combinate_ind', 'combinate_index', 'constant', 'crtBrokerTM', 'crtSEOptimal', 'crtTM', 'crt_pf_strategy', 'crt_sys_strategy', 'date', 'datetime', 'fetch_trial_license', 'find_optimal_system', 'find_optimal_system_multi', 'get_block', 'get_business_name', 'get_data_from_buffer_server', 'get_date_range', 'get_kdata', 'get_last_version', 'get_log_level', 'get_stock', 'get_system_part_enum', 'get_system_part_name', 'get_version', 'get_version_git', 'get_version_with_build', 'hikyuu_init', 'inner_analysis_sys_list', 'inner_combinate_ind_analysis', 'inner_combinate_ind_analysis_with_block', 'is_valid_license', 'isinf', 'isnan', 'new_Query_init', 'np', 'old_Query_init', 'open_ostream_to_python', 'open_spend_time', 'os', 'pd', 'remove_license', 'roundDown', 'roundEx', 'roundUp', 'run_in_strategy', 'set_log_level', 'set_python_in_interactive', 'set_python_in_jupyter', 'start_data_server', 'start_spot_agent', 'stop_data_server', 'stop_spot_agent', 'sys', 'timedelta', 'toPriceList', 'view_license']
510
527
  def DatetimeList_to_df(data):
511
528
  """
512
529
  仅在安装了pandas模块时生效,转换为pandas.DataFrame
@@ -626,8 +643,6 @@ DEBUG: hikyuu.cpp.core39.LOG_LEVEL # value = <LOG_LEVEL.DEBUG: 1>
626
643
  ERROR: hikyuu.cpp.core39.LOG_LEVEL # value = <LOG_LEVEL.ERROR: 4>
627
644
  FATAL: hikyuu.cpp.core39.LOG_LEVEL # value = <LOG_LEVEL.FATAL: 5>
628
645
  INFO: hikyuu.cpp.core39.LOG_LEVEL # value = <LOG_LEVEL.INFO: 2>
629
- MAXYEAR: int = 9999
630
- MINYEAR: int = 1
631
646
  OFF: hikyuu.cpp.core39.LOG_LEVEL # value = <LOG_LEVEL.OFF: 6>
632
647
  TRACE: hikyuu.cpp.core39.LOG_LEVEL # value = <LOG_LEVEL.TRACE: 0>
633
648
  WARN: hikyuu.cpp.core39.LOG_LEVEL # value = <LOG_LEVEL.WARN: 3>
@@ -6,8 +6,12 @@
6
6
 
7
7
  import requests
8
8
  import math
9
+ import time
10
+ import random
9
11
  import akshare as ak
10
12
  import pandas as pd
13
+ import re
14
+ from functools import lru_cache
11
15
  from hikyuu.util import *
12
16
 
13
17
  em_num_per_page = 100
@@ -42,6 +46,7 @@ def get_hybk_names():
42
46
  continue
43
47
  tmp = [(v['f12'], v['f14']) for v in data_json["data"]["diff"]]
44
48
  ret.extend(tmp)
49
+ time.sleep(random.uniform(1, 3))
45
50
  return ret
46
51
 
47
52
 
@@ -73,6 +78,7 @@ def get_hybk_cons_code(blk_code):
73
78
  if data_json["data"] is None:
74
79
  continue
75
80
  tmp = [v['f12'] for v in data_json["data"]['diff']]
81
+ time.sleep(random.uniform(1, 3))
76
82
  ret.extend(tmp)
77
83
  return ret
78
84
 
@@ -90,15 +96,350 @@ def get_all_hybk_info(code_market_dict, sep=""):
90
96
  return ret
91
97
 
92
98
 
99
+ def get_tqdm(enable: bool = True):
100
+ """
101
+ 返回适用于当前环境的 tqdm 对象。
102
+
103
+ Args:
104
+ enable (bool): 是否启用进度条。默认为 True。
105
+
106
+ Returns:
107
+ tqdm 对象。
108
+ """
109
+ if not enable:
110
+ # 如果进度条被禁用,返回一个不显示进度条的 tqdm 对象
111
+ return lambda iterable, *args, **kwargs: iterable
112
+
113
+ try:
114
+ # 尝试检查是否在 jupyter notebook 环境中,有利于退出进度条
115
+ # noinspection PyUnresolvedReferences
116
+ shell = get_ipython().__class__.__name__
117
+ if shell == "ZMQInteractiveShell":
118
+ from tqdm.notebook import tqdm
119
+ else:
120
+ from tqdm import tqdm
121
+ except (NameError, ImportError):
122
+ # 如果不在 Jupyter 环境中,就使用标准 tqdm
123
+ from tqdm import tqdm
124
+
125
+ return tqdm
126
+
127
+
128
+ def fetch_paginated_data(url: str, base_params: dict, timeout: int = 15):
129
+ """
130
+ 东方财富-分页获取数据并合并结果
131
+ https://quote.eastmoney.com/f1.html?newcode=0.000001
132
+ :param url: 股票代码
133
+ :type url: str
134
+ :param base_params: 基础请求参数
135
+ :type base_params: dict
136
+ :param timeout: 请求超时时间
137
+ :type timeout: str
138
+ :return: 合并后的数据
139
+ :rtype: pandas.DataFrame
140
+ """
141
+ # 复制参数以避免修改原始参数
142
+ params = base_params.copy()
143
+ # 获取第一页数据,用于确定分页信息
144
+ r = requests.get(url, params=params, timeout=timeout)
145
+ data_json = r.json()
146
+ # 计算分页信息
147
+ per_page_num = len(data_json["data"]["diff"])
148
+ total_page = math.ceil(data_json["data"]["total"] / per_page_num)
149
+ # 存储所有页面数据
150
+ temp_list = []
151
+ # 添加第一页数据
152
+ temp_list.append(pd.DataFrame(data_json["data"]["diff"]))
153
+ # 获取进度条
154
+ tqdm = get_tqdm()
155
+ # 获取剩余页面数据
156
+ for page in tqdm(range(2, total_page + 1), leave=False):
157
+ params.update({"pn": page})
158
+ r = requests.get(url, params=params, timeout=timeout)
159
+ data_json = r.json()
160
+ inner_temp_df = pd.DataFrame(data_json["data"]["diff"])
161
+ temp_list.append(inner_temp_df)
162
+ time.sleep(random.uniform(1, 3))
163
+ # 合并所有数据
164
+ temp_df = pd.concat(temp_list, ignore_index=True)
165
+ temp_df["f3"] = pd.to_numeric(temp_df["f3"], errors="coerce")
166
+ temp_df.sort_values(by=["f3"], ascending=False, inplace=True, ignore_index=True)
167
+ temp_df.reset_index(inplace=True)
168
+ temp_df["index"] = temp_df["index"].astype(int) + 1
169
+ return temp_df
170
+
171
+
172
+ def stock_board_concept_name_em() -> pd.DataFrame:
173
+ """
174
+ from akshare
175
+ 东方财富网-行情中心-沪深京板块-概念板块-名称
176
+ https://quote.eastmoney.com/center/boardlist.html#concept_board
177
+ :return: 概念板块-名称
178
+ :rtype: pandas.DataFrame
179
+ """
180
+ url = "https://59.push2.eastmoney.com/api/qt/clist/get"
181
+ params = {
182
+ "pn": "1",
183
+ "pz": "100",
184
+ "po": "1",
185
+ "np": "1",
186
+ "ut": "bd1d9ddb04089700cf9c27f6f7426281",
187
+ "fltt": "2",
188
+ "invt": "2",
189
+ "fid": "f12",
190
+ "fs": "m:90 t:3 f:!50",
191
+ "fields": "f2,f3,f4,f8,f12,f14,f15,f16,f17,f18,f20,f21,f24,f25,f22,f33,f11,f62,f128,f124,f107,f104,f105,f136",
192
+ }
193
+ temp_df = fetch_paginated_data(url, params)
194
+ temp_df.columns = [
195
+ "排名",
196
+ "最新价",
197
+ "涨跌幅",
198
+ "涨跌额",
199
+ "换手率",
200
+ "_",
201
+ "板块代码",
202
+ "板块名称",
203
+ "_",
204
+ "_",
205
+ "_",
206
+ "_",
207
+ "总市值",
208
+ "_",
209
+ "_",
210
+ "_",
211
+ "_",
212
+ "_",
213
+ "_",
214
+ "上涨家数",
215
+ "下跌家数",
216
+ "_",
217
+ "_",
218
+ "领涨股票",
219
+ "_",
220
+ "_",
221
+ "领涨股票-涨跌幅",
222
+ ]
223
+ temp_df = temp_df[
224
+ [
225
+ "排名",
226
+ "板块名称",
227
+ "板块代码",
228
+ "最新价",
229
+ "涨跌额",
230
+ "涨跌幅",
231
+ "总市值",
232
+ "换手率",
233
+ "上涨家数",
234
+ "下跌家数",
235
+ "领涨股票",
236
+ "领涨股票-涨跌幅",
237
+ ]
238
+ ]
239
+ temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce")
240
+ temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"], errors="coerce")
241
+ temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
242
+ temp_df["总市值"] = pd.to_numeric(temp_df["总市值"], errors="coerce")
243
+ temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce")
244
+ temp_df["上涨家数"] = pd.to_numeric(temp_df["上涨家数"], errors="coerce")
245
+ temp_df["下跌家数"] = pd.to_numeric(temp_df["下跌家数"], errors="coerce")
246
+ temp_df["领涨股票-涨跌幅"] = pd.to_numeric(
247
+ temp_df["领涨股票-涨跌幅"], errors="coerce"
248
+ )
249
+ return temp_df
250
+
251
+
252
+ @lru_cache()
253
+ def __stock_board_concept_name_em() -> pd.DataFrame:
254
+ """
255
+ 东方财富网-行情中心-沪深京板块-概念板块-名称
256
+ https://quote.eastmoney.com/center/boardlist.html#concept_board
257
+ :return: 概念板块-名称
258
+ :rtype: pandas.DataFrame
259
+ """
260
+ url = "https://79.push2.eastmoney.com/api/qt/clist/get"
261
+ params = {
262
+ "pn": "1",
263
+ "pz": "100",
264
+ "po": "1",
265
+ "np": "1",
266
+ "ut": "bd1d9ddb04089700cf9c27f6f7426281",
267
+ "fltt": "2",
268
+ "invt": "2",
269
+ "fid": "f12",
270
+ "fs": "m:90 t:3 f:!50",
271
+ "fields": "f2,f3,f4,f8,f12,f14,f15,f16,f17,f18,f20,f21,f24,f25,f22,f33,f11,f62,f128,f124,f107,f104,f105,f136",
272
+ }
273
+ temp_df = fetch_paginated_data(url, params)
274
+ temp_df.columns = [
275
+ "排名",
276
+ "最新价",
277
+ "涨跌幅",
278
+ "涨跌额",
279
+ "换手率",
280
+ "_",
281
+ "板块代码",
282
+ "板块名称",
283
+ "_",
284
+ "_",
285
+ "_",
286
+ "_",
287
+ "总市值",
288
+ "_",
289
+ "_",
290
+ "_",
291
+ "_",
292
+ "_",
293
+ "_",
294
+ "上涨家数",
295
+ "下跌家数",
296
+ "_",
297
+ "_",
298
+ "领涨股票",
299
+ "_",
300
+ "_",
301
+ "领涨股票-涨跌幅",
302
+ ]
303
+ temp_df = temp_df[
304
+ [
305
+ "排名",
306
+ "板块名称",
307
+ "板块代码",
308
+ "最新价",
309
+ "涨跌额",
310
+ "涨跌幅",
311
+ "总市值",
312
+ "换手率",
313
+ "上涨家数",
314
+ "下跌家数",
315
+ "领涨股票",
316
+ "领涨股票-涨跌幅",
317
+ ]
318
+ ]
319
+ temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce")
320
+ temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"], errors="coerce")
321
+ temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
322
+ temp_df["总市值"] = pd.to_numeric(temp_df["总市值"], errors="coerce")
323
+ temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce")
324
+ temp_df["上涨家数"] = pd.to_numeric(temp_df["上涨家数"], errors="coerce")
325
+ temp_df["下跌家数"] = pd.to_numeric(temp_df["下跌家数"], errors="coerce")
326
+ temp_df["领涨股票-涨跌幅"] = pd.to_numeric(
327
+ temp_df["领涨股票-涨跌幅"], errors="coerce"
328
+ )
329
+ return temp_df
330
+
331
+
332
+ def stock_board_concept_cons_em(symbol: str = "融资融券") -> pd.DataFrame:
333
+ """
334
+ 东方财富-沪深板块-概念板块-板块成份
335
+ https://quote.eastmoney.com/center/boardlist.html#boards-BK06551
336
+ :param symbol: 板块名称或者板块代码
337
+ :type symbol: str
338
+ :return: 板块成份
339
+ :rtype: pandas.DataFrame
340
+ """
341
+ if re.match(pattern=r"^BK\d+", string=symbol):
342
+ stock_board_code = symbol
343
+ else:
344
+ stock_board_concept_em_map = __stock_board_concept_name_em()
345
+ stock_board_code = stock_board_concept_em_map[
346
+ stock_board_concept_em_map["板块名称"] == symbol
347
+ ]["板块代码"].values[0]
348
+ url = "https://29.push2.eastmoney.com/api/qt/clist/get"
349
+ params = {
350
+ "pn": "1",
351
+ "pz": "100",
352
+ "po": "1",
353
+ "np": "1",
354
+ "ut": "bd1d9ddb04089700cf9c27f6f7426281",
355
+ "fltt": "2",
356
+ "invt": "2",
357
+ "fid": "f12",
358
+ "fs": f"b:{stock_board_code} f:!50",
359
+ "fields": "f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,"
360
+ "f24,f25,f22,f11,f62,f128,f136,f115,f152,f45",
361
+ }
362
+ temp_df = fetch_paginated_data(url, params)
363
+ temp_df.columns = [
364
+ "序号",
365
+ "_",
366
+ "最新价",
367
+ "涨跌幅",
368
+ "涨跌额",
369
+ "成交量",
370
+ "成交额",
371
+ "振幅",
372
+ "换手率",
373
+ "市盈率-动态",
374
+ "_",
375
+ "_",
376
+ "代码",
377
+ "_",
378
+ "名称",
379
+ "最高",
380
+ "最低",
381
+ "今开",
382
+ "昨收",
383
+ "_",
384
+ "_",
385
+ "_",
386
+ "市净率",
387
+ "_",
388
+ "_",
389
+ "_",
390
+ "_",
391
+ "_",
392
+ "_",
393
+ "_",
394
+ "_",
395
+ "_",
396
+ "_",
397
+ ]
398
+ temp_df = temp_df[
399
+ [
400
+ "序号",
401
+ "代码",
402
+ "名称",
403
+ "最新价",
404
+ "涨跌幅",
405
+ "涨跌额",
406
+ "成交量",
407
+ "成交额",
408
+ "振幅",
409
+ "最高",
410
+ "最低",
411
+ "今开",
412
+ "昨收",
413
+ "换手率",
414
+ "市盈率-动态",
415
+ "市净率",
416
+ ]
417
+ ]
418
+ temp_df["最新价"] = pd.to_numeric(temp_df["最新价"], errors="coerce")
419
+ temp_df["涨跌幅"] = pd.to_numeric(temp_df["涨跌幅"], errors="coerce")
420
+ temp_df["涨跌额"] = pd.to_numeric(temp_df["涨跌额"], errors="coerce")
421
+ temp_df["成交量"] = pd.to_numeric(temp_df["成交量"], errors="coerce")
422
+ temp_df["成交额"] = pd.to_numeric(temp_df["成交额"], errors="coerce")
423
+ temp_df["振幅"] = pd.to_numeric(temp_df["振幅"], errors="coerce")
424
+ temp_df["最高"] = pd.to_numeric(temp_df["最高"], errors="coerce")
425
+ temp_df["最低"] = pd.to_numeric(temp_df["最低"], errors="coerce")
426
+ temp_df["今开"] = pd.to_numeric(temp_df["今开"], errors="coerce")
427
+ temp_df["昨收"] = pd.to_numeric(temp_df["昨收"], errors="coerce")
428
+ temp_df["换手率"] = pd.to_numeric(temp_df["换手率"], errors="coerce")
429
+ temp_df["市盈率-动态"] = pd.to_numeric(temp_df["市盈率-动态"], errors="coerce")
430
+ temp_df["市净率"] = pd.to_numeric(temp_df["市净率"], errors="coerce")
431
+ return temp_df
432
+
433
+
93
434
  @hku_catch(ret={}, trace=True)
94
435
  def get_all_gnbk_info(code_market_dict, sep=""):
95
436
  """获取所有概念版本列表"""
96
- blk_names = ak.stock_board_concept_name_em()['板块名称']
437
+ blk_names = stock_board_concept_name_em()['板块名称']
97
438
  ret = {}
98
- for blk_name in blk_names:
99
- stk_codes = ak.stock_board_concept_cons_em(blk_name)
439
+ for i, blk_name in enumerate(blk_names):
440
+ stk_codes = stock_board_concept_cons_em(blk_name)
100
441
  stk_codes = stk_codes['代码'].to_list()
101
- hku_info(f"获取概念板块{blk_name}成分: {len(stk_codes)}")
442
+ hku_info(f"{i} 获取概念板块{blk_name}成分: {len(stk_codes)}")
102
443
  ret[blk_name] = [
103
444
  f"{code_market_dict[stk_code]}{sep}{stk_code}" for stk_code in stk_codes if stk_code in code_market_dict]
104
445
  return ret
@@ -133,6 +474,7 @@ def get_dybk_names():
133
474
  data_json = r.json()
134
475
  if data_json["data"] is not None:
135
476
  ret.extend([(v["f12"], v["f14"]) for v in data_json["data"]["diff"]])
477
+ time.sleep(random.uniform(1, 3))
136
478
  return ret
137
479
 
138
480
 
@@ -179,6 +521,7 @@ def get_all_dybk_info(code_market_dict, sep=""):
179
521
  stk_json = stk_json["data"]["diff"]
180
522
  ret[blk_name].extend(
181
523
  [f"{code_market_dict[v['f12']]}{sep}{v['f12']}" for v in stk_json if v["f12"] in code_market_dict])
524
+ time.sleep(random.uniform(1, 3))
182
525
  hku_info(f'获取地域板块{blk_name}成分: {len(ret[blk_name])}')
183
526
 
184
527
  return ret
@@ -214,5 +557,6 @@ def get_all_zsbk_info(code_market_dict, sep=""):
214
557
 
215
558
 
216
559
  if __name__ == "__main__":
217
- blks = get_hybk_cons_code('BK0475')
560
+ blks = get_hybk_names()
561
+ # blks = get_hybk_cons_code('BK0480')
218
562
  print(blks)
@@ -64,7 +64,7 @@ def parse_one_result(quotes):
64
64
  return result
65
65
 
66
66
 
67
- @ hku_catch(ret=[], trace=True)
67
+ @hku_catch(ret=[], trace=True)
68
68
  def request_data(api, stklist, parse_one_result):
69
69
  """请求失败将抛出异常"""
70
70
  quotes_list = api.get_security_quotes(stklist)
@@ -103,6 +103,7 @@ def inner_get_spot(stocklist, ip, port, batch_func=None):
103
103
  batch_func(phase_result)
104
104
  else:
105
105
  err_list.extend(tmplist)
106
+ api.disconnect()
106
107
  return result, err_list
107
108
 
108
109