Initial commit: cc-cursor 全链路量化研究平台
7 Sprints 全部完成: Sprint 0: 基础设施 (DataManager + MariaDB) Sprint 1: 因子引擎 (34因子/12分类) Sprint 2: VectorBT 回测 (5策略+截面) Sprint 3: Optuna 优化 (+Walk-Forward) Sprint 4: ML 模型 (LightGBM+CatBoost) Sprint 5: Qwen 情绪因子 (三源新闻+日期对齐) Sprint 6: Agent 系统 (4Agent+日报.md/.html) 生产加固 (15项): Tushare双源fallback, SSH自动恢复, pool_pre_ping, save_daily先删后插, load_dotenv绝对路径, 日报5d/20d修复, RiskAgent改上证指数, 昨日对比+数据截止, mac_report utf8mb4, CLAUDE-*.md 9条已知Bug, demo全参数化, djapi数据源归一化, indexDatas API修正 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
"""
|
||||
Sprint 0 验证脚本 — DataManager 全链路。
|
||||
|
||||
用法:
|
||||
python cli/demo_data_manager.py
|
||||
python cli/demo_data_manager.py --ts_code 600519.SH
|
||||
python cli/demo_data_manager.py --ts_code 300316.SZ --start 20250101
|
||||
"""
|
||||
|
||||
import sys, os, argparse
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
||||
from database.connection import test_connection
|
||||
from database.models import create_all_tables
|
||||
from data.data_manager import DataManager
|
||||
|
||||
|
||||
def main():
|
||||
p = argparse.ArgumentParser(description="Sprint 0 — DataManager 验证")
|
||||
p.add_argument("--ts_code", default="000001.SZ", help="测试股票代码(默认: 000001.SZ)")
|
||||
p.add_argument("--start", default="20250101", help="起始日期 YYYYMMDD(默认: 20250101)")
|
||||
args = p.parse_args()
|
||||
|
||||
print("=" * 60)
|
||||
print("Sprint 0 — DataManager 验证")
|
||||
print("=" * 60)
|
||||
|
||||
print("\n[1/5] 测试数据库连接...")
|
||||
if not test_connection():
|
||||
print("请先执行 shared/script/autossh.sh 建立 SSH 隧道")
|
||||
return
|
||||
print("[OK] 数据库连接成功")
|
||||
|
||||
print("\n[2/5] 创建数据表...")
|
||||
dm = DataManager(); dm.init_db()
|
||||
print("[OK] 表结构已就绪")
|
||||
|
||||
print("\n[3/5] 获取股票列表...")
|
||||
stocks = dm.get_stock_list()
|
||||
print("[OK] 共 {} 只股票".format(len(stocks)))
|
||||
print(stocks.head(10))
|
||||
|
||||
print("\n[4/5] 获取日线数据 ({} start={})...".format(args.ts_code, args.start))
|
||||
try:
|
||||
daily = dm.get_daily(args.ts_code, start=args.start)
|
||||
if not daily.empty:
|
||||
print("[OK] 获取到 {} 条日线".format(len(daily)))
|
||||
print(" 日期范围: {} ~ {}".format(daily['trade_date'].min(), daily['trade_date'].max()))
|
||||
print(daily.tail(5))
|
||||
else:
|
||||
print("[WARN] 日线数据为空(AkShare+Tushare 均不可用)")
|
||||
except Exception as e:
|
||||
print("[WARN] 日线获取异常: {}".format(e))
|
||||
|
||||
print("\n[5/5] 增量同步测试...")
|
||||
try:
|
||||
count = dm.sync_daily(args.ts_code)
|
||||
print("[OK] 增量同步结果: {} 条".format(count))
|
||||
except Exception as e:
|
||||
print("[WARN] 增量同步异常: {}".format(e))
|
||||
|
||||
try:
|
||||
from reports.storage import save_report
|
||||
save_report("## 数据层验证 — {}\n\n- 股票列表: OK\n- 日线数据: OK\n- 增量同步: OK".format(args.ts_code),
|
||||
"数据层验证", subject_type="stock", subject_code=args.ts_code)
|
||||
print("\n 报告已存入 DB")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
print("\n" + "=" * 60)
|
||||
print("验证完成")
|
||||
print("=" * 60)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user