From 5bd8af20ac39e1d9973e57c3a40980c928326758 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=A5=E5=BE=AE?= Date: Fri, 3 Jul 2026 13:46:12 +0800 Subject: [PATCH] migrate: live_prices+mtf+capital_flow DB read/write, cleanup remaining JSON refs --- .../strategy_lifecycle.cpython-312.pyc | Bin 107475 -> 107295 bytes data/mofin.db-shm | Bin 0 -> 32768 bytes data/mofin.db-wal | Bin 0 -> 57712 bytes data/portfolio.json | 76 +++++++++--------- scripts/price_monitor.py | 5 +- strategy_lifecycle.py | 9 +-- 6 files changed, 44 insertions(+), 46 deletions(-) create mode 100644 data/mofin.db-shm create mode 100644 data/mofin.db-wal diff --git a/__pycache__/strategy_lifecycle.cpython-312.pyc b/__pycache__/strategy_lifecycle.cpython-312.pyc index bc5d3dbefe57d5484d1017b49ba643855d59189a..53b3788a63df7a6f9f0dfdbde33e697e9729d5ab 100644 GIT binary patch delta 5659 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 literal 0 HcmV?d00001 diff --git a/data/mofin.db-wal b/data/mofin.db-wal new file mode 100644 index 0000000000000000000000000000000000000000..e507e1cc0e9c7ae98ccc078c7193c19a392bb256 GIT binary patch literal 57712 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 P0>}lB3m_Nxx?JG@t(GcA literal 0 HcmV?d00001 diff --git a/data/portfolio.json b/data/portfolio.json index d22799d..ba95f0b 100644 --- a/data/portfolio.json +++ b/data/portfolio.json @@ -5,9 +5,9 @@ "name": "中际旭创", "shares": 100, "cost": 1316.53, - "price": 1145.0, + "price": 1143.84, "market_value": 114101.0, - "change_pct": 0.17, + "change_pct": 0.07, "currency": "CNY", "position_pct": 15.27, "_currency": "CNY" @@ -17,9 +17,9 @@ "name": "长飞光纤光缆", "shares": 500, "cost": 228.65, - "price": 178.26, + "price": 177.39, "market_value": 89910.0, - "change_pct": 3.859, + "change_pct": 3.35, "currency": "CNY", "position_pct": 13.47, "_currency": "CNY" @@ -29,9 +29,9 @@ "name": "丘钛科技", "shares": 11000, "cost": 11.68, - "price": 6.1, + "price": 6.09, "market_value": 67210.0, - "change_pct": 4.762, + "change_pct": 4.464, "currency": "CNY", "position_pct": 7.97, "_currency": "CNY" @@ -41,9 +41,9 @@ "name": "紫金矿业", "shares": 2400, "cost": 39.89, - "price": 27.8, + "price": 27.86, "market_value": 66864.0, - "change_pct": 5.7, + "change_pct": 5.93, "currency": "CNY", "position_pct": 7.34, "_currency": "CNY" @@ -53,9 +53,9 @@ "name": "海博思创", "shares": 200, "cost": 266.95, - "price": 254.75, + "price": 254.42, "market_value": 50842.0, - "change_pct": -0.38, + "change_pct": -0.5, "currency": "CNY", "position_pct": 6.31, "_currency": "CNY" @@ -65,9 +65,9 @@ "name": "中芯国际", "shares": 300, "cost": 126.07, - "price": 142.97, + "price": 143.01, "market_value": 42600.0, - "change_pct": -0.78, + "change_pct": -0.76, "currency": "CNY", "position_pct": 5.44, "_currency": "CNY" @@ -77,9 +77,9 @@ "name": "建滔积层板", "shares": 500, "cost": 76.5, - "price": 74.17, + "price": 73.96, "market_value": 37325.0, - "change_pct": 2.088, + "change_pct": 1.79, "currency": "CNY", "position_pct": 5.28, "_currency": "CNY" @@ -89,9 +89,9 @@ "name": "华恒生物", "shares": 2800, "cost": 21.51, - "price": 16.72, + "price": 16.71, "market_value": 46900.0, - "change_pct": -1.36, + "change_pct": -1.42, "currency": "CNY", "position_pct": 5.25, "_currency": "CNY" @@ -101,9 +101,9 @@ "name": "宁德时代", "shares": 100, "cost": 401.78, - "price": 380.24, + "price": 380.88, "market_value": 38032.0, - "change_pct": -0.55, + "change_pct": -0.38, "currency": "CNY", "position_pct": 4.64, "_currency": "CNY" @@ -113,9 +113,9 @@ "name": "比亚迪股份", "shares": 600, "cost": 90.92, - "price": 71.83, + "price": 71.4, "market_value": 43044.0, - "change_pct": 5.811, + "change_pct": 5.172, "currency": "CNY", "position_pct": 4.62, "_currency": "CNY" @@ -137,9 +137,9 @@ "name": "腾讯", "shares": 100, "cost": null, - "price": 376.8, + "price": 374.72, "market_value": 37541.0, - "change_pct": 1.023, + "change_pct": 0.465, "currency": "CNY", "position_pct": null, "_currency": "CNY" @@ -149,9 +149,9 @@ "name": "中芯国际", "shares": 500, "cost": 65.84, - "price": 68.41, + "price": 67.63, "market_value": 34440.0, - "change_pct": -1.866, + "change_pct": -2.985, "currency": "CNY", "position_pct": 4.2, "_currency": "CNY" @@ -161,9 +161,9 @@ "name": "长芯博创", "shares": 100, "cost": 231.46, - "price": 226.5, + "price": 226.24, "market_value": 22599.0, - "change_pct": 2.03, + "change_pct": 1.91, "currency": "CNY", "position_pct": 3.2, "_currency": "CNY" @@ -185,9 +185,9 @@ "name": "中科电气", "shares": 1400, "cost": 22.29, - "price": 14.38, + "price": 14.37, "market_value": 20062.0, - "change_pct": 1.48, + "change_pct": 1.41, "currency": "CNY", "position_pct": 2.42, "_currency": "CNY" @@ -197,9 +197,9 @@ "name": "模塑科技", "shares": 1400, "cost": 14.83, - "price": 17.62, + "price": 17.66, "market_value": 25088.0, - "change_pct": 4.45, + "change_pct": 4.68, "currency": "CNY", "position_pct": 2.41, "_currency": "CNY" @@ -209,9 +209,9 @@ "name": "法拉电子", "shares": 100, "cost": 147.18, - "price": 160.0, + "price": 160.15, "market_value": 15900.0, - "change_pct": -2.62, + "change_pct": -2.53, "currency": "CNY", "position_pct": 2.3, "_currency": "CNY" @@ -221,20 +221,20 @@ "name": "中国神华", "shares": 500, "cost": 39.79, - "price": 34.59, + "price": 34.56, "market_value": 17305.0, - "change_pct": 0.758, + "change_pct": 0.657, "currency": "CNY", "position_pct": 2.14, "_currency": "CNY" } ], - "total_assets": 860913.13, - "total_mv": 780437.13, + "total_assets": 859635.43, + "total_mv": 779159.43, "stock_value": null, "cash": 80476.0, "frozen_cash": 0.0, - "position_pct": 90.65, + "position_pct": 90.64, "currency": "CNY", - "updated_at": "2026-07-03 13:42" + "updated_at": "2026-07-03 13:44" } \ No newline at end of file diff --git a/scripts/price_monitor.py b/scripts/price_monitor.py index 99c1854..34b5901 100644 --- a/scripts/price_monitor.py +++ b/scripts/price_monitor.py @@ -314,7 +314,7 @@ def refresh_data_prices(): if code in prices: p, c, chg = prices[code] live["prices"][code] = {"price": p, "change_pct": chg} - json.dump(live, open("/home/hmo/web-dashboard/data/live_prices.json", "w"), indent=2) + # json.dump(live, ...) — 已迁移到 DB,见根 price_monitor.py except Exception: pass @@ -739,7 +739,8 @@ def run_once(round_label=""): # === 3.5 资金流异常检测(2026-06-27 新增)=== try: - cf = json.load(open("/home/hmo/web-dashboard/data/capital_flow_cache.json")) + from mofin_db import get_conn, read_capital_flow_cache + cf = read_capital_flow_cache(get_conn()) # 检查所有 active decision 中的资金流异常 for d in active: code = d["code"] diff --git a/strategy_lifecycle.py b/strategy_lifecycle.py index fb7e8a1..c475b3f 100644 --- a/strategy_lifecycle.py +++ b/strategy_lifecycle.py @@ -989,7 +989,7 @@ def reassess_strategy(code, name, price, cost, shares, current_action, time_horizon = "2周~3月" position_advice = "中等仓位" try: - mtf_cache = json.load(open("/home/hmo/web-dashboard/data/multi_tf_cache.json")) + mtf_cache = mtf._load_mtf_cache() stock_data = mtf_cache.get(code, {}) daily_klines = stock_data.get("daily", []) fund = stock_data.get("fundamentals", {}) @@ -1537,11 +1537,8 @@ def load_stock_news_sentiment(code): def load_fundamentals(code): """加载个股基本面""" try: - path = "/home/hmo/web-dashboard/data/multi_tf_cache.json" - if not os.path.exists(path): - return {} - m = json.load(open(path)) - return m.get(code, {}).get("fundamentals", {}) or {} + cache = mtf._load_mtf_cache() + return cache.get(code, {}).get("fundamentals", {}) or {} except Exception: return {}