diff --git a/scripts/collect_evaluation_data.py b/scripts/collect_evaluation_data.py index e5eda77f..293ca5f8 100644 --- a/scripts/collect_evaluation_data.py +++ b/scripts/collect_evaluation_data.py @@ -141,33 +141,67 @@ def safe_float(v): def parse_stock_data(code, fields, is_hk=False): """从腾讯 API 字段解析为结构化数据""" - data = { - "code": code, - "name": fields[1] if len(fields) > 1 else code, - "price": safe_float(fields[3]), - "prev_close": safe_float(fields[4]), - "open": safe_float(fields[5]) if not is_hk else None, - "change_pct": safe_float(fields[32]), - "high": safe_float(fields[33]), - "low": safe_float(fields[34]), - "volume": safe_float(fields[6]), # 股数 - } + # fields可能是dict(已解析)或list(原始split) + if isinstance(fields, dict): + data = { + "code": code, + "name": fields.get("name", code), + "price": safe_float(fields.get("price", 0)), + "prev_close": safe_float(fields.get("prev_close", 0)), + "open": safe_float(fields.get("open", 0)) if not is_hk else None, + "change_pct": safe_float(fields.get("change_pct", 0)), + "high": safe_float(fields.get("high", 0)), + "low": safe_float(fields.get("low", 0)), + "volume": safe_float(fields.get("volume", 0)), + } + else: + data = { + "code": code, + "name": fields[1] if len(fields) > 1 else code, + "price": safe_float(fields[3]), + "prev_close": safe_float(fields[4]), + "open": safe_float(fields[5]) if not is_hk else None, + "change_pct": safe_float(fields[32]), + "high": safe_float(fields[33]), + "low": safe_float(fields[34]), + "volume": safe_float(fields[6]), + } # A股特有字段 (index 35+) - if not is_hk and len(fields) > 46: - data["turnover_rate"] = safe_float(fields[38]) # 换手率% - data["pe"] = safe_float(fields[47]) # 市盈率(动) - data["total_market_cap"] = safe_float(fields[44]) # 总市值(亿) - data["circulating_market_cap"] = safe_float(fields[45]) # 流通市值(亿) - data["high_52w"] = safe_float(fields[48]) # 52周高 - data["low_52w"] = safe_float(fields[49]) # 52周低 - data["amplitude"] = safe_float(fields[43]) # 振幅% + if not is_hk: + if isinstance(fields, dict): + data["turnover_rate"] = safe_float(fields.get("turnover_rate", 0)) + data["amplitude"] = safe_float(fields.get("amplitude", 0)) + data["pe"] = safe_float(fields.get("pe", 0)) + data["market_cap"] = safe_float(fields.get("market_cap", 0)) + else: + data["turnover_rate"] = safe_float(fields[38]) if len(fields) > 38 else 0 + data["amplitude"] = safe_float(fields[39]) if len(fields) > 39 else 0 + data["pe"] = safe_float(fields[39]) if len(fields) > 39 else 0 + data["market_cap"] = safe_float(fields[45]) if len(fields) > 45 else 0 + # 港股特有 + if is_hk: + data["market"] = "HK" + if isinstance(fields, dict): + data["high_52w"] = safe_float(fields.get("high_52w", 0)) + data["low_52w"] = safe_float(fields.get("low_52w", 0)) + data["amplitude"] = safe_float(fields.get("amplitude", 0)) + else: + data["high_52w"] = safe_float(fields[48]) if len(fields) > 48 else 0 + data["low_52w"] = safe_float(fields[49]) if len(fields) > 49 else 0 + data["amplitude"] = safe_float(fields[43]) if len(fields) > 43 else 0 # 港股特有字段 - if is_hk and len(fields) > 70: - # 港股 PE 在 [71] 左右 - data["pe"] = safe_float(fields[71]) - data["total_market_cap"] = safe_float(fields[69]) - data["high_52w"] = safe_float(fields[48]) - data["low_52w"] = safe_float(fields[49]) + if is_hk: + if isinstance(fields, dict): + data["pe"] = safe_float(fields.get("pe", 0)) + data["total_market_cap"] = safe_float(fields.get("total_market_cap", 0)) + data["high_52w"] = safe_float(fields.get("high_52w", 0)) + data["low_52w"] = safe_float(fields.get("low_52w", 0)) + else: + if len(fields) > 70: + data["pe"] = safe_float(fields[71]) + data["total_market_cap"] = safe_float(fields[69]) + data["high_52w"] = safe_float(fields[48]) + data["low_52w"] = safe_float(fields[49]) return data diff --git a/scripts/data_governance.py b/scripts/data_governance.py index 894086a5..42041628 100644 --- a/scripts/data_governance.py +++ b/scripts/data_governance.py @@ -60,7 +60,7 @@ def main(): print(f"holding_strategies: 归档{archived}条过期记录 | 剩余活跃{remaining}条") # 2. 检查缺失策略的持仓 - decisions = mo_data.read_decisions() + decisions = read_decisions() decisions_list = decisions.get("decisions", []) missing = check_missing_strategies(conn, decisions_list) if missing: diff --git a/scripts/strategy_review.py b/scripts/strategy_review.py index 26f5ab85..9459e9dd 100644 --- a/scripts/strategy_review.py +++ b/scripts/strategy_review.py @@ -67,7 +67,7 @@ def evaluate_strategy(s, price): s_type = s.get("type", "") # 持仓策略/自选策略 if not created or not price: - return "skip", "skip", "skip", "数据不足" + return "skip", "skip", "skip", "数据不足", "" # 计算运行天数 try: @@ -198,7 +198,7 @@ def evaluate_strategy(s, price): def review(): start = time.time() - decisions = mo_data.read_decisions() + decisions = read_decisions() strategies = decisions.get("decisions", []) conn = sqlite3.connect(str(DB_PATH))