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.
Files changed (55) hide show
  1. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/PKG-INFO +1 -1
  2. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/core/data.py +12 -5
  3. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/.github/workflows/docs.yml +0 -0
  4. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/.github/workflows/release.yml +0 -0
  5. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/.gitignore +0 -0
  6. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/.vscode/settings.json +0 -0
  7. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/CHANGELOG.md +0 -0
  8. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/LICENSE +0 -0
  9. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/README.md +0 -0
  10. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/advanced/performance.md +0 -0
  11. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/api/brokers.md +0 -0
  12. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/api/core.md +0 -0
  13. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/api/utils.md +0 -0
  14. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/examples/buy_and_hold.md +0 -0
  15. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/examples/ma_cross.md +0 -0
  16. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/examples/momentum.md +0 -0
  17. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/examples/multi_factor.md +0 -0
  18. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/examples/rsi_atr.md +0 -0
  19. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/guides/backtest.md +0 -0
  20. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/guides/data.md +0 -0
  21. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/guides/indicators.md +0 -0
  22. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/guides/report.md +0 -0
  23. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/guides/sizing.md +0 -0
  24. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/guides/strategy.md +0 -0
  25. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/guides/trading.md +0 -0
  26. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/index.md +0 -0
  27. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/docs/user-guide/trading.md +0 -0
  28. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/mkdocs.yml +0 -0
  29. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/pyproject.toml +0 -0
  30. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/__init__.py +0 -0
  31. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/brokers/__init__.py +0 -0
  32. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/brokers/client.py +0 -0
  33. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/brokers/server.py +0 -0
  34. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/brokers/trade.py +0 -0
  35. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/cli.py +0 -0
  36. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/core/__init__.py +0 -0
  37. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/core/accessor.py +0 -0
  38. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/core/backtest.py +0 -0
  39. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/core/broker.py +0 -0
  40. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/core/report.py +0 -0
  41. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/core/sizing.py +0 -0
  42. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/core/strategy.py +0 -0
  43. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/mcp/__init__.py +0 -0
  44. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/mcp/api.py +0 -0
  45. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/mcp/server.py +0 -0
  46. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/server/__init__.py +0 -0
  47. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/server/handlers/__init__.py +0 -0
  48. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/server/handlers/class_inspector_handler.py +0 -0
  49. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/server/handlers/code_executor_handler.py +0 -0
  50. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/server/ws_client.py +0 -0
  51. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/server/zmq_server.py +0 -0
  52. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/utils/__init__.py +0 -0
  53. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/utils/anis.py +0 -0
  54. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/utils/logger.py +0 -0
  55. {qka-1.6.3.dev8 → qka-1.6.4.dev3}/qka/utils/util.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: qka
3
- Version: 1.6.3.dev8
3
+ Version: 1.6.4.dev3
4
4
  Summary: 快捷量化助手(Quick Quantitative Assistant)- 简洁易用的A股量化交易框架
5
5
  Project-URL: Home, https://github.com/zsrl/qka
6
6
  Project-URL: Documentation, https://zsrl.github.io/qka
@@ -129,7 +129,7 @@ class Data():
129
129
  df = pd.DataFrame()
130
130
 
131
131
  if len(df) == 0:
132
- return path
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
- logger.warning(f"下载 {symbol} 失败: {e}")
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
- logger.warning(f"下载 {symbol} 失败: {e}")
197
+ print(f"\n[警告] 下载 {symbol} 失败: {e}")
198
198
  pbar.update(1)
199
199
  pbar.set_postfix_str(f"当前: {symbol}")
200
200
  if errors:
201
- logger.warning(f"共 {len(errors)} 只股票下载失败: {errors[:3]}...")
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
- bs_code = symbol.replace('.SZ', '.sz').replace('.SH', '.sh').replace('.BJ', '.bj')
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