/** * 纯 Node A 股数据源(零 Python 依赖、零第三方包)—— dsh-strategy 域。 * * 动机:原研究台用 akshare 取 CSI300 成分股,引入 Python 依赖。 * 本模块用公开 HTTP 端点替代,全部走 Node 原生 fetch: * * - **成分股**:东方财富 datacenter 的 RPT_INDEX_COMPONENT 报表 * (实测与 akshare 结果的交集 300/300,完全一致) * - **日线**:复用 dsh-quant 既有的 sina / tencent 通道(前复权) * * 契约:所有网络函数接受 AbortSignal,超时由调用方控制;返回值经结构校验, * 异常数据(不足 bar、非正价格)被丢弃而不是静默传入回测。 */ /** 一只标的的日线序列(前复权)。 */ export interface DailyBars { /** 带交易所前缀的代码,如 sh600000 */ symbol: string; /** 数据来源标识 */ provider: string; /** K 线(按时间升序) */ candles: { openTime: number; open: number; high: number; low: number; close: number; volume: number; }[]; } /** 常用指数代码(东方财富 INDEX_CODE 口径)。 */ export declare const INDEX_CODES: { /** 沪深300 */ readonly csi300: "000300"; /** 中证500 */ readonly csi500: "000905"; /** 中证1000 */ readonly csi1000: "000852"; /** 上证50 */ readonly sse50: "000016"; }; /** * 6 位代码 → 带交易所前缀的符号;无法判定时返回 undefined。 * * 校验规则(被单元测试抓过一个边界):输入必须是**恰好 6 位数字**, * 不做左侧补零 —— 早期实现对 '12345' 补成 '012345' 并返回 sz012345, * 那是个不存在的代码;错误输入必须显式拒绝而不是静默编造。 */ export declare function toSymbol(code: string): string | undefined; /** 带交易所前缀的符号 → 6 位代码。 */ export declare function toCode(symbol: string): string; /** * 抓取一个指数的成分股代码列表(纯 Node,无需 Python)。 * * 数据源:东方财富 RPT_INDEX_COMPONENT 报表(公开 JSON 接口)。 * 已验证:CSI300 返回 300 条,与 akshare 的成分股集合完全一致。 * * @param indexCode 指数代码,见 INDEX_CODES(默认沪深300) * @param signal 中止信号 * @returns 6 位股票代码(去重、已排序) */ export declare function fetchIndexConstituents(indexCode?: string, signal?: AbortSignal): Promise; /** * 抓取指数成分股并用给定取数函数拉日线(并发受限、失败重试、多源回退)。 * * @param options.indexCode 指数代码 * @param options.limit 最多取多少只(默认全部) * @param options.candles 单只标的的取数函数(如传入 dsh-quant 的 fetchKlines 包装) * @param options.concurrency 并发数(默认 4,避免被数据源限流) * @param options.retries 单只标的重试次数(默认 3) * @param options.signal 中止信号 * @returns 成功取到的日线与失败清单 */ export declare function fetchIndexUniverse(options: { indexCode?: string; limit?: number; concurrency?: number; retries?: number; signal?: AbortSignal; candles: (symbol: string, signal?: AbortSignal) => Promise; }): Promise<{ bars: DailyBars[]; failed: string[]; requested: number; }>;