quantcli 0.1.12__tar.gz → 0.1.13__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.
- {quantcli-0.1.12/quantcli.egg-info → quantcli-0.1.13}/PKG-INFO +1 -1
- {quantcli-0.1.12 → quantcli-0.1.13}/pyproject.toml +1 -1
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/utils/path.py +21 -18
- {quantcli-0.1.12 → quantcli-0.1.13/quantcli.egg-info}/PKG-INFO +1 -1
- {quantcli-0.1.12 → quantcli-0.1.13}/LICENSE +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/README.md +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/cli.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/core/__init__.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/core/backtest.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/core/data.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/core/factor.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/datasources/__init__.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/datasources/akshare.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/datasources/baostock.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/datasources/base.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/datasources/cache.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/datasources/fundamentals/__init__.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/datasources/fundamentals/provider.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/datasources/mixed.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/datasources/mysql.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/datasources/sync/__init__.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/datasources/sync/akshare.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/datasources/sync/base.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/datasources/sync/gm.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/datasources/sync/gm_fundamental.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/__init__.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_001.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_002.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_003.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_004.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_005.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_006.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_007.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_008.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_009.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_010.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_011.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_012.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_013.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_014.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_015.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_016.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_017.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_018.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_019.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_020.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_021.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_022.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_023.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_024.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_025.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_026.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_027.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_028.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_029.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_030.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_031.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_032.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_033.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_034.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_035.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_036.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_037.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_038.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_039.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/alpha101/alpha_040.yaml +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/base.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/compute.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/loader.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/pipeline.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/ranking.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/ranking_executor.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/screening.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/factors/screening_executor.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/models/bar.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/parser/__init__.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/parser/constants.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/parser/formula.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/utils/__init__.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/utils/env.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/utils/logger.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/utils/symbol_utils.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/utils/time.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli/utils/validate.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli.egg-info/SOURCES.txt +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli.egg-info/dependency_links.txt +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli.egg-info/entry_points.txt +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli.egg-info/requires.txt +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/quantcli.egg-info/top_level.txt +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/setup.cfg +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/tests/test_akshare_integration.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/tests/test_builtin_factors.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/tests/test_cli.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/tests/test_datasources.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/tests/test_factors.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/tests/test_gm_executors.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/tests/test_mixed_datasource.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/tests/test_multi_factor.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/tests/test_pipeline_integration.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/tests/test_symbol_utils.py +0 -0
- {quantcli-0.1.12 → quantcli-0.1.13}/tests/test_time.py +0 -0
|
@@ -76,6 +76,7 @@ def set_project_root(path: Union[str, Path]):
|
|
|
76
76
|
# 目录快捷方式
|
|
77
77
|
# =============================================================================
|
|
78
78
|
|
|
79
|
+
|
|
79
80
|
def data_dir(sub: str = "") -> Path:
|
|
80
81
|
"""数据目录
|
|
81
82
|
|
|
@@ -115,26 +116,20 @@ def factors_dir() -> Path:
|
|
|
115
116
|
def builtin_factors_dir() -> Path:
|
|
116
117
|
"""内置因子目录 (quantcli/factors/)
|
|
117
118
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
对于标准安装,包在 site-packages/quantcli/ 目录下。
|
|
119
|
+
标准安装: quantcli 在 site-packages 目录下。
|
|
120
|
+
返回 quantcli/factors/alpha101/ 作为内置因子目录。
|
|
121
121
|
|
|
122
122
|
Returns:
|
|
123
|
-
内置因子目录 Path
|
|
123
|
+
内置因子目录 Path (quantcli/factors/)
|
|
124
124
|
"""
|
|
125
|
-
|
|
126
|
-
cli_path = root / "quantcli"
|
|
125
|
+
import importlib.util
|
|
127
126
|
|
|
128
|
-
|
|
129
|
-
if
|
|
130
|
-
|
|
127
|
+
spec = importlib.util.find_spec("quantcli")
|
|
128
|
+
if spec is None or spec.submodule_search_locations is None:
|
|
129
|
+
raise RuntimeError("quantcli package location not found")
|
|
131
130
|
|
|
132
|
-
#
|
|
133
|
-
|
|
134
|
-
try:
|
|
135
|
-
return Path(quantcli.__file__).parent / "factors"
|
|
136
|
-
except (TypeError, AttributeError):
|
|
137
|
-
return root / "factors"
|
|
131
|
+
# 取第一个搜索位置
|
|
132
|
+
return Path(spec.submodule_search_locations[0]) / "factors"
|
|
138
133
|
|
|
139
134
|
|
|
140
135
|
def strategies_dir() -> Path:
|
|
@@ -171,6 +166,7 @@ def tests_dir() -> Path:
|
|
|
171
166
|
# 目录操作
|
|
172
167
|
# =============================================================================
|
|
173
168
|
|
|
169
|
+
|
|
174
170
|
def ensure_dir(path: Union[str, Path]) -> Path:
|
|
175
171
|
"""确保目录存在
|
|
176
172
|
|
|
@@ -250,12 +246,14 @@ def copy_dir(src: Union[str, Path], dst: Union[str, Path]):
|
|
|
250
246
|
copy_dir(item, src_path)
|
|
251
247
|
else:
|
|
252
248
|
import shutil
|
|
249
|
+
|
|
253
250
|
shutil.copy2(item, src_path)
|
|
254
251
|
|
|
255
252
|
|
|
256
253
|
def move_dir(src: Union[str, Path], dst: Union[str, Path]):
|
|
257
254
|
"""移动目录"""
|
|
258
255
|
import shutil
|
|
256
|
+
|
|
259
257
|
shutil.move(str(src), str(dst))
|
|
260
258
|
|
|
261
259
|
|
|
@@ -263,10 +261,9 @@ def move_dir(src: Union[str, Path], dst: Union[str, Path]):
|
|
|
263
261
|
# 文件操作
|
|
264
262
|
# =============================================================================
|
|
265
263
|
|
|
264
|
+
|
|
266
265
|
def find_files(
|
|
267
|
-
pattern: str,
|
|
268
|
-
root: Optional[Path] = None,
|
|
269
|
-
recursive: bool = True
|
|
266
|
+
pattern: str, root: Optional[Path] = None, recursive: bool = True
|
|
270
267
|
) -> List[Path]:
|
|
271
268
|
"""查找文件
|
|
272
269
|
|
|
@@ -319,6 +316,7 @@ def file_age(path: Union[str, Path]) -> float:
|
|
|
319
316
|
文件创建时间距今的秒数
|
|
320
317
|
"""
|
|
321
318
|
import time
|
|
319
|
+
|
|
322
320
|
path = Path(path)
|
|
323
321
|
if not path.exists():
|
|
324
322
|
return float("inf")
|
|
@@ -350,6 +348,7 @@ def format_size(size: int) -> str:
|
|
|
350
348
|
# 路径工具
|
|
351
349
|
# =============================================================================
|
|
352
350
|
|
|
351
|
+
|
|
353
352
|
def normpath(path: Union[str, Path]) -> Path:
|
|
354
353
|
"""规范化路径"""
|
|
355
354
|
return Path(os.path.normpath(path))
|
|
@@ -393,6 +392,7 @@ def is_subpath(path: Union[str, Path], parent: Union[str, Path]) -> bool:
|
|
|
393
392
|
# 扩展名处理
|
|
394
393
|
# =============================================================================
|
|
395
394
|
|
|
395
|
+
|
|
396
396
|
def get_extension(path: Union[str, Path]) -> str:
|
|
397
397
|
"""获取文件扩展名 (含点)"""
|
|
398
398
|
return Path(path).suffix
|
|
@@ -415,6 +415,7 @@ def replace_extension(path: Union[str, Path], new_ext: str) -> Path:
|
|
|
415
415
|
# 临时文件
|
|
416
416
|
# =============================================================================
|
|
417
417
|
|
|
418
|
+
|
|
418
419
|
def temp_dir(sub: str = "") -> Path:
|
|
419
420
|
"""获取临时目录
|
|
420
421
|
|
|
@@ -425,6 +426,7 @@ def temp_dir(sub: str = "") -> Path:
|
|
|
425
426
|
临时目录路径
|
|
426
427
|
"""
|
|
427
428
|
import tempfile
|
|
429
|
+
|
|
428
430
|
base = tempfile.gettempdir()
|
|
429
431
|
path = Path(base) / "quantcli"
|
|
430
432
|
if sub:
|
|
@@ -442,6 +444,7 @@ def temp_file(suffix: str = "") -> Path:
|
|
|
442
444
|
临时文件路径
|
|
443
445
|
"""
|
|
444
446
|
import tempfile
|
|
447
|
+
|
|
445
448
|
fd, path = tempfile.mkstemp(suffix=suffix)
|
|
446
449
|
os.close(fd)
|
|
447
450
|
return Path(path)
|
|
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
|
|
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
|