qka 1.6.3.dev8__tar.gz → 1.6.4.dev3__tar.gz
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.
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/PKG-INFO +1 -1
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/core/data.py +12 -5
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/.github/workflows/docs.yml +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/.github/workflows/release.yml +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/.gitignore +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/.vscode/settings.json +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/CHANGELOG.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/LICENSE +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/README.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/advanced/performance.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/api/brokers.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/api/core.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/api/utils.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/examples/buy_and_hold.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/examples/ma_cross.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/examples/momentum.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/examples/multi_factor.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/examples/rsi_atr.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/guides/backtest.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/guides/data.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/guides/indicators.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/guides/report.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/guides/sizing.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/guides/strategy.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/guides/trading.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/index.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/user-guide/trading.md +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/mkdocs.yml +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/pyproject.toml +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/__init__.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/brokers/__init__.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/brokers/client.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/brokers/server.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/brokers/trade.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/cli.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/core/__init__.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/core/accessor.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/core/backtest.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/core/broker.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/core/report.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/core/sizing.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/core/strategy.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/mcp/__init__.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/mcp/api.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/mcp/server.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/server/__init__.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/server/handlers/__init__.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/server/handlers/class_inspector_handler.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/server/handlers/code_executor_handler.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/server/ws_client.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/server/zmq_server.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/utils/__init__.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/utils/anis.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/utils/logger.py +0 -0
- {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/utils/util.py +0 -0
|
@@ -129,7 +129,7 @@ class Data():
|
|
|
129
129
|
df = pd.DataFrame()
|
|
130
130
|
|
|
131
131
|
if len(df) == 0:
|
|
132
|
-
|
|
132
|
+
raise RuntimeError(f"{symbol}: baostock 返回空数据")
|
|
133
133
|
|
|
134
134
|
table = pa.Table.from_pandas(df)
|
|
135
135
|
pq.write_table(table, path)
|
|
@@ -179,7 +179,7 @@ class Data():
|
|
|
179
179
|
self._download(symbol)
|
|
180
180
|
except Exception as e:
|
|
181
181
|
errors.append(f"{symbol}: {e}")
|
|
182
|
-
|
|
182
|
+
print(f"\n[警告] 下载 {symbol} 失败: {e}")
|
|
183
183
|
else:
|
|
184
184
|
# 其他数据源(akshare 等)并发下载
|
|
185
185
|
with ThreadPoolExecutor(max_workers=self.pool_size) as executor:
|
|
@@ -194,11 +194,14 @@ class Data():
|
|
|
194
194
|
future.result()
|
|
195
195
|
except Exception as e:
|
|
196
196
|
errors.append(f"{symbol}: {e}")
|
|
197
|
-
|
|
197
|
+
print(f"\n[警告] 下载 {symbol} 失败: {e}")
|
|
198
198
|
pbar.update(1)
|
|
199
199
|
pbar.set_postfix_str(f"当前: {symbol}")
|
|
200
200
|
if errors:
|
|
201
|
-
|
|
201
|
+
raise RuntimeError(
|
|
202
|
+
f"共 {len(errors)} 只股票下载失败:\n" +
|
|
203
|
+
"\n".join(f" - {e}" for e in errors)
|
|
204
|
+
)
|
|
202
205
|
finally:
|
|
203
206
|
if bs_logged_in:
|
|
204
207
|
bs.logout()
|
|
@@ -467,7 +470,9 @@ class Data():
|
|
|
467
470
|
pd.DataFrame: 股票数据,以 date 为索引,包含 open, high, low, close, volume, amount 列
|
|
468
471
|
"""
|
|
469
472
|
# baostock 代码格式:sz.000001 / sh.600000
|
|
470
|
-
|
|
473
|
+
exchange = symbol[-2:].lower() # 'sz', 'sh', 'bj'
|
|
474
|
+
code = symbol.split('.')[0] # '000001'
|
|
475
|
+
bs_code = f"{exchange}.{code}"
|
|
471
476
|
|
|
472
477
|
# adjustflag: 1=不复权, 2=前复权, 3=后复权
|
|
473
478
|
adjust_map = {'bfq': '1', 'qfq': '2', 'hfq': '3'}
|
|
@@ -481,6 +486,8 @@ class Data():
|
|
|
481
486
|
frequency='d',
|
|
482
487
|
adjustflag=adjustflag,
|
|
483
488
|
)
|
|
489
|
+
if rs.error_code != '0':
|
|
490
|
+
raise RuntimeError(f"baostock 查询 {symbol}({bs_code}) 失败: {rs.error_msg}")
|
|
484
491
|
df = rs.get_data()
|
|
485
492
|
|
|
486
493
|
if len(df) == 0:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|