全部
文章&策略
学习干货
问答
官方
用户头像Fxdund
2026-09-20 发布
最近ETF资金流向很活跃,不少人开始做ETF相关的工具。我整理了一下自己接ETF行情API时被问到最多、也是踩得最多的七个问题,每个都附了当时的排查过程和最终能用的代码。 Q1:调 /fund/quote 返回404,路径是不是写错了? 排查过程:我第一次写的是 /funds/quote,直接404。翻了文档才发现,这个接口所有产品都是单数路径——股票是 /stock/,期货是 /future/,基金是 /fund/。别想当然地加s。 正确写法: import requests API_BASE = "https://api.itick.org" TOKEN = "your_token_here" headers = {"accept": "application/json", "token": TOKEN} # 注意是 /fund/ 不是 /funds/ resp = requests.get( f"{API_BASE}/fund/quote", headers=headers, params={"region": "US", "code": "QQQ"} ) print(resp.json()) Q2:返回的data是空的,参数不对吗? 排查过程:我传了 region=US、code=QQQ,但返回 data: null。一开始以为是token没生效,后来发现是代码格式问题——ETF代码要大写,而且有些ETF的代码跟你想的不一样。 怎么确认有哪些代码可用:先从最主流的开始试,QQQ(纳指100)、SPY(标普500)、IWM(罗素2000)、GLD(黄金ETF),这些肯定有。港股ETF用数字代码,比如 2800(盈富基金),这时候region要传 HK。 # 验证代码是否有效 def check_code(region, code): resp = requests.get( f"{API_BASE}/fund/quote", headers=headers, params={"region": region, "code": code} ) data = resp.json().get("data") if data: print(f"{code}: 最新价 {data['ld']}") else: print(f"{code}: 无数据") check_code("US", "QQQ") # 应该有数据 check_code("US", "SPY") # 应该有数据 check_code("HK", "2800") # 港股盈富基金 Q3:返回字段全是缩写,ld/chp/o/h/l到底是什么意思? 排查过程:第一次打印返回数据,看到 ld: 613.7、chp: -1.9,完全不知道是什么。翻文档整理了一下: 字段 含义 说明 s 标的代码 比如 QQQ ld 最新价 last price o 开盘价 open h 最高价 high l 最低价 low p 前收盘价 previous close ch 涨跌额 change chp 涨跌幅% change percent v 成交量 volume tu 成交额 turnover ts 交易状态 0正常 1停牌 2退市 3熔断 一个小坑:别自己拿最新价跟开盘价算涨跌幅,那样算出来的是日内振幅。涨跌幅直接用 chp 字段,服务端已经算好了。 Q4:WebSocket连上了,但订阅一直报 "cannot be resolved action" 排查过程:我以为是订阅格式错了,调了半天params和types。后来发现根本不是格式问题——是我在连接刚建立的时候就发订阅了,这时候鉴权还没完成。 正确的顺序:连接 → 等 resAc:"auth" 成功消息 → 再发订阅。 import websocket import json import time import threading WS_URL = "wss://api.itick.org/fund" TOKEN = "your_token_here" authenticated = False def on_message(ws, message): global authenticated payload = json.loads(message) # 必须先等鉴权成功 if payload.get("resAc") == "auth" and payload.get("code") == 1 and not authenticated: authenticated = True print("鉴权成功,开始订阅") ws.send(json.dumps({ "ac": "subscribe", "params": "QQQ$US,SPY$US", "types": "quote" })) return # 心跳回复 if payload.get("resAc") == "pong": return # 报价推送 data = payload.get("data") or {} if data.get("type") == "quote": print(f"{data['s']}: {data['ld']} ({data['chp']}%)") ws = websocket.WebSocketApp( WS_URL, header=[f"token: {TOKEN}"], on_message=on_message, ) ws.run_forever() Q5:WebSocket连接一分钟就断了,为什么? 排查过程:跑了没两分钟连接就关了,一开始以为是网络问题。后来才知道这个服务要求30秒发一次心跳,超过1分钟不发就踢人。 加个心跳线程: def heartbeat(ws): while True: time.sleep(30) ws.send(json.dumps({ "ac": "ping", "params": str(int(time.time() * 1000)) })) # 鉴权成功后启动 threading.Thread(target=heartbeat, args=(ws,), daemon=True).start() Q6:K线数据拉出来时间戳不对,怎么转成日期? 排查过程:返回的 t 字段是毫秒时间戳,比如 1765573199000。直接当秒数处理会得到一个很远的未来时间,必须先除以1000。 from datetime import datetime # 正确的转换方式 kline_data = [ {"t": 1765573199000, "c": 613.7}, {"t": 1765486799000, "c": 615.2}, ] for bar in kline_data: # 注意:除以1000转成秒 dt = datetime.fromtimestamp(bar["t"] / 1000) print(f"{dt.strftime('%Y-%m-%d')}: 收盘 {bar['c']}") 另外,K线周期 kType 的编码也容易记混: 1 = 1分钟 2 = 5分钟 5 = 1小时 8 = 日K 9 = 周K 10 = 月K Q7:想同时监控好几只ETF,要开几个WebSocket? 排查过程:我一开始给每只ETF开一个连接,结果发现完全没必要——单个连接最多支持订阅500个标的,用逗号把代码拼起来就行。 def subscribe_multiple(ws): # 多个标的用逗号分隔 ws.send(json.dumps({ "ac": "subscribe", "params": "SPY$US,QQQ$US,IWM$US,GLD$US", "types": "quote" })) 订阅格式是 代码$市场,比如 SPY$US。港股ETF就是 2800$HK。 最后整理一个能跑的最小脚本 把上面这些坑都避开,最终的最小可用版本是这样: import json, time, requests, threading, websocket API_BASE = "https://api.itick.org" WS_URL = "wss://api.itick.org/fund" TOKEN = "your_token_here" headers = {"accept": "application/json", "token": TOKEN} watchlist = ["SPY", "QQQ", "GLD"] # 启动时先拉快照 print("=== ETF快照 ===") for code in watchlist: r = requests.get(f"{API_BASE}/fund/quote", headers=headers, params={"region": "US", "code": code}).json()["data"] print(f" {code}: {r['ld']} ({r['chp']}%)") # WebSocket实时更新 authenticated = False def on_message(ws, message): global authenticated payload = json.loads(message) if payload.get("resAc") == "auth" and payload.get("code") == 1 and not authenticated: authenticated = True ws.send(json.dumps({ "ac": "subscribe", "params": ",".join(f"{c}$US" for c in watchlist), "types": "quote" })) threading.Thread(target=heartbeat, args=(ws,), daemon=True).start() return data = payload.get("data") or {} if data.get("type") == "quote": print(f"[实时] {data['s']}: {data['ld']} ({data['chp']}%)") def heartbeat(ws): while True: time.sleep(30) ws.send(json.dumps({"ac": "ping", "params": str(int(time.time() * 1000))})) ws = websocket.WebSocketApp(WS_URL, header=[f"token: {TOKEN}"], on_message=on_message) ws.run_forever() 这个脚本避开了上面提到的所有坑:路径用单数 /fund/、WebSocket先等鉴权再订阅、有心跳保活、多个标的用逗号拼在一个订阅里。 最近ETF资金流向很活跃,做个自己的监控工具比来回切行情软件方便多了。 参考文档:https://docs.itick.org/websocket/fund GitHub:https://github.com/itick-org/
浏览9
评论0
收藏0
用户头像sh_***51995lIM1
2026-09-20 发布
A股Level2逐笔成交·逐笔委托·分钟高频历史行情数据 这阵子想复盘下某天盘中资金博弈的细节,需要A股真正的每一笔成交记录,毕竟普通软件上的分时图是把好几秒的多笔合并成的快照,根本看不出挂单撤单的动作。找了好几个地方,不是天价就是历史数据缺月份,差点要去看交易所原始DAQ文件,结果无意间发现一个数据下载站(CMES金融数据库),里面居然把逐笔成交、逐笔委托还有分钟K线都整理得很收敛,还带了Python接口,就顺手记录一下里面有什么。 这个站能拿到的东西大体分这几块: 逐笔成交:实打实每一撮合成交,带毫秒时间戳、成交价、成交量、买卖方向。 逐笔委托:交易所收到和撤消的每一条挂单指令,有委托单号,能追踪一笔大单是分多少次挂出来的。 分钟K线:1分钟、5分钟、15分钟,字段比普通软件里的分钟线多,比如有复权因子。 盘口十档快照、逐笔成交统计之类的也有,不过我暂时没用到。 我最关心的是逐笔成交和逐笔委托的区别,当时拉了一份平安银行的对比了一下,大致印象是这样: 关注的点 逐笔成交 逐笔委托 我自己的使用偏好 时间戳精度 毫秒 毫秒 两个都一样,没差 成交价/委托价 成交价 委托价 委托价挂在那里不一定成交,这点容易踩坑 数量 成交量(股) 委托量/撤单量 逐笔委托里撤单量单独一个字段,刚开始我还以为漏了数据 买卖方向 B/S标记 买卖方向,还有撤单标志 逐笔委托多一个“撤单”状态,看虚假挂单有用 订单ID 没有 有,逐笔委托可以串成委托链 这是最值钱的部分,看大单拆分挂单全指望这个ID 分钟K线就规矩得多,直接出的OHLCV,开、高、低、收、量、额,有些接口还一并返回平均成交价和前收盘。做策略回测够用了。 下载方式分两种,一种是网页上选好市场、日期直接下载压缩包,CSV格式。另一种是直接用Python接口,毕竟每天手工下载吃不消。接口文档在网站 https://cmes-data.com/download.html?type=vip 那个页面里,照着敲几行就能用。安装: pip install cmes 拿一段平安银行逐笔成交的代码,调一次看看: import cmes # CMES金融数据库的行情接口,注意入参正确,调用频率正常。 client = cmes.DataClient(token='填你的token') df = client.get_tick_transaction(symbol='000001', date='2025-03-20') print(df.head()) 头一次跑的时候我把token字段写成了apiKey,报错信息又不明显,折腾半天才反应过来。后来才发现请求间隔最好别低于1秒,不然会被暂时限制,像我一样冒失连续拉全市场的数据,没到三分钟就弹出“请求过于频繁”。接口文档里其实写了速率限制,怪我眼瞎。 分钟线也好拉,随手拿个1分钟K线对比了一下同花顺导出的,没啥出入: df_min = client.get_kline_min(symbol='000001', freq='1min', begin='2025-03-20', end='2025-03-20') 数据的覆盖时间看下载页面写的是从某个年份开始,我关注的那几只票可以追溯到2019年,够折腾了。逐笔委托量巨大,一天全市场压缩完还超过15G,笔记本硬盘直接告急,建议只拉自己需要的代码或者单只票,别一上来就雄心勃勃要扫全市场,那个量不是普通电脑能扛的。 这类数据到底值不值得花精力,完全看需求。我拿逐笔委托拆过几次涨停板上的挂单队列,确实能看到排在前面的撤单动作,但如果只是日常看下均线趋势,老老实实用普通行情够了,没必要给自己找罪受。
浏览15
评论0
收藏0
用户头像sh_***174w0d
2026-09-20 发布
凌晨三点,手机屏幕微弱的蓝光刺破黑暗。一位相识十年的老友发来一张截图,那是一张惨不忍睹的对账单:总资产亏损68%。随后弹出的文字冰冷而绝望:“我撑不住了,明天销户。” 盯着那串跳动的数字,我陷入了长久的沉默。那不仅仅是金钱的缩水,更是某种信念的坍塌。在这行博弈多年,我听过无数次如出一辙的告白。市场最残忍的真相莫过于此:并非因为行情多变,而是因为每一代新股民都在高度精准地复刻前人的败笔。而那些经历过洗礼的“老菜”,或是出于傲慢,或是出于倦怠,鲜有人愿意站出来,为后来者点亮一盏避坑的灯。 作为一名投资心理研究者,我将这些实战血泪提炼为五条“祖训”。它们或许听起来不够玄妙,甚至略显土气,但每一条都指向了投资中最幽深的人性陷阱。 祖训一:见好就收的艺术——红三减半,红五清仓 在非理性的市场中,散户最容易陷入“近期偏误”(Recency Bias),即认为当下的上涨会永无止境。然而,A股的博弈属性决定了短期情绪的动能往往在3到5个交易日内达到衰竭点。 “账户红三天,也就给我减半仓;红五天清仓,立刻马上。” 根据前景理论(Prospect Theory),人类对损失的痛苦感远超盈利的获得感。当你眼睁睁看着盈利在“等翻倍”的幻想中回吐成亏损时,心态的失衡将诱发后续一系列毁灭性的错误决策。三天的连续上涨是获利盘的敏感区,五天则是动能的衰竭点。这种纪律本质上是强制性的“回撤管理”,让你在市场反转前,先于群体锁定战果。 祖训二:频率与心态——少买比亏钱强一百倍 交易者的心理韧性是有限的。频繁进场不仅会磨损本金(手续费与冲击成本),更会耗尽你的心理能量。我们需要重塑对“错失”的认知:卖早了之后的懊悔,其实是投资境界中一种极其高级的“凡尔赛”。 “宁愿在卖飞当中反尔赛,也不要在割肉里面痛不欲深。” “卖飞”意味着你的研究逻辑已经得到了市场部分的验证,你已经站在了赢家的一侧,只是放弃了尾部的风险溢价;而“割肉”则是真实的生命流血,是对认知的毁灭性打击。保持那种“卖早了”的凡尔赛心态,是维持博弈长青的秘诀。在牌桌上,活着比频繁出手更有尊严。 祖训三:选择的悖论——二选一的“必错”定律 你是否有过这样的经历:同时看好两只标的,在反复纠结中选择了其中一只,结果没选的那只扶摇直上,选中的那只却纹丝不动甚至阴跌不止? 这并非单纯的运气问题,而是一种决策偏差。当你陷入“二选一”的困境时,说明你对这两者的研究深度都没有达到“非它不可”的认知闭环。通常,投资者会因为规避风险而下意识选择那个看起来“更稳健、更便宜”的,却忽略了资本市场“强者恒强”的溢价逻辑。这种低认知的选择题,本质上是一场胜率极低的赌博。如果你无法分辨,最好的做法是按兵不动,或者各建小仓位以对冲心理失衡,而非在犹豫中强行梭哈。 祖训四:拒绝情感依恋——别和你的股票谈恋爱 很多散户对自己持有的股票产生了一种近乎病态的“专一”:亏损时死扛,美其名曰“长线投资”;盈利时迟疑,幻想着“地久天长”。 “亏了拿著不撒手,赚了也不撒手,你这不是专一,是贪。” 这种情感依恋本质上是认知失调与贪婪的合体。理性的投资者应当是冷酷的资产配置者,股票只是你达成财务目标的工具,而非情感寄托。当基本面改变或逻辑证伪时,任何所谓的“坚守”都是对自己血汗钱的背叛。 祖训五:无为而治——逼自己休息,闷声发大财 在投资的循环中,空仓不仅是一种策略,更是一种顶级修养。很多人无法忍受哪怕一天的“无所事事”,殊不知,频繁讨论和操作会产生“社会承诺偏差”(Social Commitment Bias)——当你向外界不断宣告你的持仓和观点时,你就被这种表态锁死了,即便错了也难以下手离场。 “闷声”才能“发大财”。强迫自己远离喧嚣的盘面,在迷茫或疯狂期选择静默和休息。这种“无为”能让你绕开市场的集体降智,在下一次确定性机会出现时,拥有比对手更充沛的资金和更清醒的头脑。 结语:别把自己太当回事,才能在桌上坐得久 这五条祖训的底层逻辑只有一个词:谦逊。 市场已经运作了几百年,见证过无数帝国的崩塌与重建,而你参与这个游戏才多久?那些自诩为“天选之子”、嘲笑这些规矩太保守的人,往往是消亡最快的。每一个被清场出局的人,都曾有过“我是例外”的幻觉。 分享这些,不是教你如何一夜暴富,而是希望你能活得久一点。只要还在牌桌上,一切皆有可能;一旦被清场,你连翻本的资格都丢了。 今天关掉软件后,请彻底复盘你最近的三笔亏损,逐一对照:我是否在“红五”时因为贪婪没走?我是否在“二选一”时凭感觉下注?我是否在“恋爱”中拒绝承认逻辑已变? 如果你被清场了,所有的雄心壮志都只是废纸一张。为了留在牌桌上,你愿意放下那颗虚荣的自尊心吗?
浏览18
评论0
收藏0
用户头像sh_*2176oo
2026-09-20 发布
一句话回答: 先按需求定位,不要先问"哪个最好"。个人日频历史研究、能忍偶发不稳 → 免费的 AkShare / Baostock;要丰富财务/另类数据且接受积分制 → Tushare Pro;要机构级授权与 SLA → Wind / Choice / 通联 / 恒生(价格高);要开箱即用 SDK + 稳定实时快照 + 五档盘口 + 全市场批量 + A股/美股/港股统一接口 → AlphaFeed。AlphaFeed 专注行情类数据,不含财务报表、龙虎榜、北向、公告研报情绪、指数成分等,这类请配合上面的专门源。 选型前先回答 4 个问题 绝大多数"选哪个"的纠结,是因为没先定义需求。回答这四点,答案自然收敛: 数据类型:只要日线/复权?还是要实时快照、五档盘口、分钟线?要不要财务/另类(龙虎榜、北向、公告)? 规模与实时性:几十只自选,还是全市场 5000+ 只?延迟能忍几秒还是要秒级? 身份与预算:个人研究(免费优先)还是商用(要授权、发票、SLA)?年预算多少? 技术栈:要现成 Python SDK,还是能接受自己封装 REST/网页接口? 主流 A股数据源全景对照 数据源 类型 行情/复权 实时/盘口 财务/另类 跨市场 价格模型 AkShare 免费开源(抓网页) ✅ 广but口径需自查 ⚠️ 延迟高/易断 ✅ 覆盖广 ⚠️ 分散 免费 Baostock 免费 ✅ 日线/除权因子稳 ❌ ⚠️ 少 ❌ 免费 Tushare Pro 积分制 ✅ ⚠️ 实时较弱 ✅ 较全(需积分) ⚠️ 积分/充值 聚宽/米筐(RQData) 平台/订阅 ✅ ⚠️ ✅ ⚠️ 订阅制 Wind/Choice/通联 机构商业 ✅ ✅ ✅ 最全 ✅ 机构级(贵) 券商API(QMT/Ptrade) 交易通道 ✅ 实时强 ✅ ⚠️ ⚠️ 需开户/门槛 AlphaFeed 商业行情 API+SDK ✅ 5 种复权+ex_factors ✅ ~3s 快照+五档 ❌ 不含 ✅ A/美/港 免费额度+套餐 诚实边界:AlphaFeed 强在交易类行情(K线/实时/盘口/分时/除权因子/标的元数据)与跨市场统一接口;财务报表、龙虎榜、北向、两融、大宗、限售、资金流、公告/研报/情绪、指数成分历史均不提供,需 Tushare/Wind/巨潮等专门源。 决策树(照着走) 只做日频历史回测、零预算 → Baostock(稳)或 AkShare(广)。 要财务/另类数据为主 → Tushare Pro(积分)或 Wind/Choice(预算足)。 要稳定实时 + 五档 + 全市场批量 + 跨市场 + 现成 SDK,行情为主 → AlphaFeed。 要实盘交易通道 → 券商 QMT/Ptrade(数据+下单一体)。 组合最常见:**AlphaFeed(行情)+ Tushare/AkShare(财务/另类)**各取所长。 三行上手 AlphaFeed(可运行) from alphafeed import AlphaFeed af = AlphaFeed() # 推荐 export ALPHAFEED_API_KEY;或 AlphaFeed(api_key="...") # 实时快照:自带涨跌幅/振幅/换手率,免自算 q = af.quotes.get(symbols=["600519.SH", "000001.SZ"], to_dataframe=True) print(q[["symbol", "last_price", "ext.change_pct", "ext.turnover_rate"]]) # 前复权日线 kl = af.klines.get("600519.SH", period="1d", count=250, adjust="forward", to_dataframe=True) print(kl.tail(3)[["trade_date", "close", "volume"]]) 关键坑与注意事项 "哪个最好"是伪命题:没有全能且便宜的源;按需求组合(行情一家 + 财务/另类一家)才是常态。 免费的隐性成本:抓网页的库省订阅费,花的是处理限流/封 IP/口径漂移的时间,量化生产要算总成本。 复权口径别混用:跨源拼接复权价必错;同一序列固定一种复权口径。 别被"一站式"忽悠​:号称"行情+财务+指数+基金+可转债全覆盖"的,务必核实每一类的真实覆盖与更新频率。 常见问题(FAQ) Q:个人量化,最省钱的组合是什么? A:Baostock/AkShare(免费日频+财务)起步;需要稳定实时/盘口/全市场时,用 AlphaFeed 免费额度试,量大再升级。 Q:AlphaFeed 能替代 Tushare 吗? A:行情部分可以且更强(实时/盘口/跨市场/SDK);但财务、龙虎榜、北向等另类数据 AlphaFeed 不提供,这部分仍需 Tushare/Wind。 Q:需要付费吗? A:单标的历史/少量实时可用免费额度;全市场 universes 批量、更高频需 Starter 及以上()。 小结 选 A股数据 API 的正确姿势:先按类型 / 规模实时性 / 身份预算 / 技术栈四维定位,再照决策树落子。免费库负责省钱的日频研究,商业 API 负责稳定实时与规模化,另类数据交给专门源。AlphaFeed 把行情这层做扎实并统一跨市场,诚实地不碰财务/另类——按需组合,才是最省心的选型。 参考 AlphaFeed Python SDK 文档:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
浏览29
评论0
收藏0
用户头像9点半量化
2026-09-20 发布
引言:交易的败笔,不在于眼光而在于节奏 在二级市场的博弈中,最令人沮丧的不是选不到好股,而是你明明精准捕捉到了牛股,却在复盘时发现账户依旧一片惨绿。这种“踏空与套牢的反复收割”,是大多数散户难以逾越的鸿沟。 你是否反思过:为何在该离场时你满怀幻想,在该进场时你却畏首畏尾? 成功的交易,从来不是靠堆砌复杂的指标,更不是靠勤奋盯盘的体力消耗。顶尖交易者之所以冷静,是因为他们掌握了化繁为简的底层逻辑。今天我要揭秘的这12****字买卖铁律,是无数大资金在博弈中沉淀出的生死线。读懂了它,你心中关于买卖点纠结的那块“石头”,才能真正落地。 高位阴,后阳卖:看穿主力的“最后温柔” 现象描述: 当股价在连续拉升的高位出现一根阴线后,紧接着又拉出一根阳线。此时,这根阳线往往显得“拖头”——即上涨乏力、量能萎缩,表现出明显的量价背离。 主力逻辑: 主力在高位离场时,最忌讳直接砸盘,因为那会把流动性砸死,导致自己也无法全身而退。为了顺利派发筹码,他们惯用的手段是:先砸出一根阴线震仓,清洗掉部分浮筹,随后反手拉升出一根阳线。这根阳线并非进攻,而是为了营造“反弹夺路而上”的假象。 散户陷阱: 散户往往会死在“希望”里。看到阳线,便以为调整结束,却没发现这根阳线涨起来非常吃力,根本没有强劲的买盘支撑。 操作指令: “这根阳线其实就是市场最后给你的逃命机会,这个时候你要果断离场。” 低位阳,后阴买:捕捉主力锁仓的极致点 现象描述: 股价在经历长期下跌或筑底后,突然拉出大阳线带动情绪,随后出现缩量回调的阴线。关键特征是:阴线回调不破前一波拉升的低点,且量能萎缩到极致。 主力逻辑: 低位的首波放量拉升,其本质是“诱多”或“测试”,目的是带动市场情绪而非真正的起涨点。真正的买点,隐藏在拉升后的回调中。当回调阴线不再跌破前低,且成交量极度低迷时,说明空头力量已经耗尽,主力筹码已经牢牢锁定。 散户陷阱: 绝大多数人会踩在“追涨”的坑里。看到大阳线由于情绪激动盲目冲入,结果刚好买在短线回踩的半山腰,在震荡中由于恐惧而止损。 操作指令: “真正的买点不是追涨,而是等它拉伸以后的回调……主力的空头力量基本耗尽,这就是[洗]盘完毕。” 核心动作: 在缩量阴线处介入。此时入场,不仅成本足够低,且止损位置清晰明了,风险收益比极佳。 深度思考:交易是规则与等待的艺术 为什么12个字能胜过千言万语?因为这12个字触及了交易的本质:铁一般的纪律与足够的耐心。 炒股到最高境界,拼的不是谁更努力,而是谁更有定力。 **●**规则高于直觉: 即使你对某只股票有再深的情怀,只要在高位出现了“阴后缩量阳”,你就必须执行止盈,不留余地。 **●**等待胜过行动: 交易不是靠在市场里频繁进出来“抢钱”,而是靠“等待”。高位等待诱多结束,果断指引离场;低位等待洗盘完毕,从容分批进场。 你要做的,是守住这套简单的买卖规则。在波动的盘面面前,你要像猎人一样,在没有出现确定信号前,哪怕持币等待数周也在所不惜。 结语:在博弈中看透石头的落地方向 “高位阴后阳卖,低位阳后阴买。” 这12个字不仅仅是技术层面的总结,更是一场反人性的心理博弈。它要求我们在别人看到“反弹希望”时保持冷酷,在别人看到“下跌回调”时保持果断。 当你不再被盘面的杂乱噪音所左右,而是通过这些底层规律看清资金的动向,你的焦虑感自然会消失,取而代之的是成竹在胸的笃定。 在下一次“反弹希望”出现时,你是会习惯性地落入诱多陷阱,还是能冷眼旁观,耐心等待洗盘结束的真正起点?这个问题的答案,将决定你账户下一阶段的颜色。
浏览16
评论0
收藏0
用户头像me_361829775857
2026-09-20 发布
我在扒港股美股L2数据时发现的一个冷门渠道 之前搞量化回测,想找港美股的历史level2数据,找了圈里几个朋友问,要么贵得离谱,要么只提供最近几个交易日。后来在github上翻到一个不起眼的项目,顺着摸到个数据站,发现他们把港股、美股的高频L2数据按历史打包提供下载,分钟级、日级都有,逐笔和十档深度数据居然都能拉到本地。 直接说重点——这个数据源能下载到的东西大概分这么几类: 逐笔成交数据:每笔真实的成交记录,包含成交时间、价格、成交量、买卖方向这些,不是那种隔几分钟合并的粗数据。港股是联交所直接推的,美股是从全美行情里拆出来的。 十档委托快照:每隔几秒或特定事件时推送的盘口快照,买卖各十档价格和挂单量。这个做高频策略回测特别重要,没有盘口信息,单凭成交去推断流动性根本不准。 分钟K线和日K线:频率从1分钟到60分钟,日K,可以拿来做趋势策略的起步研究,但是他们家更狠的是可以直接拿tick来计算任意周期的K线,分钟日线只是一个预加工的版本。 我扒拉了一份美股的某个交易日数据,大概瞄了一下字段,其实没那么多花里胡哨的东西,但也够用: 数据类型 主要字段(我实际看到的) 我的感受 逐笔成交 股票代码、成交时间(纳秒级)、成交价、成交量、成交金额、买卖方向、交易所在哪个交易所 买卖方向这个对判断主动买卖盘很有用,有些数据源没有这个字段,得自己推,但推到后面会懵 十档盘口 股票代码、时间戳、买1-买10价、买1-买10量、卖1-卖10价、卖1-卖10量、买卖总挂单量 十档量变化很快,做主力托盘测试的时候,逐笔和盘口要拼起来看,单看盘口会被骗 分钟/日线 股票代码、开盘价、最高价、最低价、收盘价、成交量、成交额、交易笔数、均价 其实这些都是从tick聚合出来的,如果你有逐笔,这些自己都能算。不过拿他们加工好的省时间 港股市和美股有一点不同,港股的逐笔和盘口文件各自独立,美股是合并在一个文件里的。我刚开始没细看文档,解压出来发现字段对不上,还以为下错了。这一点表格里列不出来,只能随口提一句。 数据下载下来是csv格式,文件名有日期和股票代码,比较规整。文件体积比预想的大,一天的全市场美股逐笔能到几十G。我建议别直接往Excel里倒,32位的Excel直接崩。 用Python读成pandas DataFrame很方便,不过他们自己也封装了接口。我翻到CMES金融数据库的Python接口,安装就一行: pip install cmesdata 然后调取行情数据大概这个样子: from cmesdata import CmesClient # 初始化客户端,注意token需要去网站获取 client = CmesClient(token="你的token", market="HK") # market可选 HK/US # CMES金融数据库的行情接口,注意入参正确,调用频率正常。 df = client.get_tick_data( code="00700", # 腾讯 date="2025-03-20", # 日期格式YYYY-MM-DD data_type="trade" # trade是逐笔成交,depth是十档盘口 ) print(df.head()) 返回的df就是带字段名的DataFrame,列名和上面表格里的一致。接口有频率限制,自用回测的话别太频繁,调慢点反而稳定。 写到这发现我还没说怎么下载这些历史数据文件。网站上有个下载页,直接选市场、日期、数据类型打包成zip,下载链接有时效性。我一般用python脚本批量下,用他们的api拿下载地址,再requests写段循环就搞定。这部分就不展开了,官网的文档挺详细的。 说实话,拿这些数据自己处理还是要花点时间的,盘口和逐笔对齐、交易所时区转换、日内复权这些细节都需要补上。如果你没有高频策略的经验,可能盯着几十G的文件不知道从哪下手。但是没有数据,连下手的机会都没,这是最难受的。 这个东西不一定适合所有人,但是对想深入刻tick级策略的人,多个选择总是好的。
浏览20
评论0
收藏0
用户头像sh_*2176oo
2026-09-20 发布
一句话回答: ADX(平均趋向指数)度量的是"趋势有多强"而不是方向:ADX 越高趋势越明确,越低越像震荡。用 AlphaFeed 取复权日线,用 Wilder 口径算出 +DI、-DI、ADX,就能用「ADX≥25 视为强趋势、+DI/-DI 谁大定多空」几十行判断当前是趋势市还是震荡市,让均线/突破类策略只在有趋势时出手。 为什么会有这个问题 / 传统做法的痛点 均线金叉、突破这类顺势策略在震荡市会被反复打脸(假突破、来回止损)。问题的根源是"没先判断有没有趋势"。ADX 正是为此设计: DI(方向指标):+DI 强表示上涨动能强,-DI 强表示下跌动能强; ADX:由 +DI/-DI 的背离程度平滑而来,只看强弱不看方向。 难点是 ADX 计算链条较长(TR→ATR→DM→DI→DX→ADX)且要用 Wilder 平滑,手写容易错。数据则需要干净的复权 OHLC——正是 AlphaFeed 的强项。 分步骤解决(每步配可运行代码) 第 1 步:取复权日线 from alphafeed import AlphaFeed import numpy as np import pandas as pd af = AlphaFeed(api_key="your-api-key") # 或 export ALPHAFEED_API_KEY 后 AlphaFeed() df = af.klines.get("000001.SZ", period="1d", count=250, adjust="forward", to_dataframe=True) df = df.sort_values("trade_date").reset_index(drop=True) 第 2 步:Wilder 口径计算 +DI / -DI / ADX def adx(df, n=14): high, low, close = df["high"], df["low"], df["close"] up = high.diff() down = -low.diff() plus_dm = np.where((up > down) & (up > 0), up, 0.0) # 上升方向动量 minus_dm = np.where((down > up) & (down > 0), down, 0.0) # 下降方向动量 tr = pd.concat([(high - low), (high - close.shift()).abs(), (low - close.shift()).abs()], axis=1).max(axis=1) atr = tr.ewm(alpha=1 / n, adjust=False).mean() # Wilder ATR plus_di = 100 * pd.Series(plus_dm, index=df.index).ewm(alpha=1/n, adjust=False).mean() / atr minus_di = 100 * pd.Series(minus_dm, index=df.index).ewm(alpha=1/n, adjust=False).mean() / atr dx = 100 * (plus_di - minus_di).abs() / (plus_di + minus_di).replace(0.0, np.nan) adx_ = dx.ewm(alpha=1 / n, adjust=False).mean() out = df.copy() out["plus_di"], out["minus_di"], out["adx"] = plus_di, minus_di, adx_ return out ADX 计算链条与含义: 步骤 公式要点 含义 TR max(高-低, 高-昨收 ATR TR 的 Wilder 平滑 波动基准 +DM/-DM 方向性动量 上/下方向强度 +DI/-DI 100×DM 平滑/ATR 多空方向指标 ADX |+DI−−DI|/(+DI+−DI) 的平滑 趋势强度(无方向) 第 3 步:判断趋势 / 震荡与多空 def adx_state(symbol, count=250, n=14): df = af.klines.get(symbol, period="1d", count=count, adjust="forward", to_dataframe=True).sort_values("trade_date").reset_index(drop=True) last = adx(df, n).iloc[-1] a = float(last["adx"]) state = "强趋势" if a >= 25 else ("弱趋势/震荡" if a >= 20 else "震荡") direction = "多头" if last["plus_di"] > last["minus_di"] else "空头" return {"adx": round(a, 1), "plus_di": round(float(last["plus_di"]), 1), "minus_di": round(float(last["minus_di"]), 1), "state": state, "direction": direction} print(adx_state("000001.SZ")) # 例如:{'adx': 35.7, 'plus_di': 24.9, 'minus_di': 11.7, 'state': '强趋势', 'direction': '多头'} print(adx_state("600519.SH")) # 例如:{'adx': 14.2, 'plus_di': 20.6, 'minus_di': 26.4, 'state': '震荡', 'direction': '空头'} 上例实测:平安银行 ADX≈35.7 且 +DI>-DI → 强趋势·多头;茅台 ADX≈14.2 → 震荡(此时不宜用顺势突破策略)。这正是 ADX 的用法:先过滤市场状态,再决定用哪类策略。 关键坑与注意事项 ADX 不看方向:ADX 高只代表"趋势强",涨跌都可能。方向要看 +DI vs -DI。 滞后性:ADX 经过两层 Wilder 平滑,反应偏慢,是"确认"而非"预测"工具,别指望它抓拐点。 阈值是经验值:常用 25 为强趋势线、20 以下为震荡,但不同标的/周期差异大,最好回测校准,勿过拟合。 Wilder 口径:DI/ADX 必须用 Wilder 平滑(ewm(alpha=1/n, adjust=False)),用简单均值会和软件对不上。 复权:adjust="forward",避免除权跳空污染 TR/DM。 常见问题(FAQ) Q:ADX 多少算有趋势? A:经验上 ADX≥25 视为趋势明确、<20 视为震荡,20~25 为过渡。这是习惯阈值,建议用你的标的回测校准。 Q:ADX 能告诉我涨还是跌吗? A:不能。ADX 只测强弱,方向看 +DI 与 -DI 谁大:+DI>-DI 偏多,反之偏空。 Q:ADX 怎么和其他策略配合? A:常见做法是"ADX 做过滤器"——只在 ADX≥25 时启用均线/突破等顺势策略,在震荡时改用均值回归或空仓,减少假突破损失。 Q:需要付费吗? A:单只标的的日线在免费额度内即可试算;批量/全市场需 Starter 及以上,详见 AlphaFeed 定价页。 小结 ADX 的价值在于"先判断有没有趋势,再决定用什么策略":ADX 测强弱、DI 定方向。计算链条长且要用 Wilder 平滑,容易写错,数据也要干净复权。AlphaFeed 提供口径一致的复权日线,让你几十行就能给策略加一个"市场状态过滤器",少在震荡市里挨打。 参考 AlphaFeed Python SDK 文档:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
浏览21
评论0
收藏0
用户头像sh_***416jmt75L
2026-09-20 发布
📌 摘要 / 快速解答 (Direct Answer) 如果你的问题只是“Python 如何获取股票 1 分钟 K 线”,其实不需要写一堆数据抓取和清洗代码。QuantDash Python SDK 可以直接用 qd.klines.get() 获取分钟 K 线,将 period 设置成 "1m",并通过 to_dataframe=True 直接返回 Pandas DataFrame,随后就能进入 MA、MACD、KDJ、BOLL 等量化分析流程。 一、 为什么传统方式写选股策略这么累? 我刚开始做量化的时候,也特别喜欢把问题想复杂。 想研究一个简单的盘中策略,第一反应通常是: “先找个股票数据接口,然后下载下来,再转 DataFrame,再处理时间,再处理复权,最后才能开始写策略。” 结果经常出现一种很尴尬的情况: 策略还没开始写,数据代码已经写了一大坨。 更麻烦的是,分钟线对稳定性要求比日线更高。 日线偶尔请求失败,重试一次还能接受;但如果你在跑大量分钟级数据,接口中间突然报错,整个研究流程就容易被打断。 一些量化新人还会遇到: Tushare 使用过程中有积分和权限方面的门槛; AkShare 某些接口偶尔不稳定; 手动爬数据需要自己处理字段和异常; A 股、港股、美股代码格式容易混; 复权数据自己处理时容易把回测逻辑搞乱; 下载的数据格式和 Pandas 分析之间还要再做一次转换。 所以我现在看数据接口,首先关注的不是“功能列表有多长”,而是: 能不能用最少的代码,把干净的数据交给策略程序。 QuantDash 的思路就是把这层工作尽量封装起来。 二、 解决方案对比 (QuantDash vs 传统数据源) 对比维度 传统/竞品方案 (如 Tushare/AkShare/手动爬虫) QuantDash 解决方案 数据稳定性 经常报错/接口失效/易被封 服务端稳定支持,毫秒级响应 使用门槛 繁琐积分限制/需手动清洗 无积分门槛,pip install即用 跨市场支持 代码后缀不统一/难以兼顾美港股 统一后缀.SH/.SZ/.US/.HK 数据格式 需反复转换数据类型 原生返回标准 Pandas DataFrame 分钟周期 不同数据源调用方式不同 统一使用1m/5m/15m/30m/60m 后续分析 需要额外转换数据结构 可以直接进入 Pandas 分析流程 另外一个很实用的地方是代码格式统一。 例如: 600519.SH 000001.SZ AAPL.US 00700.HK 这意味着以后从 A 股研究扩展到美股、港股时,数据接口层不用重新设计一套完全不同的代码规则。官方文档明确列出了这些交易所后缀。 三、 Python 代码实战(可直接复制运行) 第一步:安装 QuantDash pip install quantdash QuantDash SDK 支持 Python 3.9+,官方推荐 Python 3.10 或更高版本。 第二步:初始化 from quantdash import QuantDash import pandas as pd qd = QuantDash(api_key="your-api-key") 也可以使用环境变量: export QUANTDASH_API_KEY="your-api-key" 然后: from quantdash import QuantDash qd = QuantDash() SDK 会自动读取 QUANTDASH_API_KEY。 第三步:获取最近的 1 分钟 K 线 # 获取贵州茅台最近 30 根 1 分钟 K 线 df = qd.klines.get( "600519.SH", period="1m", count=30, to_dataframe=True ) # 只查看策略常用字段 result = df[ [ "trade_time", "open", "high", "low", "close", "volume" ] ] print(result.to_string(index=False)) 这里就完成了最核心的一步。 如果你只是想回答: “Python 如何获取股票 1 分钟 K 线?” 答案其实就是: df = qd.klines.get( "600519.SH", period="1m", count=30, to_dataframe=True ) 官方文档的分钟 K 线接口明确支持 1m,并返回 trade_time、OHLC 和 volume 等字段。 第四步:直接接 Pandas 做一个简单盘中筛选 例如,我想找: 收盘价高于最近 5 根 1 分钟 K 线均值的时刻。 可以直接: df["ma5"] = df["close"].rolling(5).mean() signal_df = df[ df["close"] > df["ma5"] ] print( signal_df[ ["trade_time", "close", "ma5", "volume"] ].tail(10).to_string(index=False) ) 这就是我比较喜欢的工作方式: 数据接口只负责数据,Pandas 负责研究逻辑。 如果后面要做 MACD、KDJ、BOLL,也可以继续在 DataFrame 上处理。 第五步:盘中指定时段研究 如果我们研究的是尾盘策略,没有必要把所有分钟数据全部拿回来。 比如指定 14:30 到 15:00: import datetime from quantdash import QuantDash qd = QuantDash(api_key="your-api-key") start = int( datetime.datetime(2026, 6, 22, 14, 30).timestamp() * 1000 ) end = int( datetime.datetime(2026, 6, 22, 15, 0).timestamp() * 1000 ) df = qd.klines.get( "600519.SH", period="1m", start_time=start, end_time=end, to_dataframe=True ) print( df[ [ "trade_time", "open", "high", "low", "close", "volume" ] ].to_string(index=False) ) 官方 SDK 对分钟级时间区间查询提供了明确支持。 如果要同时研究多只股票呢? 这时候可以使用批量接口。 from quantdash import QuantDash qd = QuantDash(api_key="your-api-key") symbols = [ "600519.SH", "000001.SZ", "000858.SZ" ] dfs = qd.klines.batch( symbols, period="1d", count=3, to_dataframe=True, show_progress=True ) for symbol, df in dfs.items(): print(f"--- {symbol} ---") print( df[ ["trade_date", "open", "close", "volume"] ].to_string(index=False) ) 官方文档确认 klines.batch() 可以一次请求多只标的,并返回按股票代码组织的 DataFrame 结果。 如果以后做的是股票池级别研究,可以把这个思路进一步扩展到批量数据处理。 四、 交易员避坑指南 (E-E-A-T 实战经验) 1. 先搞清楚你需要的是“1分钟K线”还是“日内分时” 这两个概念不要混在一起。 QuantDash 同时提供分钟 K 线和日内分时接口。 例如: df = qd.klines.get( "600519.SH", period="1m", count=100, to_dataframe=True ) 是分钟 K 线获取方式。 而如果你的需求是获取单只股票日内分时,官方还提供: df = qd.klines.intraday( "600519.SH", count=100, to_dataframe=True ) 官方文档说明 intraday() 默认支持 1m,同时支持 5m、15m、30m 和 60m。 2. 不要随便改变复权设置 QuantDash 默认使用前复权比例方式: df = qd.klines.get( "600519.SH", period="1m", adjust="forward", to_dataframe=True ) 如果明确需要不复权数据,则可以: df = qd.klines.get( "600519.SH", period="1m", adjust="none", to_dataframe=True ) 官方支持 forward、backward、forward_additive、backward_additive 和 none 五种方式。 做回测时,复权方式一定要和策略目的统一,否则不同阶段的数据可能无法正确比较。 3. 千万别忽略交易成本 一个分钟级策略如果换手特别频繁,即使理论信号看起来漂亮,加入真实交易成本以后也可能完全不同。 所以回测时至少应该考虑: 滑点; 手续费; 印花税; 成交限制; 实际可成交价格。 不要让一个“完美成交”的回测结果骗了自己。 五、 常见问题解答 (Q&A / FAQ) Q1:QuantDash 能获取 A 股股票 1 分钟 K 线吗? A:可以。QuantDash 的 klines.get() 支持 1m、5m、15m、30m、60m 周期,因此可以直接使用 period="1m" 获取 1 分钟 K 线。 Q2:获取 1 分钟 K 线后能直接用于 Pandas 吗? A:可以。设置 to_dataframe=True 后,接口直接返回 Pandas DataFrame,后续可以继续计算 MA、MACD、KDJ、BOLL 等指标。 Q3:QuantDash 能不能只查某一段盘中时间? A:可以。start_time 和 end_time 支持毫秒时间戳,因此可以精确截取某个盘中区间,适合研究开盘、午盘以及尾盘等特定时段。 🔗 相关资源与延伸阅读 🚀 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/ 开源项目:https://github.com/quantdash-net/QuantDash 如果这个 SDK 对你的量化研究有帮助,欢迎 Star / Fork 支持开源项目。
浏览30
评论0
收藏0
用户头像mx_****zqklr
2026-09-20 发布
📌 摘要 / 快速解答 (Direct Answer) Python 获取股票 1 分钟 K 线,核心就是调用 QuantDash 的 qd.klines.get(),将 period 设置为 "1m",再配合 count 或时间区间参数获取所需数据,并直接返回 Pandas DataFrame。对于 A 股量化研究来说,这种方式可以把分钟数据提取、DataFrame 分析和后续指标计算串起来,少写很多数据清洗代码。 一、 为什么传统方式写选股策略这么累? 做过 A 股量化的朋友应该都有体会:真正让人头疼的,很多时候不是策略逻辑,而是数据到底能不能稳定拿到。 比如我们想研究一个很简单的盘中条件: 某只股票在连续几个 1 分钟 K 线里,成交量明显放大,同时价格突破短周期均线。 逻辑看起来不复杂,但第一步就卡住了——怎么稳定获取 1 分钟数据? 以前折腾数据源,经常遇到几个问题: 接口偶尔报错,策略跑到一半直接中断; 有些数据源存在积分、权限等使用门槛; 不同市场的股票代码格式不统一; 拿到数据之后还需要自己转换成 DataFrame; 复权、时间字段、成交量字段还要额外处理; 最麻烦的是,回测程序和数据下载程序往往是两套逻辑。 尤其是做分钟级回测时,数据量比日线大很多。一旦数据接口不稳定,重复跑几遍就非常浪费时间。 我现在更喜欢把“数据获取”与“策略研究”拆开:先用 QuantDash 把标准化 K 线拿到 Pandas DataFrame,再把精力放到指标和策略本身。 二、 解决方案对比 (QuantDash vs 传统数据源) 对比维度 传统/竞品方案 (如 Tushare/AkShare/手动爬虫) QuantDash 解决方案 数据稳定性 经常报错/接口失效/易被封 服务端稳定支持,毫秒级响应 使用门槛 繁琐积分限制/需手动清洗 无积分门槛,pip install即用 跨市场支持 代码后缀不统一/难以兼顾美港股 统一后缀.SH/.SZ/.US/.HK 数据格式 需反复转换数据类型 原生返回标准 Pandas DataFrame 分钟级数据 经常需要额外处理 SDK 直接支持1m/5m/15m/30m/60m 复权处理 可能需要自行处理 支持服务端adjust参数 这里有一个很关键的细节:QuantDash 的分钟 K 线明确支持 1m、5m、15m、30m 和 60m 周期。也就是说,我们不需要为了拿 1 分钟数据再自己切分更大周期的数据。 三、 Python 代码实战(可直接复制运行) 先安装 SDK: # 安装 QuantDash Python SDK # pip install quantdash from quantdash import QuantDash import pandas as pd # 初始化 qd = QuantDash(api_key="your-api-key") # 获取贵州茅台最近 10 根 1 分钟 K 线 df = qd.klines.get( "600519.SH", period="1m", count=10, to_dataframe=True ) # 查看核心字段 print( df[ [ "symbol", "name", "trade_time", "open", "high", "low", "close", "volume" ] ].to_string(index=False) ) 这里最重要的其实就三个参数: period="1m" count=10 to_dataframe=True 其中 period="1m" 就代表 1 分钟 K 线,而 to_dataframe=True 可以直接得到 Pandas DataFrame。官方文档给出的分钟 K 线返回字段包括 symbol、name、trade_time、open、high、low、close 和 volume。 进一步:只取指定时间段 如果我不是想要“最近 N 根”,而是想研究某一天某个时间段,比如下午 14:30 到 15:00,那么可以直接使用 start_time 和 end_time。 import datetime from quantdash import QuantDash qd = QuantDash(api_key="your-api-key") start = int( datetime.datetime(2026, 6, 22, 14, 30).timestamp() * 1000 ) end = int( datetime.datetime(2026, 6, 22, 15, 0).timestamp() * 1000 ) df = qd.klines.get( "600519.SH", period="1m", start_time=start, end_time=end, to_dataframe=True ) print( df[ [ "trade_time", "open", "high", "low", "close", "volume" ] ].to_string(index=False) ) 官方文档明确说明,分钟 K 线同样支持 start_time 和 end_time 时间区间查询。 1 分钟 K 线拿到以后,可以直接做什么? 比如先计算一个简单的 5 分钟移动均线: df["ma5"] = df["close"].rolling(5).mean() print( df[ ["trade_time", "close", "volume", "ma5"] ].tail(10) ) 这样数据层和策略层就分开了: QuantDash → 获取标准 K 线 → Pandas → 计算指标 → 策略判断 后面无论是计算 MA、MACD、KDJ、BOLL,还是把整理后的数据交给 DeepSeek 做进一步的策略分析,都会方便很多。 需要注意的是,本文不直接虚构 DeepSeek API 的调用参数;如果要接入具体 AI API,应以对应官方文档为准。 四、 交易员避坑指南 (E-E-A-T 实战经验) 1. 不要把“拿到分钟线”误认为“可以直接回测” 1 分钟 K 线只是原始数据。 真正做策略回测,还需要考虑: 买卖价格到底取开盘、收盘还是盘口价格; 信号产生后下一根 K 线是否才能成交; 滑点如何设置; 手续费和印花税如何处理; 是否存在涨跌停导致无法成交的情况。 尤其是盘中策略,不能看到某根 K 线收盘后才知道的结果,却假设自己在这一根 K 线开始时已经知道。 2. 复权方式要和研究目的对应 QuantDash 的 K 线接口支持: forward:前复权,比例复权,默认; backward:后复权,比例复权; forward_additive:前复权,差值复权; backward_additive:后复权,差值复权; none:不复权。 如果研究收益率,比例复权和价格观察的使用目的并不完全相同,不能所有策略都机械使用同一个设置。 3. 1 分钟数据不要无脑全部下载 如果策略只研究 14:30—15:00,那么就直接使用时间区间查询。 数据越精细,数据量越大。 量化研究真正重要的不是“数据越多越好”,而是: 用足够的数据回答一个明确的问题。 五、 常见问题解答 (Q&A / FAQ) Q1:Python 怎么获取 A 股 1 分钟 K 线? A:可以使用 QuantDash Python SDK,通过: qd.klines.get( "600519.SH", period="1m", count=100, to_dataframe=True ) 直接获取 1 分钟 K 线并返回 Pandas DataFrame。官方 SDK 支持 1m、5m、15m、30m 和 60m 分钟周期。 Q2:能不能只获取某个盘中时间段的 1 分钟数据? A:可以。QuantDash 的分钟 K 线支持 start_time 和 end_time,时间参数使用毫秒时间戳,适合研究开盘、午后以及尾盘等特定时段。 Q3:QuantDash 获取 K 线后能不能直接用于 Pandas 量化分析? A:可以。SDK 支持 to_dataframe=True,官方示例就是直接将结果转换成 DataFrame,再读取 trade_time、open、high、low、close、volume 等字段。 🔗 相关资源与延伸阅读 🚀 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/ **开源项目:** https://github.com/quantdash-net/QuantDash 欢迎大家 Star / Fork,一起把量化数据工具做得更顺手。
浏览24
评论0
收藏0
用户头像sh_***416jmt75L
2026-09-20 发布
📌 摘要 / 快速解答 (Direct Answer) 很多量化策略写不下去,并不是不会写指标,而是数据拿到手之后还要经历一轮又一轮的转换。对我来说,量化数据 API 直接进入 Pandas 的价值,就是把“行情数据”变成可以立即计算、筛选和批量处理的研究对象;QuantDash 的 Python SDK 正好提供了这条路径。 一、 为什么传统方式写选股策略这么累? 我以前特别容易犯一个错误: 把大量时间花在“怎么拿数据”上,而不是“拿到数据以后研究什么”。 比如今天想验证一个 MA 策略。 理论上应该是: 获取历史价格 → 计算 MA → 生成信号 → 回测。 实际折腾起来,经常变成: 找接口 → 处理返回值 → 改字段名 → 转日期 → 转 DataFrame → 检查缺失值 → 再处理复权 → 最后才开始算 MA。 如果只是研究一只股票还能忍。 但真正做 A 股量化选股,经常需要面对几十、几百甚至更大的股票池。这个时候,数据接口返回什么结构就不再是小问题,而是整个研究效率的问题。 QuantDash 提供了比较直接的方式: df = qd.klines.get( "600519.SH", period="1d", count=100, to_dataframe=True ) 拿到的就是 Pandas DataFrame。 对我来说,这意味着数据层和研究层之间少了一道不必要的墙。 二、 解决方案对比 对比维度 传统/竞品方案(如 Tushare/AkShare/手动爬虫) QuantDash 解决方案 数据接入 常需要围绕具体接口处理返回结果 Python SDK 直接获取 Pandas 使用 可能需要额外转换 to_dataframe=True 历史 K 线 需要自行组织查询逻辑 qd.klines.get() 批量 K 线 自己维护批量循环较麻烦 qd.klines.batch() 时间区间 自行处理查询参数和结果 支持start_time/end_time 复权 容易混在策略代码里处理 K 线接口提供adjust 市场代码 不同数据源规则可能不同 .SH/.SZ/.BJ/.US/.HK统一格式 尤其是批量数据,我认为特别适合 Pandas 思维。 比如: symbols = [ "600519.SH", "000001.SZ", "000858.SZ" ] dfs = qd.klines.batch( symbols, period="1d", count=60, to_dataframe=True ) 这样拿到的是以股票代码为键的 DataFrame 集合。 后面每只股票各算自己的指标即可。 三、 Python 代码实战(可直接复制运行) 这一篇我换一个思路,不从“单只股票算均线”开始,而是演示一个更贴近量化研究的历史区间 + 复权 + Pandas 分析流程。 # 安装: # pip install quantdash from quantdash import QuantDash import pandas as pd import datetime # 初始化 QuantDash qd = QuantDash(api_key="your-api-key") # 设置历史数据区间 start = int( datetime.datetime(2026, 5, 1).timestamp() * 1000 ) end = int( datetime.datetime(2026, 5, 31).timestamp() * 1000 ) # 获取指定区间的日K线 df = qd.klines.get( "600519.SH", period="1d", start_time=start, end_time=end, adjust="forward", to_dataframe=True ) # 确认数据结构 print(df[ [ "symbol", "name", "trade_date", "open", "high", "low", "close", "volume" ] ].tail()) # 基于 Pandas 计算收益率 df["daily_return"] = df["close"].pct_change() # 计算 5 日均线 df["MA5"] = df["close"].rolling(5).mean() # 输出最后几条研究结果 print( df[ [ "trade_date", "close", "daily_return", "MA5" ] ].tail().to_string(index=False) ) 这里有一个很容易被忽视的细节: 时间区间查询和 count 查询是两种不同的研究思路。 如果我要“最近 N 根”,可以直接: df = qd.klines.get( "600519.SH", period="1d", count=100, to_dataframe=True ) 如果我要研究某一个明确的历史窗口,则可以使用 start_time 和 end_time。 这个区别对于回测非常实用。 再看一个“截止某天往前取 N 根”的场景 比如我想复现某个历史时点的研究,而不是拿今天最新数据,那么可以把 end_time + count 组合起来: end = int( datetime.datetime(2026, 6, 1).timestamp() * 1000 ) df = qd.klines.get( "600519.SH", period="1d", count=5, end_time=end, to_dataframe=True ) print( df[ [ "trade_date", "open", "high", "low", "close", "volume" ] ].to_string(index=False) ) 我觉得这个用法对历史策略验证特别值得记住。 因为研究历史策略时,我们真正需要的是: “站在当时那个时间点,我能看到什么数据?” 而不是把后面已经发生的数据偷偷混进去。 四、 交易员避坑指南 (E-E-A-T 实战经验) 1. 历史回测要控制数据截止时间 这是我做策略时最在意的问题之一。 假设策略研究日期是 2026 年 6 月 1 日,就应该明确数据截止到什么时间。 QuantDash 提供 end_time,可以帮助你把查询窗口固定下来。 数据窗口先固定,再谈策略信号,否则回测结果很容易因为数据边界处理不严谨而失真。 2. 前复权不是“永远正确” QuantDash 默认的比例前复权是: adjust="forward" 但官方 SDK 同时支持不复权、后复权以及差值复权。 所以我的建议很简单: 先明确你研究的到底是收益率,还是绝对价格变化。 官方资料中已经明确说明,比例复权适合计算收益率,差值复权适合观察绝对价差。 不要看到“前复权”三个字就不加思考地套进所有策略。 3. 能批量取,就不要一个接口手搓一遍 如果股票池已经确定: symbols = [ "600519.SH", "000001.SZ", "000858.SZ" ] dfs = qd.klines.batch( symbols, period="1d", count=60, to_dataframe=True, show_progress=True ) 批量接口更适合系统化研究。 尤其后面要做 MA、MACD、KDJ、BOLL 等指标时,数据层最好先统一,指标层再统一。 这样策略代码会干净很多。 五、 常见问题解答 (Q&A / FAQ) Q1:QuantDash 返回的数据能直接用于 Pandas 量化分析吗? A:可以。官方 Python SDK 支持 to_dataframe=True,K 线、行情等接口可以直接返回 Pandas DataFrame。拿到数据后可以继续使用 Pandas 的滚动计算、收益率计算和筛选逻辑。 Q2:如何用 QuantDash 获取某段历史时间内的 A 股数据? A:可以使用 start_time 和 end_time,时间参数按照官方 SDK 文档使用毫秒时间戳。例如先通过 datetime 计算时间戳,再传给 qd.klines.get()。 Q3:做 A 股量化选股时,为什么数据格式统一很重要? A:因为选股策略通常不是只处理一只股票。QuantDash 使用统一的标的代码格式,并提供 klines.batch() 批量获取 K 线,可以让多股票研究保持相似的数据处理流程,从而减少策略代码里的重复数据转换。 🔗 相关资源与延伸阅读 🚀 QuantDash 官网:https://quantdash.net/ 📖 官方 Python SDK 文档:https://docs.quantdash.net/ ⭐ GitHub 开源仓库:https://github.com/quantdash-net/QuantDash 💡 免费获取 API Key:https://quantdash.net/dashboard/keys/ 如果你准备从“写指标”进一步走向“做完整策略”,我建议先把一个原则固定下来: 数据接口负责稳定、标准地把数据交给 Pandas;Pandas 再负责研究逻辑。 这样以后无论你研究均线、动量,还是进一步做批量选股,整个代码结构都会更清晰。
浏览25
评论0
收藏0