"""共享测试装置:合成确定性 A 股行情(含涨跌趋势与噪声,无外部依赖)。""" from __future__ import annotations from decimal import Decimal import numpy as np import pandas as pd def synthetic_daily(drifts: dict[str, float], n: int = 320, base: float = 100.0) -> pd.DataFrame: """生成多股票日线长表。 每股价格:p[j] = p[j-1] * (1 + drift + 0.012 * sin((j + i) * 0.8)) —— 确定性、 趋势 + 微幅周期噪声;含 high/low/volume/amount 供各因子使用。 """ dates = pd.bdate_range("2024-01-01", periods=n) rows: list[dict] = [] for i, (sym, drift) in enumerate(drifts.items()): price = float(base) for j, d in enumerate(dates): ret = drift + 0.012 * np.sin((j + i) * 0.8) prev = price price = price * (1 + ret) rows.append( { "symbol": sym, "trade_date": d.date(), "open": float(prev), "high": float(price * 1.008), "low": float(min(prev, price) * 0.992), "close": float(price), "volume": float(1_000_000 + j * 1000 + i * 3000), "amount": float(price * (1_000_000 + j * 1000 + i * 3000)), } ) return pd.DataFrame(rows) def bars_dataframe_to_daily_bars(daily: pd.DataFrame) -> list: """测试辅助:DataFrame → domain DailyBar 实体(供 service/仓储层路径测试)。""" from app.domain.entities.market import DailyBar return [ DailyBar( symbol=r.symbol, trade_date=r.trade_date, open=Decimal(str(r.open)), high=Decimal(str(r.high)), low=Decimal(str(r.low)), close=Decimal(str(r.close)), volume=Decimal(str(r.volume)), amount=Decimal(str(r.amount)), ) for r in daily.itertuples() ]