全部
文章&策略
学习干货
问答
官方
用户头像sh_****1537o1
2026-08-11 发布
""" 低回撤多资产风险平价策略(精简可运行版) 三层风控:风险平价分散 → 趋势过滤降仓 → 回撤熔断空仓 资产池:红利低波ETF + 沪深300ETF + 短债ETF + 国债ETF + 黄金ETF + 现金 """ import numpy as np import pandas as pd ============ 资产池 ============ ASSETS = { '512890.SH': 'equity', # 红利低波ETF '510300.SH': 'equity', # 沪深300ETF '511360.SH': 'bond', # 短债ETF '511010.SH': 'bond', # 国债ETF '518880.SH': 'commodity',# 黄金ETF '511880.SH': 'cash', # 现金ETF } ASSET_CODES = list(ASSETS.keys()) EQUITY_CODES = [c for c, t in ASSETS.items() if t == 'equity'] ============ 参数 ============ VOL_WINDOW = 60 # 波动率计算窗口 TREND_FAST = 20 # 短期均线 TREND_SLOW = 200 # 长期均线(趋势过滤) MAX_EQUITY = 0.25 # 权益仓位上限 DD_WARN = -0.03 # 回撤3%→防御模式 DD_CUT = -0.05 # 回撤5%→熔断 MIN_TRADE_PCT = 0.02 # 权重偏离<2%不调仓 SLIPPAGE = 0.002 # 滑点0.2% def init(context): g.last_month = get_datetime().strftime('%Y%m') g.peak = context.portfolio.portfolio_value g.state = 'NORMAL' g.weights = {} set_benchmark('000300.SH') set_slippage(PriceSlippage(SLIPPAGE)) set_commission(PerShare(type='stock', cost=0.0002, min_trade_cost=5.0)) run_daily(daily_task) log.info('[初始化] 低回撤多资产风险平价策略就绪') def daily_task(context, bar_dict): """每日执行:更新状态 → 判断是否调仓 → 执行""" update_state(context) month = get_datetime().strftime('%Y%m') 触发条件:月度再平衡 OR 状态切换 OR 权益仓位超限 need = False if month != g.last_month: need = True g.last_month = month if g.state in ('DEFENSIVE', 'SAFE'): eq = equity_ratio(context) limit = 0.05 if g.state == 'SAFE' else 0.15 if eq > limit: need = True if need: execute_rebalance(context, bar_dict) def update_state(context): """更新风控状态:回撤熔断 > 趋势过滤 > 正常""" pv = context.portfolio.portfolio_value if pv > g.peak: g.peak = pv dd = (pv - g.peak) / g.peak if g.peak > 0 else 0 trend_ok = check_trend() if dd <= DD_CUT: g.state = 'SAFE' elif dd <= DD_WARN or not trend_ok: g.state = 'DEFENSIVE' else: g.state = 'NORMAL' def check_trend(): """沪深300是否处于上升趋势(20日线>200日线且20日线向上)""" p = history('000300.SH', ['close'], TREND_SLOW + 30, '1d', False, 'pre') if len(p['close']) < TREND_SLOW + 5: return True c = p['close'] ma20 = c.tail(TREND_FAST).mean() ma200 = c.tail(TREND_SLOW).mean() ma20_prev = c.iloc[-TREND_FAST - 1:-1].mean() return c.iloc[-1] > ma200 and ma20 > ma200 and ma20 > ma20_prev def equity_ratio(context): pv = context.portfolio.portfolio_value if pv <= 0: return 0 eq_val = 0.0 for c in EQUITY_CODES: pos = context.portfolio.positions.get(c) if pos is not None and pos.amount > 0: eq_val += pos.amount * pos.last_price return eq_val / pv def execute_rebalance(context, bar_dict): 批量拉取所有资产的收盘价 prices = fetch_closes(ASSET_CODES, VOL_WINDOW + 10) weights = target_weights(prices, g.state) if not weights: return pv = context.portfolio.portfolio_value for code, target_w in weights.items(): pos = context.portfolio.positions.get(code) cur_val = pos.amount * pos.last_price if pos is not None and pos.amount > 0 else 0 cur_w = cur_val / pv if pv > 0 else 0 if abs(cur_w - target_w) < MIN_TRADE_PCT: continue target_val = pv * target_w order_target_value(code, target_val) g.weights = weights log.info('[调仓] 状态=%s 权益=%.1f%% 权重=%s' % ( g.state, equity_ratio(context) * 100, {c: '%.1f%%' % (w * 100) for c, w in weights.items() if w > 0.01})) def fetch_closes(codes, count): """批量获取多资产收盘价,对齐日期后返回 DataFrame(行=日期, 列=代码)""" series = {} for c in codes: h = history(c, ['close'], count, '1d', False, 'pre') if h is not None and len(h['close']) >= count // 2: series[c] = h['close'] if not series: return pd.DataFrame() return pd.concat({c: s for c, s in series.items()}, axis=1).dropna(how='all') def target_weights(prices, state): """计算目标权重""" codes = [c for c in ASSET_CODES if c in prices.columns] if state == 'SAFE': return _preset_weights({ '511360.SH': 0.60, '511010.SH': 0.20, '518880.SH': 0.12, '511880.SH': 0.08, }) if state == 'DEFENSIVE': w = _rp_weights(prices[codes]) if len(codes) >= 3 else None if w is None: return _preset_weights({ '512890.SH': 0.05, '510300.SH': 0.05, '511360.SH': 0.55, '511010.SH': 0.15, '518880.SH': 0.10, '511880.SH': 0.10, }) eq_sum = sum(w.get(c, 0) for c in EQUITY_CODES) if eq_sum > 0.10: scale = 0.10 / eq_sum for c in EQUITY_CODES: if c in w: w[c] *= scale deficit = 1 - sum(w.values()) w['511360.SH'] = w.get('511360.SH', 0) + deficit return w NORMAL w = _rp_weights(prices[codes]) if len(codes) >= 3 else None if w is None: return _preset_weights({ '512890.SH': 0.15, '510300.SH': 0.10, '511360.SH': 0.40, '511010.SH': 0.20, '518880.SH': 0.10, '511880.SH': 0.05, }) eq_sum = sum(w.get(c, 0) for c in EQUITY_CODES) if eq_sum > MAX_EQUITY: scale = MAX_EQUITY / eq_sum for c in EQUITY_CODES: if c in w: w[c] *= scale deficit = 1 - sum(w.values()) w['511360.SH'] = w.get('511360.SH', 0) + deficit return w def _rp_weights(price_df): """简化风险平价:波动率倒数加权""" if price_df.empty or price_df.shape[1] < 3: return None returns = price_df.pct_change().dropna(how='all').tail(VOL_WINDOW) if returns.empty or len(returns) < VOL_WINDOW // 2: return None vol = returns.std() * np.sqrt(252) vol = vol.replace(0, np.nan) med = vol.median() if np.isnan(med) or med <= 0: return None vol = vol.fillna(med) inv_vol = 1.0 / vol raw = inv_vol / inv_vol.sum() w = {c: float(raw[c]) if c in raw.index else 0 for c in ASSET_CODES} total = sum(w.values()) if total <= 0: return None return {k: v / total for k, v in w.items()} def _preset_weights(template): """预设权重模板 → 完整7资产权重""" w = {c: template.get(c, 0) for c in ASSET_CODES} total = sum(w.values()) if total <= 0: w['511360.SH'] = 1.0 return w return {k: v / total for k, v in w.items()} def handle_bar(context, bar_dict): pass
浏览29
评论0
收藏0
用户头像9点半量化
2026-08-11 发布
引言:为什么成交量是散户的“翻译官”? 很多新手投资者在复盘时,往往会被错综复杂的K线走势和剧烈的价格波动搞得头晕脑胀。单纯看股价的涨跌,就像是在没有翻译的情况下听一场外语讲座,你只能看到演讲者的情绪起伏,却听不懂其背后的逻辑内核。 在股市的千变万化中,价格可能会因为各种因素产生“诱多”或“诱空”的假象,但成交量却是真金白银堆出来的,最难作假。正如我们常说的“量在价先”,成交量是市场的“翻译官”,它能告诉你价格波动背后的能量等级与主力真实的动向。本篇文章将通过 6 句极其简练的实战口诀,带你穿透市场迷雾,看清交易真相。 什么是真正的“放量”与“缩量”? 在掌握口诀之前,我们必须纠正一个常见的认知误区:判断成交量的变化,不看柱子的颜色(红或绿),只看柱子的相对长度。颜色仅仅代表当天的收盘涨跌,而长度才代表能量的释放程度。 ●**放量:只要右边的柱子比左边的长,即为放量**。 ●**缩量:只要右边的柱子比左边的短,即为缩量**。 这种简单的横向对比比查看具体的成交数值更具实战意义。它反映了市场参与情绪的即时变化——是多空双方在激烈博弈,还是市场归于冷静。 警惕:放量上涨,反而是调整的开始? 在很多人的直觉里,量价齐升是最好的追涨信号。但从资深交易者的视角来看,能量的释放必须是有节奏的,过快的消耗往往不可持续。 “放量上涨必然会调” 这背后的逻辑在于:成交量剧增说明多头能量在短时间内过度透支。随着股价快速推升,获利盘的抛售意愿会随着上涨而加强。当场外愿意入场的“接棒”资金跟不上这种剧烈的能量消耗时,由于筹码在高位的高频交换,股价往往会迎来阶段性的调整或回踩。 机会:放量下跌,是反弹的先兆? 看到股价伴随巨大的成交量下跌,大多数人会感到恐慌,但这往往是转机出现的关键时刻。 “放量下跌定要反弹” 这种现象通常代表市场出现了“恐慌盘出逃”。当持筹不坚决的散户纷纷割肉离场时,接盘的往往是更有耐心的主力资金。这种剧烈的筹码交换意味着做空动能的集中释放。一旦市场中想卖的人都卖掉了,卖压就会瞬间枯竭,股价极易在低位触发报复性的反弹。 惯性:缩量涨跌,趋势仍在继续 相比于“放量”代表的剧烈冲突,“缩量”则代表了市场的一种“一致性”——即市场共识高度统一,没有产生明显的分歧。 **●**缩量上涨还会上涨 **●**缩量下跌继续下跌 反转:当成交量与价格不再同步 当成交量与价格的走势出现背离时,说明原有的趋势已经到了强弩之末,市场即将发生大反转。 ●头部预警(放量不涨): ●底部确认(缩量不跌): 转折点核心特征对比: **●**头部信号特征:放量但价格滞涨。反映了即便动力十足也推不动价格,预示上方抛压如山。 **●**底部信号特征:缩量但价格止跌。反映了没有人愿意卖了,市场进入无人喝彩的极度冷静期,反而是大机会的前夜。 结语:从口诀到实战的最后一步 成交量反映的是最真实的市场动能,它是股价的“油门”和“刹车”。通过这 6 句口诀,我们可以快速识别出市场是处于惯性冲刺,还是已经处于变盘的边缘。 然而,股市博弈千变万化,口诀是统计学意义上的高概率规律,而实战则需要根据盘面实时验证。最后,留下一个启发性的问题供大家思考:“当下一次当你看到股价正在猛涨,但成交量却在不断萎缩时,你认为这是一个踏空者的深渊陷阱,还是一个持仓者的加速机会?” 希望这些规律能成为你投资路上的航标,助你在实战中看懂主力,游刃有余。
浏览33
评论0
收藏0
用户头像mo_*82130o
2026-08-11 发布
在长期从事外汇量化模型搭建、历史数据回测与实盘行情对接的工作中,我频繁遇到一类隐蔽且极具迷惑性的量化误差问题。在迭代多币种行情分析与策略回测模块时,我反复校验价格采集、数据聚合、指标运算等核心逻辑,确认所有价格维度的数据均无异常,但系统最终输出的周期K线结构、周期统计结果始终与标准交易周期存在错位,直接导致回测拟合度失真、交易信号判定偏差,严重影响量化模型的有效性。 一、多源外汇数据时间异构:量化偏差的隐形源头 外汇行情依托全球多时区交易市场生成,数据源分散且无统一的行业时间规范,不同第三方数据接口的时间编码规则存在明显差异。目前量化开发场景中,接口返回的时间体系主要分为三类:UTC标准时间、交易服务器时间、区域本地时间,三类时间混用是多币种量化数据无法对齐的关键原因。 即便是同一时间节点的市场行情,不同数据源输出的时间字段也会出现数小时偏差。我整理了量化开发中三类主流时间格式的特性及适配场景,适配回测与实盘开发需求: 若量化程序直接调用未经校准的原始时间戳进行K线切片、周期统计与策略回测,跨数据源的行情数据将无法映射至统一的交易周期。在分钟线、小时线等短周期高频量化模型中,小时级别的时区偏移会直接打乱行情数据的周期归属,造成回测信号错位、胜率统计失真、实盘与回测逻辑背离。多数无解的量化数据异常,本质上均是时间标准化缺失引发的系统性问题。 二、底层优化思路:数据入库阶段统一UTC时间基准 结合多年量化项目落地经验,我总结出一套高稳定性的工程规范:所有时区校准、时间格式统一工作,必须前置在数据接入入库环节完成,禁止在后续指标计算、回测分析、信号生成阶段临时处理。后置处理会导致各业务模块校准规则割裂,造成回测环境与实盘环境的数据偏差,大幅降低模型可落地性。 目前我在所有多币种外汇量化项目中,均采用一套通用标准化数据处理链路,可全面适配EUR/USD、USD/JPY等主流币种,实现全场景数据逻辑统一: 行情数据接收 → 原始时间字段解析 → 统一转换UTC标准时间 → 结构化入库存储 → 按需适配展示时间 该标准化链路从源头规避了时区异构问题,让多币种数据聚合、周期切片、策略回测的底层逻辑完全统一,有效消除因时间差异导致的量化误差。 在Python量化开发场景中,专业时区库是实现精准时间转换的核心工具,坚决摒弃手动固定时差的粗放写法,可完美适配全球时区切换规则,规避夏令时、冬令时带来的系统性偏差,标准化转换代码如下: 时间类型 示例 核心应用场景 UTC时间 2026-08-10 12:00:00 系统底层存储、量化策略运算、历史回测统计 本地时间 2026-08-10 08:00:00 行情可视化展示、数据结果预览 服务器时间 2026-08-10 20:00:00 部分第三方数据接口原生返回格式 二、底层优化思路:数据入库阶段统一UTC时间基准 目前我在所有多币种外汇量化项目中,均采用一套通用标准化数据处理链路,可全面适配EUR/USD、USD/JPY等主流币种,实现全场景数据逻辑统一: 该标准化链路从源头规避了时区异构问题,让多币种数据聚合、周期切片、策略回测的底层逻辑完全统一,有效消除因时间差异导致的量化误差。 from datetime import datetime import pytz time_str = "2026-08-10 09:30:00" eastern = pytz.timezone("US/Eastern") local_time = datetime.strptime( time_str, "%Y-%m-%d %H:%M:%S" ) local_time = eastern.localize(local_time) utc_time = local_time.astimezone( pytz.utc ) print("UTC时间:", utc_time) 三、高频Tick数据优化:实时行情时序校准的必要性 为避免各业务模块重复开发、规则不统一的问题,我将全局时间标准化逻辑部署在数据接收层,实现一次校准、全业务复用。在量化实盘开发中,我会依托AllTick API的WebSocket行情接口获取稳定的高频实时数据流,配合前置时间校准逻辑,有效保障实时行情时序精准度,基础接入代码如下: import websocket import json def on_message(ws, message): data = json.loads(message) symbol = data.get("symbol") price = data.get("price") timestamp = data.get("timestamp") print( "AllTick API", symbol, price, timestamp ) ws = websocket.WebSocketApp( "wss://apis.alltick.co/websocket", on_message=on_message ) ws.run_forever() 四、量化开发核心细节:规避时间维度隐性误差 结合大量多币种回测与实盘运维经验,我整理出三个容易被忽略、但直接决定量化系统稳定性的核心细节,是优化量化数据精度的关键: 第一,杜绝使用服务器本地时间作为行情统计基准。项目部署迁移、服务器环境迭代、机房时区配置变更,都会引发历史数据时间批量偏移,破坏回测数据集的连续性与完整性,导致模型拟合失效。 第二,按需匹配时间精度。常规行情展示、低频量化策略可采用秒级时间精度,但高频Tick量化模型、短时趋势套利策略,必须依托毫秒级时间精度,避免精度缺失导致的数据排序错乱、事件时序判定错误。 第三,分离运算时间与展示时间体系。数据库存储、数据聚合、策略回测、实盘运算全程采用UTC统一时间基准,保障量化逻辑唯一稳定;仅在数据可视化环节,根据展示需求做本地化时区转换,兼顾数据严谨性与可读性。 五、研究总结:时间标准化是量化数据链路的底层基石 长期深耕外汇量化研究与系统开发,我发现多数复杂的回测异常、策略漂移、数据错乱问题,根源均是底层基础细节处理不规范。价格数据决定行情波动的核心逻辑,而标准化的时间数据,定义了所有行情数据、交易信号、周期统计的归属准确性。 面对多源外汇接口杂乱的原生时间规则,提前搭建一套标准化的时间预处理体系,能够从源头规避时区、格式差异带来的各类量化问题,显著提升数据分析、K线生成、策略回测与实盘运行的稳定性,有效缩小回测与实盘的收益偏差。 时间格式标准化属于隐形底层技术,虽不如交易策略、核心算法直观,但贯穿整条量化数据链路,直接决定数据集的可信度与量化模型的落地有效性,是外汇量化研究者与开发人员必须夯实的基础能力。
浏览26
评论0
收藏0
用户头像sh_****447dvu
2026-08-11 发布
在黄金量化研究过程中,很多研究者会通过实时 API 拉取 XAUUSD 逐笔 Tick 数据,用于指标计算、K 线重构以及策略回测验证。实际开发中会遇到一类隐蔽问题:WebSocket 服务刚启动时行情接收完全正常,但长时间持续接收数据流之后,会不定期收到字段残缺的 Tick 报文。 部分报文缺少价格字段,也有部分报文成交量字段为空。孤立观察单条异常 Tick 很难发现问题,但这类不合格数据一旦流入下游,会直接破坏时间序列完整性,造成 K 线聚合失真,进一步影响回测结果可信度,甚至干扰实盘策略的信号生成。 项目初期我曾怀疑是行情服务端返回异常,经过多组实时流与历史归档样本比对后发现:实时流式行情与离线历史数据集存在本质差异。网络扰动、WebSocket 长连接会话状态切换、行情源推送规则差异,均会造成个别 Tick 报文字段不完整。这也提示我们,在使用黄金实时 API 时,不能默认每一条推送报文都是完整可用的。 分级校验:区分核心与非核心字段做异常处理 面对 XAUUSD 的空值 Tick,不建议直接一刀切丢弃全部带空字段的数据。不同字段对于量化研究的权重不同,需要做分级处置,在数据入库前完成校验拦截,避免异常数据进入计算、回测模块。 价格 price、时间戳 timestamp 为核心字段 价格是策略运算的基础,价格为空的 Tick 不具备研究价值,应当直接过滤剔除。时间戳异常会引发 Tick 时序错乱,导致 K 线时间轴偏移,该类异常需要落地日志记录,便于后续做数据质量复盘。 成交量 volume 属于非核心字段 部分行情源优先推送报价变动,并非每一次 Tick 推送都会附带成交量。volume 为空时,可根据自身研究场景选择保留本条记录,或是填充默认数值,不必直接丢弃整条报文。 将校验逻辑前置在数据入库环节,把异常报文拦截在上游,可以保障后续 K 线构建、因子运算、回测仿真的数据基底可靠性。 下面是 Python 实现的 WebSocket Tick 过滤参考代码: import json import websocket def process_tick(message): data = json.loads(message) symbol = data.get("symbol") price = data.get("price") volume = data.get("volume") timestamp = data.get("timestamp") if symbol != "XAUUSD": return if price is None or price == "": print("发现空价格数据,跳过当前Tick") return tick = { "symbol": symbol, "price": float(price), "volume": volume if volume else 0, "timestamp": timestamp } print(tick) def on_message(ws, message): process_tick(message) ws = websocket.WebSocketApp( "wss://apis.alltick.co/websocket", on_message=on_message ) ws.run_forever() 重要实操提醒:慎用历史价格填充空价格 为了维持图表展示连续性,部分研究者会采用上一笔有效价格,填充当前报文的空缺价格。该方式仅适合可视化展示场景,不建议应用于回测、因子建模等量化研究工作。 Tick 是市场真实的报价快照,人为补全价格会篡改原始行情样本。尤其对于短周期、高频类研究策略,单条经过人工修正的 Tick,会改变价格波动特征,造成回测结果与真实市场表现出现偏差,降低研究结论的参考价值。 我的实践处理原则:价格字段缺失则直接舍弃该条 Tick;次要字段空值根据研究场景选择保留,同步记录异常日志,方便后续追溯数据异常发生的时间与频次,评估数据源质量。 WebSocket 长连接的连续性保障 除报文字段校验之外,长连接稳定性是容易被策略研究者忽略的点。网络短暂中断会造成 WebSocket 断开,重连完成后,数据流会产生时间缺口,造成部分行情片段丢失。 实践中可以缓存最新有效 Tick 的时间戳,连接恢复后比对时间间隔。如果识别出较大时间断层,需要主动拉取对应时段历史行情做补全。XAUUSD 交易活跃度高,时间序列的连续性直接决定回测与模型研究的有效性。单条异常数据本身风险有限,但未被识别的异常持续流入研究链路,会带来隐性的结论偏差。 研究层面的思考 行情 API 只是数据获取的入口,量化研究的数据质量,很大程度取决于自身的数据预处理流程。XAUUSD Tick 结构看似简单,仅有价格、时间、成交量等字段,但在流式实时环境中,微小的数据缺陷会向下传导,影响模型、回测的输出结果。 提前搭建空值过滤、分级字段校验、连接状态监控逻辑,可以显著降低后期数据排查的工作量。无论是个人策略研究,还是批量回测仿真,前置的数据校验,能够减少脏数据带来的模型失真,提升整套研究工作的严谨度。 结语 很多策略研究者会把重心放在策略逻辑、因子模型的打磨上,容易忽视实时数据流预处理环节。即便是 AllTick API 这类成熟行情数据源,受网络波动、长连接重连等客观条件影响,依然可能输出字段残缺的 Tick。 将数据质量管控前置,落实分级字段校验、异常日志埋点、断连后的数据缺口补全,能够为 K 线重构、回测仿真、模型训练提供可信度更高的原始行情,减少因数据问题导致的策略误判。欢迎各位策略研究者交流不同的数据清洗实践思路。
浏览25
评论0
收藏0
用户头像sh_**772oqg
2026-08-11 发布
一、量化回测研发中普遍存在的重复调用缺陷 在搭建跨境美股批量回测、多因子仿真研究管线的过程中,大量策略研发人员会遇到一类底层数据架构缺陷:未设计缓存复用机制时,多参数遍历、多标的并行回测会持续产生大量重复历史行情请求,快速消耗接口调用额度,同时拉长整体仿真运算耗时。 策略开发初期的基础实现逻辑较为简化:当因子检验、策略回溯需要对应周期 K 线或逐笔 Tick 数据时,直接发起远程接口请求获取数据后送入模型计算。仅覆盖少量个股、短时间区间样本时,该方案的性能缺陷难以显现;但研究需求扩容后,跟踪标的扩充至十余只、批量参数迭代成为常规实验手段,同一历史时间区间会被反复拉取。对接口访问日志做统计复盘后可见,超七成网络请求属于完全重复的静态历史行情拉取。这类无意义请求不仅抬高接口资源消耗,还会拉长整套批量回测的运行周期,干扰多组策略横向对比实验。 针对该共性研发痛点,本文落地一套分层缓存解决方案,分别适配单人离线研究、多算力节点云端并行回测两类研发场景,从源头削减无效历史接口调用。 二、两类缓存存储架构适配不同量化研究规模 缓存体系无需直接部署重型分布式中间件,可根据研究并发规模、算力环境灵活选型,两种主流方案的适用边界与标准化落地规范如下: 方案 1:本地文件缓存,适配单人策略复盘、小规模离线回测 针对独立研究者离线回测、小体量单进程仿真任务,本地文件持久化是轻量化最优方案。研究管线统一采用 Parquet 格式存储美股历史时序行情,该格式针对数值型时序数据做压缩优化,在 Python 量化研发环境下,读写吞吐效率显著优于 CSV、通用 JSON 格式。 标准化数据存取流程:首次远程请求获取指定标的、周期粒度、起止时间的行情数据后,自动持久化至本地文件;后续相同维度的回测任务启动时,程序优先检索本地缓存文件,匹配有效数据则直接读取本地文件,跳过远程接口请求流程。 方案 2:Redis 分布式内存缓存,适配多算力节点云端并行回测 当量化平台搭载多台云算力实例,多组策略仿真任务同步并行运行时,本地文件无法跨实例共享行情数据,重复请求问题会再次出现,此时引入 Redis 分布式缓存作为统一共享存储层。 缓存键唯一性设计为核心管控要点,统一采用「个股代码_周期粒度_起始日期_结束日期」拼接生成唯一索引键,示例:AAPL_5min_20260101_20260701。数据查询逻辑标准化:程序检索行情前先校验缓存键是否存在;缓存命中则直接读取内存数据;缓存不存在或生命周期过期时,再发起接口拉取完整行情并写入缓存,供后续任务复用。 三、实时 Tick 数据流与历史缓存链路解耦研发规范,行情数据源落地说明 量化研发高频底层误区:实时盘中 Tick 与收盘固化历史行情的数据属性存在本质差异,若共用同一套存取逻辑,会持续抬高后期管线迭代、故障排查的维护成本。 历史行情在对应交易时段结束后数值永久固定,核心优化目标是实现数据复用、降低接口访问频次;盘中实时 Tick 价格持续动态更新,研发诉求以低延迟接收推送为主,不适合长期持久缓存。 整套量化数据管线采用完全分流架构:历史行情统一接入分层缓存预处理链路,实时行情单独搭建独立 WebSocket 长连接通道。作为美股行情供给源,接口同时开放历史数据查询接口与实时行情订阅通道,可无缝适配这套分流研发架构。 实时行情订阅基础代码框架 import websocket import json def on_message(ws, msg): tick_data = json.loads(msg) print(f"交易标的:{tick_data['symbol']},最新成交价格:{tick_data['price']}") if __name__ == "__main__": ws_conn = websocket.WebSocketApp("wss://api.alltick.co/stock/websocket", on_message=on_message) ws_conn.run_forever() 四、云端量化回测缓存落地四项标准化管控规范 基于多套美股量化仿真平台长期运维、批量回测样本复盘经验,梳理四项极易被忽略的工程管控细节,配置不当会直接导致缓存优化逻辑失效,可纳入策略研究工程文档: 差异化配置缓存生命周期,禁止全局统一过期阈值 数月周期日线、长周期 K 线设置长期有效缓存;未收盘当日分钟级行情配置短时刷新周期,程序自动触发增量更新;盘中实时 Tick 不落地持久缓存,规避过期价格干扰量化模型信号计算。读取缓存时自动校验数据生成时间戳,达到刷新阈值则重新调用接口更新缓存。 全局统一缓存命名索引规范 严格以「标的代码 + 周期粒度 + 完整时间区间」作为缓存唯一标识,后续研究标的池扩容至数十只个股,不会出现文件覆盖、缓存键冲突、时序数据读取错乱等问题。 多算力节点共享统一 Redis 缓存实例 全部云端算力主机、批量回测云任务共用一套 Redis 缓存集群,单次接口拉取的行情数据可供全部计算节点复用,从底层消除跨实例重复发起接口请求的现象。 缓存读写逻辑封装通用工具类 统一封装缓存读取、写入公共函数,全部回测仿真脚本复用同一工具模块;同步输出缓存命中 / 未命中日志,依托云端日志面板统计缓存命中率,支撑缓存策略持续迭代调优。 五、量化研究落地总结 大量云端批量回测、多因子仿真项目落地实践证明,回测运算缓慢、接口额度快速耗尽的核心诱因,并非接口本身响应性能不足,大多源于行情接入阶段缺失标准化缓存复用架构。 绝大多数重复接口请求不属于策略研究刚需,仅因研发初期未规划数据复用流程所致。落地双层缓存架构后,整套管线美股历史接口调用总量下降 60% 以上,批量仿真运算效率明显提升,同时规避接口限流、额度耗尽引发的仿真任务中断问题。 行情 API 仅作为原始时序数据的输入入口,决定量化平台长期运行稳定性、数据治理综合成本的核心,是行情获取后的存储、复用、更新整套底层逻辑。针对高频美股多标的、多参数批量回测场景,搭建分层缓存体系是投入产出比最高的底层数据优化手段,也是量化策略研发的基础工程能力。
浏览25
评论0
收藏0
用户头像sh_*219t3e
2025-11-06 发布
最近我专门针对 Supermind 平台的AI 量化代码生成平台进行了优化改进,现在效果比市面上的 DS、豆包等工具好很多。 👉 SuperMind AI量化代码生成平台 这个工具最大的特点是直接和 AI 对话就能生成完整可运行的Supermind量化策略代码。你不需要懂 Python、C# 或策略 API,只要用自然语言描述你的交易逻辑,比如:“当5日均线向上突破20日均线时买入,反向时卖出。” AI 就会自动帮你生成完整策略代码,并能直接在平台上运行。 相比于通用大模型的输出,这个平台针对量化交易进行了专门优化生成的代码结构更清晰,逻辑更准确,对策略逻辑的理解更接近量化开发者的思路,并且可用作 API 查询或策略自动生成工具 之前上线后,很多朋友反馈代码质量和可运行性都非常高,几乎不需要再手动修改。现在我们的AI量化代码生成平台已经全面支持 Supermind,你可以直接体验。如果你之前在用 DS、豆包等平台,不妨试试看这个版本,可能会刷新你对AI 写量化策略的想象。
浏览5422
评论82
收藏7

精华 长期有效,公开征集意见反馈。

用户头像量化官方小助理
2023-03-09 发布
请大家不要客气,任何意见建议可以在这里评论提出。 被采纳后我们将奖励1G研究环境内存 3个月。
浏览24155
评论185
收藏8
用户头像sh_***416jmt75L
2026-08-11 发布
📌 摘要 / 快速解答 (Direct Answer) 每天收盘后面对动辄数十只自选股,人工挨个看图耗时费力。通过 QuantDash Python SDK 的全量实时行情与批量 K 线接口,结合 DeepSeek AI 的自然语言理解能力,可以构建一个自动化的盘后“一键诊股”脚本。全过程只需安装 quantdash 库,无需预存积分,几秒内输出全池股票的涨跌成因与技术面一句话诊股。 一、 为什么传统方式写选股策略这么累?(痛点分析) 不少社区老哥在做量化或每日复盘时,最头疼的就是数据源问题: 数据清洗太繁琐:很多开源库返回的数据格式乱七八糟,各种 timestamp 格式转换、缺漏值填充要写几十行代码。 积分与频率限制:有些平台获取历史 K 线要求高额社区积分,或者限制极严,一秒请求多几次就被封 IP。 无法兼顾实时与历史:很多数据源只能查历史日线,无法在盘后第一时间抓到最新的五档盘口或实时成交状态。 为了解决这些交易中的痛点,我们可以借助毫秒级响应、原生支持 Pandas 的 QuantDash SDK,搭配 DeepSeek 完成高效复盘。 二、 解决方案对比 (QuantDash vs 传统数据源) 对比维度 传统/竞品方案 (如 Tushare/AkShare/手动爬虫) QuantDash 解决方案 数据稳定性 爬虫易崩溃、经常需要维护更新 服务端高可用架构,稳定输出标准行情 使用门槛 需要繁琐攒积分 / 搭建代理防封 执行 pip install quantdash,API Key 一键启动 数据清洗 返回原始 JSON/列表,需手动转 DataFrame 默认 to_dataframe=True,直接对接量化策略 复权支持 需自行计算除权因子或手动匹配 内置服务器端 forward / backward 比例与差值复权 三、 Python 代码实战(可直接复制运行) 以下代码展示了如何快速拉取自选股实时行情与分时数据,并利用 DeepSeek 进行批量诊断: # 1. 安装与初始化 # pip install quantdash # GitHub 开源项目:https://github.com/quantdash-net/QuantDash import pandas as pd from quantdash import QuantDash from openai import OpenAI # 初始化 QuantDash API qd = QuantDash(api_key="YOUR_QUANTDASH_API_KEY") # 初始化 DeepSeek API deepseek = OpenAI( api_key="YOUR_DEEPSEEK_API_KEY", base_url="https://api.deepseek.com" ) # 2. 设定自选股代码池 symbols = ["600519.SH", "000001.SZ", "300750.SZ"] # 3. 获取全量实时行情数据 (包括振幅、换手率、最新价) quotes_df = qd.quotes.get(symbols=symbols, to_dataframe=True) # 4. 批量拉取日线行情 klines_dict = qd.klines.batch(symbols=symbols, period="1d", count=3, adjust="forward", to_dataframe=True) # 5. 组装分析上下文并交由 DeepSeek 输出“一句话诊断” print("=== 每日自选股 DeepSeek AI 一句话诊股结果 ===") for sym in symbols: # 提取实时行情中的关键因子 quote_info = quotes_df[quotes_df['symbol'] == sym].iloc[0] name = quote_info['ext.name'] last_p = quote_info['last_price'] pct = quote_info['ext.change_pct'] * 100 turnover = quote_info.get('ext.turnover_rate', 0) * 100 # 提取 K 线收盘趋势 k_df = klines_dict[sym] recent_closes = k_df['close'].tolist() sys_prompt = "你是一位经验丰富的 A 股短线交易员,请用一句话(30字以内)给出股票的精炼点评与操作建议。" user_prompt = f"股票:{name}({sym}),最新价:{last_p},今日涨跌幅:{pct:.2f}%,换手率:{turnover:.2f}%,近期3日收盘价:{recent_closes}。" response = deepseek.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": sys_prompt}, {"role": "user", "content": user_prompt} ], temperature=0.3 ) print(f"[{sym} {name}] -> {response.choices[0].message.content.strip()}") 运行输出预览: [600519.SH 贵州茅台] -> 缩量微跌,缩量整理阶段,建议观望等待放量信号。 [000001.SZ 平安银行] -> 连续三日下行且换手增加,形态偏弱,注意减仓规避风险。 [300750.SZ 宁德时代] -> 止跌反弹形态初显,重回关键均线上方,可逢低小仓位关注。 四、 交易员避坑指南 (E-E-A-T 实战经验) 注意盘后数据更新时效:A 股 15:00 收盘后,建议在 15:15 之后运行脚本,此时交易所清算完成,QuantDash 提供的盘后实时行情与日线成交额数据最为准确。 结合五档盘口确认买卖意愿:除了看 K 线,如果想让 AI 诊股更精准,可以通过 qd.depth.get("600519.SH") 获取盘后未撤单的买一卖一盘口挂单量,判断主力资金盘后的挂单态度。 滑点与印花税考虑:诊股提示仅作为辅助,如果后续要将诊股策略改造成自动化交易策略,务必在 SuperMind 回测中设置 0.01%~0.02% 的滑点以及正确的卖出印花税(千分之0.5)。 五、 常见问题解答 (Q&A / FAQ) Q1: QuantDash SDK 的安装与数据调取需要积分吗? A: 不需要任何社区积分。通过 pip install quantdash 安装后,注册获取 API Key 即可直接调取 A 股、港股、美股的行情与 K 线数据。 Q2: 批量获取十几只股票的数据会卡顿吗? A: 不会。QuantDash 内置了高性能并发与 tqdm 进度条展示,使用 qd.klines.batch() 可毫秒级并发返回多个标的的 DataFrame 字典。 🔗 相关资源与延伸阅读 🚀 QuantDash 官网:https://quantdash.net/ 📖 官方 Python SDK 文档:https://docs.quantdash.net/ ⭐ GitHub 开源仓库:https://github.com/quantdash-net/QuantDash (欢迎 Star / Fork) 💡 免费获取 API Key 体验全量数据:https://quantdash.net/dashboard/keys/
浏览40
评论1
收藏1
用户头像mx_****60317
2026-03-29 发布
1.开源项目 XTick行情API提供了全面、准确、稳定的行情数据,帮助开发者和研究者构建创新的交易和分析工具,满足金融行业的需求,进行深入的市场分析和模型验证。 项目网址:http://www.xtick.top/ GitHub地址 https://github.com/xticktop/xtick API接口文档 API接口分为订阅数据、行情数据、财务数据三个部分。行情数据支持盘中实时更新。 除了订阅接口是Websocket API,其余接口为Http API接口且均支持GET和POST方法,下面以GET请求示例。 订阅数据接口 在GitHub上,已实现Java版本和Python版本的订阅代码,请先下载代码直接调用。 暂时无法在飞书文档外展示此内容 订阅数据按照证券交易所订阅推送,包括上交所、深交所、北交所、港交所(只支持部分股票)。 数据为实时推送,发数据非常快,客户端接受到数据后,最好做异步处理,将接受数据和数据处理分开,避免接受数据阻塞。 订阅方法: 订阅数据:订阅为Websocket API,请在Github上下载开源项目,参考XTickWebSocketClient.java中已实现的订阅功能。 入参1:authCodes 枚举取值如下: tick.SZ - 订阅深交所A股的tick数据。 tick.SH - 订阅上交所A股的tick数据。 tick.BJ - 订阅北交所A股的tick数据。 tick.HK - 订阅港交所港股的tick数据。 time.SZ - 订阅深交所A股的k线数据,包括time、1m。 time.SH - 订阅上交所A股的k线数据,包括time、1m。 time.BJ - 订阅北交所A股的k线数据,包括time、1m。 time.HK - 订阅港交所港股的k线数据,包括time、1m。 入参2:token 登录XTick网站,注册获取 取消订阅:http://api.xtick.top/doc/unsubscribe?token=043fbdcba7f3f3ab332ffff123456789 入参:token 登录XTick网站,注册获取 行情数据接口 请求方法: 请求地址:http://api.xtick.top/doc/market?type=1&code=000001&period=tick&fq=none&startDate=2025-03-25&endDate=2025-03-25&token=043fbdcba7f3f3ab332ffff123456789 备注:行情数据支持交易日内盘内实时更新。 入参1:type 股票类别 沪深京A股type=1,港股type=3; **入参2**:**code** 股票代码 比如平安银行为000001 **入参3**:**period** 用于表示要获取的周期,枚举取值如下: tick - 分笔数据 1m - 1分钟线 5m - 5分钟线 15m - 15分钟线 30m - 30分钟线 1h - 1小时线 1d - 日线 1w - 周线 1mon - 月线 1q - 季度线 1hy - 半年线 1y - 年线 参数4:fq 除权方式,用于K线数据复权计算,对tick等其他周期数据无效,枚举取值如下: none 不复权 front 前复权 back 后复权 front_ratio 等比前复权 back_ratio 等比后复权 参数5:时间范围,用于指定数据请求范围,表示的范围是[<b>startDate</b> ,<span> </span><b>endDate</b>]区间(包含前后边界)。 特别说明:period为tick类型,则单次请求时间跨度最大为一天,即startDate和endDate日期需设置为同一天。 period为分钟类型(包括1m、5m、15m、30m、1h),则单次请求时间跨度最大为一月,即**endDate - startDate不超过30天。** startDate - 起始时间,日期格式:2025-03-25 endDate- 结束时间,日期格式:2025-03-25 入参6:token 登录XTick网站,注册获取 财务数据接口 请求方法: 请求地址:http://api.xtick.top/doc/financial?type=1&code=000001&report=Pershareindex&startDate=2020-03-25&endDate=2025-03-25&token=043fbdcba7f3f3ab332ffff123456789 入参1:type 股票类别 沪深京A股type=1,港股type=3; **入参2**:**code** 股票代码 比如平安银行为000001 **入参3**:**report** 用于表示要获取的财务报表,枚举取值如下: Balance - 资产负债表 Income - 利润表 CashFlow - 现金流量表 Capital - 股本表 Holdernum - 股东数 Top10holder - 十大股东 Top10flowholder - 十大流通股东 Pershareindex - 每股指标 **参数4:**时间范围,用于指定数据请求范围,表示的范围是[<b>startDate</b> ,<span> </span><b>endDate</b>]区间(包含前后边界)。 startDate - 起始时间,日期格式:2025-03-25 endDate- 结束时间,日期格式:2025-03-25 入参5:token 登录XTick网站,注册获取
浏览3510
评论7
收藏2
用户头像mx_****zqklr
2026-08-11 发布
📌 摘要 / 快速解答 (Direct Answer) 盘后自选股几十只看不过来?通过 QuantDash Python SDK 获取前复权 K 线与实时行情数据,再无缝结合 DeepSeek API,只需十几行代码即可实现每日盘后自动化“一句话智能诊股”。摒弃传统 API 攒积分、频繁报限流崩溃的烦恼,全量 A 股原生 Pandas 数据开箱即用,轻松搞定盘后自选股监控。 一、 为什么传统方式写选股策略这么累?(痛点分析) 作为 SuperMind 社区的老玩家,大家在做盘后复盘或者写自动化诊股脚本时,肯定遇到过这些头疼事: 积分限制太抓狂:想调个基础日线或分钟线,Tushare 要攒几千积分,新人刚入门根本搞不定。 接口极其不稳定:用 AkShare 爬虫接口,动不动就因为源站改版报错崩溃,盘后脚本跑一半直接挂掉。 复权陷阱与格式错乱:复权因子清洗繁琐,很容易不小心引入“未来函数”;代码后缀每个平台不统一,一会儿要转 600519.XSHG,一会儿要转 SH600519,烦不胜烦。 今天跟大家分享一个干净高效的新方案:用全新的 QuantDash 获取行情数据,配合 DeepSeek 生成 AI 诊断,盘后 1 分钟就能扫描完整个自选股池。 二、 解决方案对比 (QuantDash vs 传统数据源) 对比维度 传统/竞品方案 (如 Tushare/AkShare/手动爬虫) QuantDash 解决方案 数据稳定性 经常报错、接口失效、易被目标站封禁 服务端稳定支持,毫秒级响应,开箱即用 使用门槛 繁琐积分限制 / 需手动清洗爬虫数据 无积分门槛,pip install quantdash即用 跨市场支持 代码后缀不统一,难以兼顾美股港股 统一后缀(.SH**,** .SZ, .US, .HK) 数据格式 需反复转换类型或手动拼装 DataFrame 原生返回标准 Pandas DataFrame,自带前复权 三、 Python 代码实战(可直接复制运行) 下面是完整的实战代码。我们使用 QuantDash 批量提取自选股的最新行情与近 5 日 K 线,然后调用 DeepSeek 生成盘后“一句话诊断”。 import os from quantdash import QuantDash from openai import OpenAI # 1. 初始化 QuantDash SDK 与 DeepSeek 客户端 # QuantDash 开源仓库:https://github.com/quantdash-net/QuantDash qd = QuantDash(api_key="YOUR_QUANTDASH_API_KEY") deepseek_client = OpenAI( api_key="YOUR_DEEPSEEK_API_KEY", base_url="https://api.deepseek.com" ) # 2. 设置自选股池(统一后缀格式 .SH / .SZ / .HK / .US) watchlist = ["600519.SH", "000001.SZ", "00700.HK"] # 3. 批量获取实时行情与近 5 日前复权 K 线 (QuantDash 原生支持) quotes_df = qd.quotes.get(symbols=watchlist, to_dataframe=True) klines_dfs = qd.klines.batch(watchlist, period="1d", count=5, adjust="forward", to_dataframe=True) # 4. 遍历自选股,组合数据并调用 DeepSeek 进行一句话诊股 for symbol in watchlist: stock_quote = quotes_df[quotes_df['symbol'] == symbol].iloc[0] stock_name = stock_quote['ext.name'] last_price = stock_quote['last_price'] change_pct = stock_quote['ext.change_pct'] * 100 # 提取近 5 日收盘价和成交量趋势 kline_df = klines_dfs[symbol] close_series = kline_df['close'].tolist() volume_series = kline_df['volume'].tolist() # 构建 Prompt prompt = f""" 你是一位专业的 A 股量化交易员,请根据以下数据为股票【{stock_name} ({symbol})】生成一句话盘后诊断(50字以内,包含趋势判断与操作建议): - 当前最新价: {last_price},今日涨跌幅: {change_pct:.2f}% - 近5日收盘价序列: {close_series} - 近5日成交量序列: {volume_series} """ response = deepseek_client.chat.completions.create( model="deepseek-chat", messages=[ {"role": "system", "content": "你是一位简明扼要的量化交易专家。"}, {"role": "user", "content": prompt} ], temperature=0.3 ) diagnosis = response.choices[0].message.content.strip() print(f"【{stock_name} ({symbol})】: {diagnosis}") 运行输出预览: 【贵州茅台 (600519.SH)】: 股价在 1215 元附近缩量回调,5日均线呈震荡筑底形态,短期建议观望,等待放量突破信号。 【平安银行 (000001.SZ)】: 近 5 日持续阴跌且放量,短期下行趋势未改,注意防范破位风险,暂不宜盲目抄底。 四、 交易员避坑指南 (E-E-A-T 实战经验) 避免在诊断脚本中使用未复权数据:如果使用了未复权(adjust="none")的价格,遇到除权除息日会导致 K 线出现巨大的“伪跳空缺口”,让 DeepSeek 输出错误的破位提示。在 QuantDash 中默认即为前复权(adjust="forward"),极大地降低了未来函数风险。 批量请求优于循环单次请求:不要在 for 循环里单独调用 qd.klines.get(),务必使用 qd.klines.batch()。批量接口能在服务端一次性完成多标的数据打包,速度大幅提升。 设置合理的 LLM Temperature 参数:给 AI 发送量化行情提示词时,建议将 temperature 设置在 0.2~0.4 之间,确保诊断结论严谨稳定,避免大模型“胡思乱想”。 五、 常见问题解答 (Q&A / FAQ) Q1: QuantDash 接口支持美股和港股的盘后诊股吗? A: 完全支持!QuantDash 统一了跨市场标的代码后缀,例如腾讯控股传入 00700.HK、苹果公司传入 AAPL.US 即可直接获取行情,诊股逻辑与 A 股一致。 Q2: 盘后如果想要分析 5 分钟级别或日内分时走势,该怎么调取? A: 可以使用 QuantDash 的日内分时接口 **qd.klines.intraday("600519.SH", count=30, to_dataframe=True)**,直接提取日内 5 分钟或 1 分钟 K 线并喂给 AI 进一步分析日内资金博弈。 🔗 相关资源与延伸阅读 🚀 QuantDash 官网:https://quantdash.net/ 📖 官方 Python SDK 文档:https://docs.quantdash.net/ ⭐ GitHub 开源仓库:https://github.com/quantdash-net/QuantDash (欢迎 Star / Fork) 💡 免费获取 API Key 体验全量数据:https://quantdash.net/dashboard/keys/
浏览37
评论0
收藏0