hikyuu 2.6.3__py3-none-win_amd64.whl → 2.6.6__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 (146) hide show
  1. hikyuu/__init__.py +6 -0
  2. hikyuu/__init__.pyi +548 -546
  3. hikyuu/analysis/__init__.pyi +519 -514
  4. hikyuu/analysis/analysis.pyi +520 -515
  5. hikyuu/core.pyi +521 -516
  6. hikyuu/cpp/__init__.pyi +2 -2
  7. hikyuu/cpp/boost_date_time-mt.dll +0 -0
  8. hikyuu/cpp/boost_serialization-mt.dll +0 -0
  9. hikyuu/cpp/boost_wserialization-mt.dll +0 -0
  10. hikyuu/cpp/core310.pyd +0 -0
  11. hikyuu/cpp/core310.pyi +167 -36
  12. hikyuu/cpp/core311.pyd +0 -0
  13. hikyuu/cpp/core311.pyi +167 -36
  14. hikyuu/cpp/core312.pyd +0 -0
  15. hikyuu/cpp/core312.pyi +167 -36
  16. hikyuu/cpp/core313.pyd +0 -0
  17. hikyuu/cpp/core313.pyi +167 -36
  18. hikyuu/cpp/core39.pyd +0 -0
  19. hikyuu/cpp/core39.pyi +167 -36
  20. hikyuu/cpp/hikyuu.dll +0 -0
  21. hikyuu/cpp/hikyuu.lib +0 -0
  22. hikyuu/cpp/i18n/__init__.py +0 -0
  23. hikyuu/cpp/i18n/zh_CN.mo +0 -0
  24. hikyuu/cpp/sqlite3.dll +0 -0
  25. hikyuu/data/clickhouse_upgrade/__init__.py +1 -0
  26. hikyuu/data/clickhouse_upgrade/createdb.sql +1085 -0
  27. hikyuu/data/common.py +1 -1
  28. hikyuu/data/common_clickhouse.py +512 -0
  29. hikyuu/data/common_mysql.py +19 -0
  30. hikyuu/data/common_pytdx.py +2 -0
  31. hikyuu/data/common_sqlite3.py +1 -0
  32. hikyuu/data/em_block_to_clickhouse.py +120 -0
  33. hikyuu/data/hku_config_template.py +70 -1
  34. hikyuu/data/mysql_upgrade/0028.sql +95 -0
  35. hikyuu/data/pytdx_finance_to_clickhouse.py +107 -0
  36. hikyuu/data/pytdx_to_clickhouse.py +841 -0
  37. hikyuu/data/pytdx_to_h5.py +53 -13
  38. hikyuu/data/pytdx_to_mysql.py +42 -9
  39. hikyuu/data/pytdx_to_taos.py +736 -0
  40. hikyuu/data/pytdx_weight_to_clickhouse.py +191 -0
  41. hikyuu/data/sqlite_upgrade/0028.sql +97 -0
  42. hikyuu/data/tdx_to_clickhouse.py +448 -0
  43. hikyuu/data/zh_bond10_to_clickhouse.py +49 -0
  44. hikyuu/draw/__init__.pyi +1 -1
  45. hikyuu/draw/drawplot/__init__.pyi +8 -8
  46. hikyuu/draw/drawplot/bokeh_draw.pyi +538 -536
  47. hikyuu/draw/drawplot/common.pyi +1 -1
  48. hikyuu/draw/drawplot/echarts_draw.pyi +540 -538
  49. hikyuu/draw/drawplot/matplotlib_draw.py +7 -7
  50. hikyuu/draw/drawplot/matplotlib_draw.pyi +550 -548
  51. hikyuu/draw/elder.pyi +11 -11
  52. hikyuu/draw/kaufman.pyi +18 -18
  53. hikyuu/draw/volume.pyi +10 -10
  54. hikyuu/examples/notebook/001-overview.ipynb +65 -100
  55. hikyuu/examples/notebook/004-IndicatorOverview.ipynb +34 -32
  56. hikyuu/examples/notebook/007-SystemDetails.ipynb +64 -50
  57. hikyuu/examples/notebook/010-Portfolio.ipynb +120 -124
  58. hikyuu/extend.py +1 -1
  59. hikyuu/extend.pyi +527 -527
  60. hikyuu/fetcher/stock/zh_block_em.py +349 -5
  61. hikyuu/fetcher/stock/zh_stock_a_pytdx.py +11 -21
  62. hikyuu/fetcher/stock/zh_stock_a_qmt.py +4 -5
  63. hikyuu/fetcher/stock/zh_stock_a_sina_qq.py +16 -60
  64. hikyuu/flat/Spot.py +96 -200
  65. hikyuu/gui/HikyuuTDX.py +175 -23
  66. hikyuu/gui/data/ImportBlockInfoTask.py +12 -1
  67. hikyuu/gui/data/ImportHistoryFinanceTask.py +62 -44
  68. hikyuu/gui/data/ImportPytdxTimeToH5Task.py +14 -2
  69. hikyuu/gui/data/ImportPytdxToH5Task.py +17 -3
  70. hikyuu/gui/data/ImportPytdxTransToH5Task.py +14 -2
  71. hikyuu/gui/data/ImportTdxToH5Task.py +13 -1
  72. hikyuu/gui/data/ImportWeightToSqliteTask.py +16 -2
  73. hikyuu/gui/data/ImportZhBond10Task.py +12 -1
  74. hikyuu/gui/data/MainWindow.py +191 -110
  75. hikyuu/gui/data/UsePytdxImportToH5Thread.py +52 -29
  76. hikyuu/gui/data/UseQmtImportToH5Thread.py +1 -0
  77. hikyuu/gui/data/UseTdxImportToH5Thread.py +21 -2
  78. hikyuu/gui/dataserver.py +12 -4
  79. hikyuu/gui/spot_server.py +30 -40
  80. hikyuu/gui/start_qmt.py +20 -3
  81. hikyuu/hub.pyi +6 -6
  82. hikyuu/include/hikyuu/DataType.h +11 -0
  83. hikyuu/include/hikyuu/MarketInfo.h +6 -0
  84. hikyuu/include/hikyuu/StockManager.h +8 -0
  85. hikyuu/include/hikyuu/data_driver/BaseInfoDriver.h +35 -0
  86. hikyuu/include/hikyuu/data_driver/kdata/mysql/KRecordTable.h +1 -0
  87. hikyuu/include/hikyuu/global/GlobalSpotAgent.h +1 -1
  88. hikyuu/include/hikyuu/global/SpotRecord.h +15 -31
  89. hikyuu/include/hikyuu/global/agent/spot_generated.h +48 -232
  90. hikyuu/include/hikyuu/global/schedule/scheduler.h +1 -1
  91. hikyuu/include/hikyuu/indicator/build_in.h +1 -0
  92. hikyuu/include/hikyuu/indicator/crt/BARSLASTCOUNT.h +33 -0
  93. hikyuu/include/hikyuu/indicator/imp/IBarsLastCount.h +27 -0
  94. hikyuu/include/hikyuu/plugin/KDataToHdf5Importer.h +3 -0
  95. hikyuu/include/hikyuu/plugin/backtest.h +2 -2
  96. hikyuu/include/hikyuu/plugin/dataserver.h +26 -1
  97. hikyuu/include/hikyuu/plugin/device.h +8 -4
  98. hikyuu/include/hikyuu/plugin/interface/BackTestPluginInterface.h +1 -1
  99. hikyuu/include/hikyuu/plugin/interface/DataDriverPluginInterface.h +27 -0
  100. hikyuu/include/hikyuu/plugin/interface/DataServerPluginInterface.h +2 -1
  101. hikyuu/include/hikyuu/plugin/interface/DevicePluginInterface.h +2 -1
  102. hikyuu/include/hikyuu/plugin/interface/ImportKDataToHdf5PluginInterface.h +3 -0
  103. hikyuu/include/hikyuu/plugin/interface/TMReportPluginInterface.h +80 -0
  104. hikyuu/include/hikyuu/plugin/interface/plugins.h +4 -0
  105. hikyuu/include/hikyuu/strategy/Strategy.h +0 -9
  106. hikyuu/include/hikyuu/trade_manage/Performance.h +17 -9
  107. hikyuu/include/hikyuu/trade_manage/PositionExtInfo.h +92 -0
  108. hikyuu/include/hikyuu/trade_manage/PositionRecord.h +7 -1
  109. hikyuu/include/hikyuu/trade_manage/TradeManagerBase.h +60 -1
  110. hikyuu/include/hikyuu/trade_sys/selector/crt/SE_Optimal.h +8 -0
  111. hikyuu/include/hikyuu/trade_sys/selector/imp/optimal/OptimalEvaluateSelector.h +28 -0
  112. hikyuu/include/hikyuu/trade_sys/selector/imp/optimal/OptimalSelectorBase.h +1 -0
  113. hikyuu/include/hikyuu/utilities/DllLoader.h +226 -0
  114. hikyuu/include/hikyuu/utilities/config.h +1 -1
  115. hikyuu/include/hikyuu/utilities/datetime/Datetime.h +20 -0
  116. hikyuu/include/hikyuu/utilities/datetime/TimeDelta.h +6 -0
  117. hikyuu/include/hikyuu/utilities/mo/mo.h +30 -14
  118. hikyuu/include/hikyuu/utilities/os.h +6 -0
  119. hikyuu/include/hikyuu/utilities/plugin/PluginLoader.h +10 -10
  120. hikyuu/include/hikyuu/utilities/thread/MQThreadPool.h +13 -7
  121. hikyuu/include/hikyuu/utilities/thread/ThreadPool.h +13 -6
  122. hikyuu/include/hikyuu/version.h +4 -4
  123. hikyuu/plugin/backtest.dll +0 -0
  124. hikyuu/plugin/clickhousedriver.dll +0 -0
  125. hikyuu/plugin/dataserver.dll +0 -0
  126. hikyuu/plugin/device.dll +0 -0
  127. hikyuu/plugin/extind.dll +0 -0
  128. hikyuu/plugin/import2hdf5.dll +0 -0
  129. hikyuu/plugin/tmreport.dll +0 -0
  130. hikyuu/trade_manage/__init__.pyi +537 -535
  131. hikyuu/trade_manage/broker.pyi +3 -3
  132. hikyuu/trade_manage/broker_easytrader.pyi +1 -1
  133. hikyuu/trade_manage/trade.pyi +537 -535
  134. hikyuu/util/__init__.py +1 -0
  135. hikyuu/util/__init__.pyi +4 -3
  136. hikyuu/util/check.py +8 -0
  137. hikyuu/util/check.pyi +5 -1
  138. hikyuu/util/singleton.pyi +1 -1
  139. {hikyuu-2.6.3.dist-info → hikyuu-2.6.6.dist-info}/METADATA +4 -3
  140. {hikyuu-2.6.3.dist-info → hikyuu-2.6.6.dist-info}/RECORD +144 -123
  141. {hikyuu-2.6.3.dist-info → hikyuu-2.6.6.dist-info}/top_level.txt +2 -2
  142. hikyuu/include/hikyuu/global/agent/hikyuu/__init__.py +0 -1
  143. hikyuu/include/hikyuu/global/agent/hikyuu/flat/__init__.py +0 -1
  144. {hikyuu-2.6.3.dist-info → hikyuu-2.6.6.dist-info}/LICENSE +0 -0
  145. {hikyuu-2.6.3.dist-info → hikyuu-2.6.6.dist-info}/WHEEL +0 -0
  146. {hikyuu-2.6.3.dist-info → hikyuu-2.6.6.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,191 @@
1
+ # coding:utf-8
2
+ #
3
+ # The MIT License (MIT)
4
+ #
5
+ # Copyright (c) 2010-2019 fasiondog/hikyuu
6
+ #
7
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
8
+ # of this software and associated documentation files (the "Software"), to deal
9
+ # in the Software without restriction, including without limitation the rights
10
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+ # copies of the Software, and to permit persons to whom the Software is
12
+ # furnished to do so, subject to the following conditions:
13
+ #
14
+ # The above copyright notice and this permission notice shall be included in all
15
+ # copies or substantial portions of the Software.
16
+ #
17
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+ # SOFTWARE.
24
+
25
+ from pytdx.hq import TDXParams
26
+ from hikyuu.util import *
27
+ from hikyuu.data.common_pytdx import to_pytdx_market
28
+
29
+
30
+ @hku_catch(trace=True)
31
+ def pytdx_import_weight_to_clickhouse(pytdx_api, connect, market):
32
+ """从 pytdx 导入权息数据"""
33
+ pytdx_market = to_pytdx_market(market)
34
+
35
+ total_count = 0
36
+ update_count = 0
37
+ stock_list = connect.query(f"select code from `hku_base`.`stock` where market='{market}' and valid=1")
38
+ stockid_list = stock_list.result_rows
39
+
40
+ for stockrecord in stockid_list:
41
+ code = stockrecord[0]
42
+
43
+ # 获取当前数据库中最后的一条权息记录的总股本和流通股本
44
+ sql = f"select date, countAsGift, countForSell, priceForSell, bonus, countOfIncreasement, totalCount, freeCount, suogu from `hku_base`.`stkweight` where market='{market}' and code='{code}' order by date desc limit 1"
45
+ tmp = connect.query(sql)
46
+ a = tmp.result_rows
47
+ last_db_weight = None
48
+ if a:
49
+ a = list(a[0])
50
+ last_db_weight = a
51
+ db_last_date = a[0]
52
+ last_total_count, last_free_count = a[6:8]
53
+ else:
54
+ last_db_weight = None
55
+ db_last_date, last_total_count, last_free_count = (0, 0, 0)
56
+
57
+ xdxr_list = pytdx_api.get_xdxr_info(pytdx_market, code)
58
+ update_last_db_weight = False
59
+ new_last_db_weight = last_db_weight
60
+ records = {}
61
+ for xdxr in xdxr_list:
62
+ try:
63
+ date = xdxr['year'] * 10000 + xdxr['month'] * 100 + xdxr['day']
64
+ if date < db_last_date:
65
+ continue
66
+ if date == db_last_date and new_last_db_weight is not None:
67
+ if xdxr['songzhuangu'] is not None:
68
+ new_last_db_weight[1] = 10000 * xdxr['songzhuangu']
69
+ update_last_db_weight = True
70
+ if xdxr['peigu'] is not None:
71
+ new_last_db_weight[2] = 10000 * xdxr['peigu']
72
+ update_last_db_weight = True
73
+ if xdxr['peigujia'] is not None:
74
+ new_last_db_weight[3] = 1000 * xdxr['peigujia']
75
+ update_last_db_weight = True
76
+ if xdxr['fenhong'] is not None:
77
+ new_last_db_weight[4] = 1000 * xdxr['fenhong']
78
+ update_last_db_weight = True
79
+ if xdxr['houzongguben'] is not None:
80
+ new_last_db_weight[6] = xdxr['houzongguben']
81
+ update_last_db_weight = True
82
+ last_total_count = new_last_db_weight[6]
83
+ if xdxr['panhouliutong'] is not None:
84
+ new_last_db_weight[7] = xdxr['panhouliutong']
85
+ update_last_db_weight = True
86
+ last_free_count = new_last_db_weight[7]
87
+ if xdxr['suogu'] is not None:
88
+ # etf 扩缩股
89
+ new_last_db_weight[8] = xdxr['suogu']
90
+ update_last_db_weight = True
91
+ continue
92
+ if date not in records:
93
+ records[date] = [
94
+ date,
95
+ 10000 * xdxr['songzhuangu'] if xdxr['songzhuangu'] is not None else 0, # countAsGift
96
+ 10000 * xdxr['peigu'] if xdxr['peigu'] is not None else 0, # countForSell
97
+ 1000 * xdxr['peigujia'] if xdxr['peigujia'] is not None else 0, # priceForSell
98
+ 1000 * xdxr['fenhong'] if xdxr['fenhong'] is not None else 0, # bonus
99
+ 0, # countOfIncreasement, pytdx 不区分送股和转增股,统一记在送股
100
+ xdxr['houzongguben'] if xdxr['houzongguben'] is not None else last_total_count, # totalCount
101
+ xdxr['panhouliutong'] if xdxr['panhouliutong'] is not None else last_free_count, # freeCount
102
+ xdxr["suogu"] if xdxr["suogu"] is not None else 0
103
+ ]
104
+ else:
105
+ if xdxr['songzhuangu'] is not None:
106
+ records[date][1] = 10000 * xdxr['songzhuangu']
107
+ if xdxr['peigu'] is not None:
108
+ records[date][2] = 10000 * xdxr['peigu']
109
+ if xdxr['peigujia'] is not None:
110
+ records[date][3] = 1000 * xdxr['peigujia']
111
+ if xdxr['fenhong'] is not None:
112
+ records[date][4] = 1000 * xdxr['fenhong']
113
+ if xdxr['houzongguben'] is not None:
114
+ records[date][6] = xdxr['houzongguben']
115
+ if xdxr['panhouliutong'] is not None:
116
+ records[date][7] = xdxr['panhouliutong']
117
+ if xdxr['suogu'] is not None:
118
+ records[date][8] = xdxr['suogu']
119
+ if xdxr['houzongguben'] is not None:
120
+ last_total_count = xdxr['houzongguben']
121
+ if xdxr['panhouliutong'] is not None:
122
+ last_free_count = xdxr['panhouliutong']
123
+ except Exception as e:
124
+ print(e)
125
+ print("{}{} xdxr: {} last_db_weigth:{}".format(market, code, xdxr, new_last_db_weight))
126
+ raise e
127
+
128
+ if update_last_db_weight and new_last_db_weight != last_db_weight:
129
+ v = new_last_db_weight
130
+ sql = f"delete from hku_base.stkweight where market='{market}' and code='{code}' and date={v[0]}"
131
+ connect.command(sql)
132
+ records[v[0]] = v
133
+ update_count += 1
134
+
135
+ if records:
136
+ insert_records = []
137
+ for v in records.values():
138
+ tmp = [market, code]
139
+ tmp.extend(v)
140
+ insert_records.append(tmp)
141
+ ic = connect.create_insert_context(table='stkweight', database='hku_base',
142
+ column_names=['market', 'code', 'date', 'countAsGift', 'countForSell',
143
+ 'priceForSell', 'bonus', 'countOfIncreasement', 'totalCount', 'freeCount', 'suogu'],
144
+ data=insert_records)
145
+ connect.insert(context=ic)
146
+ total_count += len(records)
147
+
148
+ total_count = total_count - update_count
149
+ return total_count if total_count > 0 else 0
150
+
151
+
152
+ if __name__ == '__main__':
153
+ import os
154
+ from configparser import ConfigParser
155
+ dev_config = ConfigParser()
156
+ dev_config.read(os.path.expanduser("~") + '/workspace/dev.ini')
157
+ db = 'clickhouse54-http'
158
+ user = dev_config.get(db, 'user')
159
+ password = dev_config.get(db, 'pwd')
160
+ host = dev_config.get(db, 'host')
161
+ port = dev_config.getint(db, 'port')
162
+
163
+ import clickhouse_connect
164
+ client = clickhouse_connect.get_client(
165
+ host=host, username=user, password=password)
166
+
167
+ # sql = "select date, countAsGift, countForSell, priceForSell, bonus, countOfIncreasement, totalCount, freeCount, suogu from `hku_base`.`stkweight` where market='SH' and code='000001' order by date desc limit 1"
168
+ # result = client.query(sql)
169
+ # print(result.result_rows)
170
+ # client.close()
171
+
172
+ tdx_server = '180.101.48.170'
173
+ tdx_port = 7709
174
+ quotations = ['stock', 'fund']
175
+
176
+ from pytdx.hq import TdxHq_API, TDXParams
177
+ api = TdxHq_API()
178
+ api.connect(tdx_server, tdx_port)
179
+
180
+ import time
181
+ starttime = time.time()
182
+ print("开始导入")
183
+ print("导入数量: {}".format(pytdx_import_weight_to_clickhouse(api, client, 'SH')))
184
+
185
+ api.disconnect()
186
+ client.close()
187
+
188
+ endtime = time.time()
189
+ print("\nTotal time:")
190
+ print("%.2fs" % (endtime - starttime))
191
+ print("%.2fm" % ((endtime - starttime) / 60))
@@ -0,0 +1,97 @@
1
+ BEGIN TRANSACTION;
2
+ DELETE FROM holiday;
3
+ INSERT INTO holiday (`id`, `date`) VALUES (1, 20210101);
4
+ INSERT INTO holiday (`id`, `date`) VALUES (2, 20210211);
5
+ INSERT INTO holiday (`id`, `date`) VALUES (3, 20210212);
6
+ INSERT INTO holiday (`id`, `date`) VALUES (4, 20210215);
7
+ INSERT INTO holiday (`id`, `date`) VALUES (5, 20210216);
8
+ INSERT INTO holiday (`id`, `date`) VALUES (6, 20210217);
9
+ INSERT INTO holiday (`id`, `date`) VALUES (7, 20210405);
10
+ INSERT INTO holiday (`id`, `date`) VALUES (8, 20210501);
11
+ INSERT INTO holiday (`id`, `date`) VALUES (9, 20210503);
12
+ INSERT INTO holiday (`id`, `date`) VALUES (10, 20210504);
13
+ INSERT INTO holiday (`id`, `date`) VALUES (11, 20210505);
14
+ INSERT INTO holiday (`id`, `date`) VALUES (12, 20210614);
15
+ INSERT INTO holiday (`id`, `date`) VALUES (13, 20210920);
16
+ INSERT INTO holiday (`id`, `date`) VALUES (14, 20210921);
17
+ INSERT INTO holiday (`id`, `date`) VALUES (15, 20211001);
18
+ INSERT INTO holiday (`id`, `date`) VALUES (16, 20211004);
19
+ INSERT INTO holiday (`id`, `date`) VALUES (17, 20211005);
20
+ INSERT INTO holiday (`id`, `date`) VALUES (18, 20211006);
21
+ INSERT INTO holiday (`id`, `date`) VALUES (19, 20211007);
22
+ INSERT INTO holiday (`id`, `date`) VALUES (20, 20220103);
23
+ INSERT INTO holiday (`id`, `date`) VALUES (21, 20220131);
24
+ INSERT INTO holiday (`id`, `date`) VALUES (22, 20220201);
25
+ INSERT INTO holiday (`id`, `date`) VALUES (23, 20220202);
26
+ INSERT INTO holiday (`id`, `date`) VALUES (24, 20220203);
27
+ INSERT INTO holiday (`id`, `date`) VALUES (25, 20220204);
28
+ INSERT INTO holiday (`id`, `date`) VALUES (26, 20220205);
29
+ INSERT INTO holiday (`id`, `date`) VALUES (27, 20220404);
30
+ INSERT INTO holiday (`id`, `date`) VALUES (28, 20220405);
31
+ INSERT INTO holiday (`id`, `date`) VALUES (29, 20220502);
32
+ INSERT INTO holiday (`id`, `date`) VALUES (30, 20220503);
33
+ INSERT INTO holiday (`id`, `date`) VALUES (31, 20220504);
34
+ INSERT INTO holiday (`id`, `date`) VALUES (32, 20220603);
35
+ INSERT INTO holiday (`id`, `date`) VALUES (33, 20220912);
36
+ INSERT INTO holiday (`id`, `date`) VALUES (34, 20221003);
37
+ INSERT INTO holiday (`id`, `date`) VALUES (35, 20221004);
38
+ INSERT INTO holiday (`id`, `date`) VALUES (36, 20221005);
39
+ INSERT INTO holiday (`id`, `date`) VALUES (37, 20221006);
40
+ INSERT INTO holiday (`id`, `date`) VALUES (38, 20221007);
41
+ INSERT INTO holiday (`id`, `date`) VALUES (39, 20230102);
42
+ INSERT INTO holiday (`id`, `date`) VALUES (40, 20230123);
43
+ INSERT INTO holiday (`id`, `date`) VALUES (41, 20230124);
44
+ INSERT INTO holiday (`id`, `date`) VALUES (42, 20230125);
45
+ INSERT INTO holiday (`id`, `date`) VALUES (43, 20230126);
46
+ INSERT INTO holiday (`id`, `date`) VALUES (44, 20230127);
47
+ INSERT INTO holiday (`id`, `date`) VALUES (45, 20230405);
48
+ INSERT INTO holiday (`id`, `date`) VALUES (46, 20230501);
49
+ INSERT INTO holiday (`id`, `date`) VALUES (47, 20230502);
50
+ INSERT INTO holiday (`id`, `date`) VALUES (48, 20230503);
51
+ INSERT INTO holiday (`id`, `date`) VALUES (49, 20230622);
52
+ INSERT INTO holiday (`id`, `date`) VALUES (50, 20230623);
53
+ INSERT INTO holiday (`id`, `date`) VALUES (51, 20230929);
54
+ INSERT INTO holiday (`id`, `date`) VALUES (52, 20231002);
55
+ INSERT INTO holiday (`id`, `date`) VALUES (53, 20231003);
56
+ INSERT INTO holiday (`id`, `date`) VALUES (54, 20231004);
57
+ INSERT INTO holiday (`id`, `date`) VALUES (55, 20231005);
58
+ INSERT INTO holiday (`id`, `date`) VALUES (56, 20231006);
59
+ INSERT INTO holiday (`id`, `date`) VALUES (57, 20240101);
60
+ INSERT INTO holiday (`id`, `date`) VALUES (58, 20240212);
61
+ INSERT INTO holiday (`id`, `date`) VALUES (59, 20240213);
62
+ INSERT INTO holiday (`id`, `date`) VALUES (60, 20240214);
63
+ INSERT INTO holiday (`id`, `date`) VALUES (61, 20240215);
64
+ INSERT INTO holiday (`id`, `date`) VALUES (62, 20240216);
65
+ INSERT INTO holiday (`id`, `date`) VALUES (63, 20240404);
66
+ INSERT INTO holiday (`id`, `date`) VALUES (64, 20240405);
67
+ INSERT INTO holiday (`id`, `date`) VALUES (65, 20240501);
68
+ INSERT INTO holiday (`id`, `date`) VALUES (66, 20240502);
69
+ INSERT INTO holiday (`id`, `date`) VALUES (67, 20240503);
70
+ INSERT INTO holiday (`id`, `date`) VALUES (68, 20240610);
71
+ INSERT INTO holiday (`id`, `date`) VALUES (69, 20240916);
72
+ INSERT INTO holiday (`id`, `date`) VALUES (70, 20240917);
73
+ INSERT INTO holiday (`id`, `date`) VALUES (71, 20241001);
74
+ INSERT INTO holiday (`id`, `date`) VALUES (72, 20241002);
75
+ INSERT INTO holiday (`id`, `date`) VALUES (73, 20241003);
76
+ INSERT INTO holiday (`id`, `date`) VALUES (74, 20241004);
77
+ INSERT INTO holiday (`id`, `date`) VALUES (75, 20241007);
78
+ INSERT INTO holiday (`id`, `date`) VALUES (76, 20250101);
79
+ INSERT INTO holiday (`id`, `date`) VALUES (77, 20250128);
80
+ INSERT INTO holiday (`id`, `date`) VALUES (78, 20250129);
81
+ INSERT INTO holiday (`id`, `date`) VALUES (79, 20250130);
82
+ INSERT INTO holiday (`id`, `date`) VALUES (80, 20250131);
83
+ INSERT INTO holiday (`id`, `date`) VALUES (81, 20250203);
84
+ INSERT INTO holiday (`id`, `date`) VALUES (82, 20250204);
85
+ INSERT INTO holiday (`id`, `date`) VALUES (83, 20250404);
86
+ INSERT INTO holiday (`id`, `date`) VALUES (84, 20250501);
87
+ INSERT INTO holiday (`id`, `date`) VALUES (85, 20250502);
88
+ INSERT INTO holiday (`id`, `date`) VALUES (86, 20250505);
89
+ INSERT INTO holiday (`id`, `date`) VALUES (87, 20250602);
90
+ INSERT INTO holiday (`id`, `date`) VALUES (88, 20251001);
91
+ INSERT INTO holiday (`id`, `date`) VALUES (89, 20251002);
92
+ INSERT INTO holiday (`id`, `date`) VALUES (90, 20251003);
93
+ INSERT INTO holiday (`id`, `date`) VALUES (91, 20251006);
94
+ INSERT INTO holiday (`id`, `date`) VALUES (92, 20251007);
95
+ INSERT INTO holiday (`id`, `date`) VALUES (93, 20251008);
96
+ UPDATE `version` set `version` = 28;
97
+ COMMIT;