qka 2.3.1.dev2__tar.gz → 2.3.2.dev2__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-2.3.1.dev2 → qka-2.3.2.dev2}/PKG-INFO +1 -1
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/qka/core/data.py +14 -2
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/.github/workflows/release.yml +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/.gitignore +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/.vscode/settings.json +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/CHANGELOG.md +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/LICENSE +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/README.md +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/pyproject.toml +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/qka/__init__.py +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/qka/cli.py +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/qka/core/__init__.py +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/qka/core/accessor.py +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/qka/core/analysis.py +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/qka/core/backtest.py +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/qka/core/broker.py +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/qka/core/indicator.py +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/qka/core/report.py +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/qka/core/simulate.py +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/qka/core/sizing.py +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/qka/core/strategy.py +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/qka/utils/__init__.py +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/qka/utils/logger.py +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/skills/qka/SKILL.md +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/skills/qka/references/analysis.md +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/skills/qka/references/backtest.md +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/skills/qka/references/broker.md +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/skills/qka/references/data.md +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/skills/qka/references/sizing.md +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/skills/qka/references/strategy.md +0 -0
- {qka-2.3.1.dev2 → qka-2.3.2.dev2}/tools/generate_api_ref.py +0 -0
|
@@ -4,7 +4,10 @@ QKA数据模块
|
|
|
4
4
|
提供统一的数据获取、缓存和管理功能,支持多数据源、多周期、多因子的数据获取。
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
+
import contextlib
|
|
8
|
+
import io
|
|
7
9
|
import os
|
|
10
|
+
import threading
|
|
8
11
|
from pathlib import Path
|
|
9
12
|
from tqdm import tqdm
|
|
10
13
|
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
@@ -1108,13 +1111,22 @@ class Data():
|
|
|
1108
1111
|
# ── TickFlow 数据源 ────────────────────────────────────────
|
|
1109
1112
|
|
|
1110
1113
|
_tf_client = None # 进程级复用,避免重复初始化
|
|
1114
|
+
_tf_client_lock = threading.Lock()
|
|
1111
1115
|
|
|
1112
1116
|
@classmethod
|
|
1113
1117
|
def _tickflow_client(cls):
|
|
1114
1118
|
"""惰性创建并复用 TickFlow 客户端(当前走免费服务,无需 api_key)。"""
|
|
1115
1119
|
if cls._tf_client is None:
|
|
1116
|
-
|
|
1117
|
-
|
|
1120
|
+
with cls._tf_client_lock:
|
|
1121
|
+
if cls._tf_client is None:
|
|
1122
|
+
from tickflow import TickFlow
|
|
1123
|
+
# TickFlow.free() 会往 stdout 打一段带 emoji 的「免费档」说明。
|
|
1124
|
+
# stdout 被重定向到文件、且编码非 UTF-8 时(如打包版把后端输出
|
|
1125
|
+
# 写入 GBK 日志),print emoji 会抛 UnicodeEncodeError 而中断下载,
|
|
1126
|
+
# 故创建期间丢弃其标准输出。(redirect_stdout 改的是全局 sys.stdout,
|
|
1127
|
+
# 并发首次创建会互相覆盖,故用锁串行化。)
|
|
1128
|
+
with contextlib.redirect_stdout(io.StringIO()):
|
|
1129
|
+
cls._tf_client = TickFlow.free()
|
|
1118
1130
|
return cls._tf_client
|
|
1119
1131
|
|
|
1120
1132
|
@staticmethod
|
|
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
|