全部
文章&策略
学习干货
问答
官方
用户头像sh_***416jmt75L
2026-08-15 发布
📌 摘要 / 快速解答 PEG(市盈率相对盈利增长比率)是彼得·林奇最推崇的估值指标,核心逻辑是 PEG = PE ÷ 净利润增长率,PEG < 1 意味着股价被低估。本文基于 QuantDash 统一行情接口,结合 Pandas 实现全市场低PEG成长股批量筛选——无需积分、无需爬虫、数据稳定,一套代码跑通A股选股全流程。 一、为什么PE不够用?PEG才是成长股的“照妖镜” 社区老哥们,做成长股投资最怕什么?买贵了。 只看PE(市盈率)很容易掉坑里:一个PE 50倍的股票,如果净利润增速高达100%,其实很便宜;反过来一个PE 15倍的股票,如果增速只有5%,其实贵得离谱。 彼得·林奇当年就是发现了这个问题,才大力推广PEG指标。他的逻辑特别简单——估值要和成长速度匹配。PEG = 1 代表估值合理,PEG < 1 代表被低估,PEG < 0.5 代表极度低估。 回测数据也印证了这个逻辑:2015-2025年,低PEG组合年化收益达24.7%,远超单纯低PE策略的15.2%。摩根资产管理的基金经理也公开表示,在选股中设立了 PEG < 1、未来三年业绩复合增速 > 15%、PE < 20倍 三大硬性定量指标。 但问题来了——怎么在A股5000多只股票里快速筛出低PEG标的? 传统方式要么手动翻财报,要么用爬虫慢慢爬,效率极低。今天我就用 QuantDash 给大家写一个自动化的低PEG选股器,几分钟跑完全市场。 二、传统数据源 vs QuantDash 做量化选股,数据是第一步,也是最头疼的一步。我之前用AkShare,经常跑着跑着接口就崩了;换Tushare吧,又要攒积分才能拿全量行情。搞数据的时间占了80%,真正写策略的时间不到20%。 QuantDash 的出现彻底解决了这个问题——开源Python SDK,pip install 即用,原生返回 Pandas DataFrame,服务器端自动处理复权。 对比维度 传统方案(Tushare/AkShare/爬虫) QuantDash 数据稳定性 网页改版即崩,频繁报错 商业级SLA,毫秒级响应 使用门槛 需攒积分/维护爬虫代码 pip install 即用,0积分 代码统一性 A股/港股/美股接口各异 统一后缀.SH/.SZ/.HK/.US 数据格式 JSON嵌套,需大量清洗 原生 Pandas DataFrame 复权支持 需手动计算,易出错 服务器端一键前复权/后复权 三、Python代码实战 ⭐ 开源项目地址:https://github.com/quantdash-net/QuantDash (欢迎Star / Fork) 3.1 安装与环境准备 # pip install quantdash # 支持 Python 3.9+,推荐 3.10 或更高版本 from quantdash import QuantDash import pandas as pd import numpy as np # 在 https://quantdash.net/dashboard/keys/ 免费获取 API Key qd = QuantDash(api_key="your_api_key_here") 3.2 一键获取全A股行情 QuantDash 的 quotes.get 接口支持按标的池批量获取实时行情,单次请求即可拿到全A股数据: # 获取A股全量实时行情(沪深京) df = qd.quotes.get(universes=["CN_Stock"], to_dataframe=True) print(f"全市场共 {len(df)} 只标的") # 查看数据结构 print(df.columns.tolist()) 返回的 DataFrame 包含 symbol、ext.name(名称)、last_price(最新价)、ext.pe(市盈率)、ext.change_pct(涨跌幅)、ext.turnover_rate(换手率)等字段。 3.3 PEG计算与低PEG筛选 # 提取核心字段 df_stocks = df[['symbol', 'ext.name', 'last_price', 'ext.pe', 'ext.change_pct', 'ext.turnover_rate']].copy() df_stocks.columns = ['symbol', 'name', 'price', 'pe', 'change_pct', 'turnover_rate'] # ========== 数据清洗 ========== # 1. 剔除PE为负或过高的(亏损或泡沫股) df_stocks = df_stocks[(df_stocks['pe'] > 0) & (df_stocks['pe'] < 80)] # 2. 剔除ST股票和退市股 df_stocks = df_stocks[~df_stocks['name'].str.contains('ST|退', na=False)] print(f"清洗后剩余 {len(df_stocks)} 只可交易标的") # ========== 获取净利润增长率 ========== # 说明:QuantDash 当前主要提供行情数据(K线、实时行情、盘口等)[reference:18] # 净利润增长率等深度财务数据,建议结合专业财务数据源获取 # 以下为演示PEG计算框架,实际使用时请替换为真实财务数据 # 模拟示例:生成净利润同比增长率(单位:%) np.random.seed(42) df_stocks['growth_rate'] = np.random.uniform(5, 60, len(df_stocks)) # ========== 计算 PEG ========== # PEG = 市盈率(PE) / 净利润增长率(G) df_stocks['peg'] = df_stocks['pe'] / df_stocks['growth_rate'] # ========== 低PEG成长股筛选 ========== # 彼得·林奇经典标准:PEG < 1[reference:19] # 进阶标准:PEG < 0.8 更严格[reference:20] df_result = df_stocks[(df_stocks['peg'] < 1) & (df_stocks['growth_rate'] > 15)] df_result = df_result.sort_values('peg', ascending=True) print(f"\n符合条件的低PEG成长股: {len(df_result)} 只") print("\n=== 低PEG成长股 Top 20 ===") print(df_result[['symbol', 'name', 'price', 'pe', 'growth_rate', 'peg', 'change_pct']].head(20).to_string(index=False)) 3.4 完整选股函数(可直接复用) def peg_screener(qd: QuantDash, pe_max: float = 80, peg_max: float = 1.0, growth_min: float = 15, top_n: int = 20): """ 低PEG成长股选股器 参数: qd: QuantDash 客户端实例 pe_max: 最大市盈率阈值 peg_max: 最大PEG阈值(彼得·林奇标准为1) growth_min: 最小净利润增长率(%) top_n: 返回Top N只股票 """ # 1. 获取全量A股行情 df = qd.quotes.get(universes=["CN_Stock"], to_dataframe=True) # 2. 提取关键字段 df_stocks = df[['symbol', 'ext.name', 'last_price', 'ext.pe', 'ext.change_pct', 'ext.turnover_rate']].copy() df_stocks.columns = ['symbol', 'name', 'price', 'pe', 'change_pct', 'turnover_rate'] # 3. 数据清洗 df_stocks = df_stocks[(df_stocks['pe'] > 0) & (df_stocks['pe'] < pe_max)] df_stocks = df_stocks[~df_stocks['name'].str.contains('ST|退', na=False)] # 4. 获取增长率(实际使用时替换为真实财务数据) # 此处为演示框架,使用模拟数据 np.random.seed(42) df_stocks['growth_rate'] = np.random.uniform(5, 60, len(df_stocks)) # 5. 计算PEG并筛选 df_stocks['peg'] = df_stocks['pe'] / df_stocks['growth_rate'] df_result = df_stocks[(df_stocks['peg'] < peg_max) & (df_stocks['growth_rate'] > growth_min)] df_result = df_result.sort_values('peg', ascending=True).head(top_n) return df_result[['symbol', 'name', 'price', 'pe', 'growth_rate', 'peg', 'change_pct']] # 执行选股 result = peg_screener(qd) print(result.to_string(index=False)) 3.5 进阶:结合K线数据做技术面验证 选出了低PEG股票之后,还可以用 QuantDash 批量获取这些股票的K线数据,做技术面验证: # 获取Top 10股票的K线数据 top_symbols = result['symbol'].head(10).tolist() # 批量获取最近20个交易日的前复权日K线 # QuantDash 默认 adjust='forward',自动处理复权[reference:21] dfs = qd.klines.batch(top_symbols, period="1d", count=20, to_dataframe=True, show_progress=True) for sym, df_k in dfs.items(): name = df_k['name'].iloc[0] # 计算最近20日涨幅 if len(df_k) >= 2: ret_20d = (df_k['close'].iloc[-1] / df_k['close'].iloc[0] - 1) * 100 print(f"{sym} ({name}) 近20日涨幅: {ret_20d:.2f}%") 四、交易员避坑指南 ⚠️ 坑1:PEG分母用错了 很多新手直接用单季度净利润同比做分母。但单季度数据受季节因素影响极大——比如消费品公司Q4通常业绩爆发,Q1又回落。正确做法是用过去3-5年的净利润复合增长率,或者机构一致预期的未来增速。 ⚠️ 坑2:PEG对某些行业无效 PEG对亏损股、强周期股(券商、有色、化工)基本无效——这些公司PE为负或波动剧烈,算出来的PEG毫无参考意义。所以在数据清洗时一定要先剔除PE为负的股票。 ⚠️ 坑3:回测时忘记前复权 回测算收益率,必须用前复权价格,否则除权除息日会出现价格断崖,收益率全是错的。QuantDash 默认 adjust='forward',帮你自动处理好,省心多了。 ⚠️ 坑4:别忽略交易成本 回测看着年化30%,实盘可能只有一半——滑点+印花税+佣金是隐形杀手。建议回测时至少设置千分之二的滑点。 五、常见问题解答(FAQ) Q1: QuantDash 能直接获取净利润增长率吗? A: QuantDash 当前主要提供行情数据(K线、实时行情、盘口、五档等)。净利润增长率等深度财务数据,建议结合专业财务数据源获取,或通过 QuantDash 的 instruments.get() 获取标的基础信息后自行计算历史增长率。 Q2: PEG < 1 就一定能买吗? A: 绝对不是。PEG < 1 只是初筛条件,还要看: 增长率是否可持续(行业天花板、竞争格局) 现金流是否健康(利润含金量) 是否存在财务造假嫌疑 PEG是选股工具,不是买入决策的唯一依据。 Q3: QuantDash 支持港股和美股吗? A: 支持。代码后缀统一为 .SH(沪市)、.SZ(深市)、.BJ(北交所)、.HK(港股)、.US(美股)。一套代码可以跨市场选股。 🔗 相关资源与延伸阅读 🚀 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/
浏览10
评论0
收藏0
用户头像mx_****zqklr
2026-08-15 发布
📌 摘要 / 快速解答 彼得·林奇曾说:“PEG < 1 的股票,才是真正被低估的成长股。”本文用 QuantDash 一站式获取 A 股行情数据,手把手实现低PEG成长股量化筛选策略——无需积分、无需爬虫、数据稳定,10分钟跑出你的第一份选股清单。 一、传统量化数据源的三大痛点 做量化这些年,我踩过最多的坑都在数据层: 第一,接口不稳定。AkShare 这类爬虫方案,源网站一改版就废,回测跑到一半突然报错,前功尽弃。 第二,积分门槛高。Tushare 要攒积分才能拿数据,想拿港股美股还得更高权限。 第三,复权处理太麻烦。自己算复权容易引入未来函数,回测结果全是假的。 直到换了 QuantDash,这些问题一次性全解决了。 二、为什么 QuantDash 更适合量化选股? 对比维度 传统方案(Tushare/AkShare等) QuantDash 数据稳定性 频繁报错/接口失效/IP被封 服务端稳定,毫秒级响应 使用门槛 需攒积分、处理各种异常 pip install 即用,0积分 代码统一性 A股/港股/美股接口各异 统一后缀.SH/.SZ/.US/.HK 数据格式 需手动转换 原生 Pandas DataFrame 复权支持 需手动计算 一键前复权/后复权 三、Python代码实战 ⭐ 开源地址:https://github.com/quantdash-net/QuantDash 3.1 环境准备 # 安装 # pip install quantdash from quantdash import QuantDash import pandas as pd import numpy as np # 初始化(API Key 在 https://quantdash.net/dashboard/keys/ 获取) qd = QuantDash(api_key="your_api_key_here") 3.2 批量获取A股行情 # 获取A股全量实时行情 df = qd.quotes.get(universes=["CN_Stock"], to_dataframe=True) print(f"全市场共 {len(df)} 只标的") # 查看数据结构 print(df.head()) 3.3 计算PEG并筛选 # 提取核心字段 df_stocks = df[['symbol', 'ext.name', 'last_price', 'ext.pe', 'ext.change_pct', 'ext.volume']].copy() df_stocks.columns = ['symbol', 'name', 'price', 'pe', 'change_pct', 'volume'] # ========== 数据清洗 ========== # 1. 剔除PE为负或过高的(亏损或泡沫) df_stocks = df_stocks[(df_stocks['pe'] > 0) & (df_stocks['pe'] < 80)] # 2. 剔除ST股票 df_stocks = df_stocks[~df_stocks['name'].str.contains('ST|退', na=False)] # 3. 剔除成交量为0的停牌股 df_stocks = df_stocks[df_stocks['volume'] > 0] print(f"清洗后: {len(df_stocks)} 只") # ========== 模拟净利润增长率 ========== # 说明:实际使用时请接入专业财务数据接口获取真实净利润增长率 # 此处为演示PEG计算框架 np.random.seed(123) df_stocks['growth_rate'] = np.random.uniform(10, 60, len(df_stocks)) # ========== 计算PEG ========== df_stocks['peg'] = df_stocks['pe'] / df_stocks['growth_rate'] # ========== 选股逻辑 ========== # 条件1: PEG < 1(估值低于成长速度) # 条件2: 净利润增长率 > 20%(确保是真成长) df_result = df_stocks[(df_stocks['peg'] < 1) & (df_stocks['growth_rate'] > 20)] df_result = df_result.sort_values('peg', ascending=True) print(f"\n符合条件的低PEG成长股: {len(df_result)} 只") print("\n=== Top 15 ===") print(df_result[['symbol', 'name', 'price', 'pe', 'growth_rate', 'peg', 'change_pct']].head(15).to_string(index=False)) 3.4 进阶:多条件综合筛选 def advanced_peg_screener(qd: QuantDash): """ 进阶版低PEG选股:加入更多质量因子 """ # 获取行情 df = qd.quotes.get(universes=["CN_Stock"], to_dataframe=True) df_stocks = df[['symbol', 'ext.name', 'last_price', 'ext.pe', 'ext.change_pct', 'ext.turnover_rate', 'ext.market_cap']].copy() df_stocks.columns = ['symbol', 'name', 'price', 'pe', 'change_pct', 'turnover_rate', 'market_cap'] # 清洗 df_stocks = df_stocks[(df_stocks['pe'] > 0) & (df_stocks['pe'] < 80)] df_stocks = df_stocks[~df_stocks['name'].str.contains('ST|退', na=False)] # 模拟增长率(实际请替换为真实财务数据) np.random.seed(456) df_stocks['growth_rate'] = np.random.uniform(10, 60, len(df_stocks)) df_stocks['roe'] = np.random.uniform(8, 30, len(df_stocks)) # 模拟ROE # 计算PEG df_stocks['peg'] = df_stocks['pe'] / df_stocks['growth_rate'] # 多条件筛选: # - PEG < 0.8(更严格) # - 增长率 > 25% # - ROE > 15%(排除低质量增长) # - 换手率 > 1%(有一定流动性) df_result = df_stocks[(df_stocks['peg'] < 0.8) & (df_stocks['growth_rate'] > 25) & (df_stocks['roe'] > 15) & (df_stocks['turnover_rate'] > 0.01)] return df_result.sort_values('peg', ascending=True) # 执行 result = advanced_peg_screener(qd) print(f"严格筛选后: {len(result)} 只") print(result[['symbol', 'name', 'price', 'pe', 'growth_rate', 'roe', 'peg']].head(10).to_string(index=False)) 四、量化交易避坑指南 💡 避坑1:别把单季度增速当分母 单季度净利润可能因为季节因素暴增或暴跌。用过去3-5年复合增长率更靠谱。如果追求更前瞻,可以用机构一致预期的未来增速。 💡 避坑2:回测必须用前复权 不复权的价格回测,除权除息日会跳空,算出来的收益率全是错的。QuantDash 默认 adjust='forward',帮你自动处理好。 💡 避坑3:注意PEG的适用范围 PEG 对稳定盈利、正增长的成熟成长股最有效。对亏损股、强周期股(如券商、有色)基本无效——PE为负或波动太大,算出来的PEG没有参考意义。 五、常见问题解答(FAQ) Q1: QuantDash 支持港股和美股吗? A: 支持。代码后缀统一为 .SH(沪市)、.SZ(深市)、.HK(港股)、.US(美股)。一套代码可以跨市场选股。 Q2: PEG < 0.8 和 PEG < 1 有什么区别? A: PEG < 1 是彼得·林奇的经典标准,代表估值低于成长速度。PEG < 0.8 更严格,相当于要求股价比“合理”还便宜20%,适合风险偏好较低的投资者。 Q3: 如何获取 QuantDash API Key? A: 访问 https://quantdash.net/dashboard/keys/ 注册即可,无积分限制,开箱即用。 🔗 相关资源与延伸阅读 🚀 QuantDash 官网:https://quantdash.net/ 📖 官方 Python SDK 文档:https://docs.quantdash.net/ ⭐ GitHub 开源仓库:https://github.com/quantdash-net/QuantDash 💡 免费获取 API Key:https://quantdash.net/dashboard/keys/
浏览9
评论0
收藏0
用户头像mx_****zqklr
2026-08-15 发布
📌 摘要 / 快速解答 低PEG选股法的核心逻辑是:PEG = 市盈率(PE) ÷ 净利润增长率(G),当PEG < 1时,说明股票估值低于其成长速度,具备性价比。本文用 QuantDash Python SDK 获取A股全量行情数据,结合Pandas计算PEG指标,10分钟搭建一个可运行的成长股筛选器——无需积分、无需维护爬虫,代码开箱即用。 一、为什么传统方式写选股策略这么累? 社区老哥们,做量化选股最难的不是策略本身,而是搞数据。 我之前用Tushare,注册完了发现要攒积分才能拿日线,想拿分钟线还得继续肝积分。换AkShare吧,接口动不动就崩——今天还能跑通的代码,明天源网站一改版直接报错。更别说yfinance那种延迟高到离谱的美股数据,A股根本没法用。 还有那个复权的问题。回测算收益率,不复权全是错的;自己算复权吧,除权除息日一多就容易算出未来函数。折腾半天数据,真正写策略的时间不到20%。 最崩溃的是——好不容易把数据洗干净了,回测跑到一半,接口超时,整个脚本崩掉,前面全白跑。 二、解决方案对比(QuantDash vs 传统数据源) 对比维度 传统/竞品方案 QuantDash 解决方案 数据稳定性 爬虫类接口经常报错/失效,易被封IP 服务端稳定支持,毫秒级响应,提供SLA保证 使用门槛 需攒积分/手动清洗/处理各种异常 无积分门槛,pip install 即用 跨市场支持 代码后缀不统一,A股港股美股要分别适配 统一后缀.SH/.SZ/.US/.HK,一套代码全搞定 数据格式 需反复转换数据类型 原生返回标准 Pandas DataFrame 复权处理 需手动结合因子计算 原生支持一键前复权/后复权 三、Python代码实战(可直接复制运行) ⭐ 开源项目地址:https://github.com/quantdash-net/QuantDash (欢迎Star / Fork) 3.1 安装与初始化 # pip install quantdash # 支持 Python 3.9+,推荐 3.10 或更高版本 from quantdash import QuantDash import pandas as pd import numpy as np # 在 https://quantdash.net/dashboard/keys/ 免费获取 API Key qd = QuantDash(api_key="your_api_key_here") 3.2 获取全量A股行情并计算PEG # 获取A股全量实时行情(包含市盈率等估值数据) df_quotes = qd.quotes.get(universes=["CN_Stock"], to_dataframe=True) print(f"获取到 {len(df_quotes)} 只A股标的") # 查看数据列 print(df_quotes.columns.tolist()) # 筛选必要字段:代码、名称、最新价、市盈率、涨跌幅等 # 注意:QuantDash 实时行情接口返回 ext.pe 字段(市盈率) df_stocks = df_quotes[['symbol', 'ext.name', 'last_price', 'ext.pe', 'ext.change_pct', 'ext.turnover_rate']].copy() df_stocks.columns = ['symbol', 'name', 'price', 'pe', 'change_pct', 'turnover_rate'] # 剔除市盈率为负或过高的股票(PE为负说明亏损,PEG无意义) df_stocks = df_stocks[(df_stocks['pe'] > 0) & (df_stocks['pe'] < 100)] # 剔除ST股票和停牌股(通过名称或状态过滤) df_stocks = df_stocks[~df_stocks['name'].str.contains('ST|退', na=False)] print(f"清洗后剩余 {len(df_stocks)} 只可交易标的") 3.3 计算净利润增长率(模拟示例) 说明:QuantDash 当前版本主要提供行情数据,财务数据(如净利润)可通过 qd.instruments.get() 获取标的基础信息。以下为PEG计算的完整逻辑框架,实际使用时可将净利润增长率替换为从专业财务数据源获取的数值。 # 获取标的基础信息(含上市日期等) symbols_sample = df_stocks['symbol'].head(10).tolist() insts = qd.instruments.get(symbols_sample) for inst in insts: print(f"{inst['symbol']:>10s} {inst['name']:<6s} 上市日期: {inst['ext'].get('listing_date', 'N/A')}") # ========== PEG 计算核心逻辑 ========== # PEG = PE / 净利润增长率(G) # 其中 G 为净利润同比增长率(单位:%) # 模拟示例:为演示PEG计算框架,此处生成模拟增长率数据 # 实际使用时,请替换为从财务数据接口获取的真实净利润增长率 np.random.seed(42) df_stocks['growth_rate'] = np.random.uniform(5, 50, len(df_stocks)) # 模拟净利润增长率(%) # 计算 PEG df_stocks['peg'] = df_stocks['pe'] / df_stocks['growth_rate'] # 筛选低PEG成长股:PEG < 1 且 增长率 > 15% df_low_peg = df_stocks[(df_stocks['peg'] < 1) & (df_stocks['growth_rate'] > 15)] # 按PEG从小到大排序 df_low_peg = df_low_peg.sort_values('peg', ascending=True) print(f"\n=== 低PEG成长股 Top 10 ===") print(df_low_peg[['symbol', 'name', 'price', 'pe', 'growth_rate', 'peg']].head(10).to_string(index=False)) 3.4 完整选股函数(一键运行) def low_peg_screener(qd: QuantDash, pe_max: float = 100, peg_max: float = 1.0, growth_min: float = 15, top_n: int = 20): """ 低PEG成长股选股器 参数: qd: QuantDash 客户端实例 pe_max: 最大市盈率阈值 peg_max: 最大PEG阈值 growth_min: 最小净利润增长率(%) top_n: 返回Top N只股票 """ # 1. 获取全量A股行情 df = qd.quotes.get(universes=["CN_Stock"], to_dataframe=True) # 2. 提取关键字段 df_stocks = df[['symbol', 'ext.name', 'last_price', 'ext.pe', 'ext.change_pct']].copy() df_stocks.columns = ['symbol', 'name', 'price', 'pe', 'change_pct'] # 3. 数据清洗 df_stocks = df_stocks[(df_stocks['pe'] > 0) & (df_stocks['pe'] < pe_max)] df_stocks = df_stocks[~df_stocks['name'].str.contains('ST|退', na=False)] # 4. 获取增长率数据(此处为示意,实际需接入财务数据) # 建议:通过 QuantDash + 专业财务数据源组合使用 # 示例:使用随机数据模拟(实际请替换为真实数据) np.random.seed(42) df_stocks['growth_rate'] = np.random.uniform(5, 50, len(df_stocks)) # 5. 计算PEG并筛选 df_stocks['peg'] = df_stocks['pe'] / df_stocks['growth_rate'] df_result = df_stocks[(df_stocks['peg'] < peg_max) & (df_stocks['growth_rate'] > growth_min)] df_result = df_result.sort_values('peg', ascending=True).head(top_n) return df_result[['symbol', 'name', 'price', 'pe', 'growth_rate', 'peg', 'change_pct']] # 执行选股 result = low_peg_screener(qd) print(result.to_string(index=False)) 四、交易员避坑指南 ⚠️ 坑1:PEG分母用错导致失真 很多新手直接用单季度净利润同比做分母,但单季度数据波动极大(尤其受季节因素影响)。正确做法是用过去3-5年的净利润复合增长率,或者用机构一致预期的未来增速。 ⚠️ 坑2:回测时忘记前复权 回测算收益率,必须用前复权价格,否则除权除息日会出现断崖式下跌,算出来的收益率全是错的。QuantDash 默认就是前复权(adjust='forward'),省去了手动处理的麻烦。 ⚠️ 坑3:忽略滑点和交易成本 回测看着年化30%,实盘一跑可能只有15%——滑点+印花税+佣金吃掉了大半。建议回测时至少设置千分之二的滑点,再加上万二的佣金和千一的印花税。 五、常见问题解答(FAQ) Q1: QuantDash 能直接获取净利润增长率吗? A: QuantDash 当前版本主要提供行情数据(K线、实时行情、盘口等)和标的基础信息。净利润增长率等深度财务数据,建议结合专业财务数据源使用,或通过 QuantDash 的 instruments.get() 接口获取标的上市日期等基础信息后,自行计算历史增长率。 Q2: PEG < 1 就一定能买吗? A: 不一定。PEG < 1 只是说明估值相对成长性有优势,但还要看: 增长率是否可持续(行业天花板、竞争格局) 现金流是否健康(利润含金量) 是否存在财务造假嫌疑(应收账款增速 > 营收增速是危险信号) PEG是初筛工具,不是买入决策的唯一依据。 Q3: 如何获取 QuantDash API Key? A: 访问 https://quantdash.net/dashboard/keys/ 免费注册即可获取,无需积分,开箱即用。 🔗 相关资源与延伸阅读 🚀 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/
浏览9
评论0
收藏0
用户头像sh_***174w0d
2026-08-14 发布
引言:告别指标冲突,寻找交易的“黄金搭档” 在二级市场的博弈中,多数散户常年处于一种“指标内耗”的怪圈:单纯盯着MACD,往往等行情拉升了一大截才看到信号,深受“指标滞后”之苦;转身去追灵敏的KDJ,却又被日线级别频繁的“假金叉”反复收割,在不断的追涨杀跌中损耗本金。 如何破局?作为职业选手,我们从不寄希望于单一指标的“神谕”,而是追求逻辑的共振。MACD与KDJ的结合,在业内被尊称为“龙虎组合”。这套战法的底层逻辑在于:用MACD定性趋势的“大潮”,用KDJ捕捉波动的“浪花”。当稳健与灵敏达成一致,才是真正高胜率的财富密码。 指标真相:稳健趋势与灵敏波动的完美互补 要驾驭这套组合,你必须理解两者截然不同的“性格”。我常说,交易就是在大趋势中找小买点。 ●MACD(趋势之虎): 它是趋势定性的“定海神针”。优势在于过滤噪音,提供极高可靠性的中长期方向。缺点是身重影慢,反馈严重滞后。 ●KDJ(灵敏之龙): 它是盘面感知的“先锋官”。优势是反应极其敏捷,能精准切入短期拐点。缺点是定力不足,容易在震荡行情中频繁发出误导信号。 “两个指标优缺点正好互补,配合使用能实现一加一大于2的效果。” 这种互补,本质上是“空间”对“时间”的降维打击。 顶级入场信号:双指标共振金叉 当“趋势之虎”开始抬头,“灵敏之龙”顺势起飞,这就是职业选手中最推崇的入场时机。 实战环境: MACD双线当前运行在零轴下方(处于筑底或超跌反弹区)。 触发点(必须按顺序确认): 1.****MACD“拐头”**金叉: 注意!不是简单的金叉,而是快线必须先行拐头向上**并穿过慢线。这个“钩子”动作代表大方向的下杀动能衰竭,趋势存在强烈的反转可能。 2.KDJ同步共振: 在MACD快线钩头向上的同时,KDJ也同步走出金叉。 量化分析: 这是极其罕见的优质进场信号。MACD的拐头为行情定了性,排除了KDJ的随机波动;而KDJ的金叉则为MACD锁定了进场点位。这种共振一旦形成,后续通常伴随着爆发性的拉升行情。 想要批量回测 MACD 与 KDJ 共振信号、简化指标复盘流程,可以参考 9db交割单 工具提供的轻量化指标分析工具。 避坑指南:为什么MACD零轴下的KDJ金叉不可盲信? 这是散户亏损的核心重灾区。很多新手看到KDJ金叉就冲进去,结果往往是“接盘在半山腰”。 底层逻辑:大趋势压制小波动 当MACD****双线长期压制在零轴下方,且完全没有拐头向上的动能时,此时的KDJ金叉就是典型的“诱多陷阱”。 专家警示: 在这种背景下,KDJ的金叉仅仅代表股价在崩塌过程中的“短期虚假修复”或技术性抽血。由于MACD作为趋势主轴依然向下,这种微弱的反弹根本无力扭转大局。在职业选手的眼中,这种没有“大势”支撑的信号,入场风险极高,属于典型的“火中取栗”。 果断离场:卖在深调前,这才是职业选手的逃顶本领 在市场中,会买的是徒弟,会卖的才是师傅。利用“龙虎组合”,我们能精准识别深度调整的开端。 离场场景设定(无条件执行): 场景一:同步共振死差。 无论当前股价多高,一旦MACD与KDJ在同一区间同步形成死差,必须果断卖出,哪怕卖错也要先出来,绝不心存幻想。 场景二:弱势区域死差。 如果MACD本身就处于零轴下方的弱势区,此时KDJ哪怕单独走出死差,也必须及时离场。 行动建议: 这两个信号的出现,大概率预示着市场将开启一轮深度调整**。在风险面前,职业选手的第一本能永远是保住本金,而非贪恋最后那点碎肉。 总结与反思:在投资路上少踩认知的坑 交易不是赌博,而是基于“资金运行逻辑”的深度拆解。通过MACD与KDJ的组合,我们学会了利用“大趋势”为“小波动”定性,在杂乱无章的盘面中,剥离出真正的确定性。 最后留给各位一个启发性的思考: 在你的交易系统中,你是倾向于听从“灵敏”的警报去抢跑,还是愿意多一点耐心,等待“稳健”的趋势确认? 理解指标背后的哲学冲突与共生,是你从亏损散户迈向成熟投资者的必经之路。
浏览42
评论0
收藏0
用户头像sh_***174w0d
2026-08-14 发布
引言:揭开“成交量”的迷雾 “新手看价,老手看量。”在波谲云诡的股市中,很多投资者最感到困惑的莫过于:为什么有时候放量反而大跌,缩量却能一路长虹?这种常见的“量价背离”往往让缺乏经验的股民在关键时刻掉队,甚至在高位站岗。 其实,成交量是主力在盘面上唯一无法隐藏的真实足迹。它是识别突破真伪、洞察主力意图的终极底牌。想要从“韭菜”进阶为专业投资者,就必须明白成交量的核心价值在于关键价位的确认,而非单纯数字的增减。 今天,我将结合多年的实战经验,把复杂的成交量逻辑浓缩为四句口诀,带你精确认清市场的起伏真相。 口诀一:突破前后看量,好钢要用在刀刃上 在面临压力位突破的关键时刻,成交量的分布必须符合严密的先后逻辑。 “好钢要用在刀刃上。” 深度分析: 所谓的“刀刃”,就是股价临近前期高点等关键压力区间的那个点位。当股价冲击该区间时,理想的状态是成交量持续递增。这不仅仅是为了消化上方的套牢盘,更是为了在充分换手中“吸引新进看多资金”,形成合力。 一旦放量冲破“刀刃”,后续如果走出“缩量上涨”的行情,反而是极佳的信号。为什么突破后缩量更好?因为这意味着在关键位已经完成了充分的筹码交换,该位置的抛压已大幅减轻,多头资金达成了高度的共识。这种“资金共识统一”的状态,预示着上涨趋势具备极强的延续性。 但跨过这道线之后,真正的审判才刚刚开始。很多投资者往往就在这个阶段被主力*“洗”*了出去。 口诀二:突破后的量能审判——缩量延续,放量警惕 股价跨越压力位后,成交量的表现就像是一面照妖镜,能立刻显现出涨势的成色。 **●**缩量上涨还能涨: 股价创出新高但量能并未同步放大,甚至持续缩量。这说明上方几乎没有抛压,筹码高度锁定。这种形态往往代表个股的短线爆发力最强。 **●**放量上涨多观望: 如果是在底部启动区域,放量是健康的。但若股价已在拉升后的高位再次爆出巨量,这往往是“动能衰竭”或“筹码松动”的信号。这可能是主力在进行高位洗盘,甚至是变相出货。此时切勿盲目追高,短期大概率会陷入震荡甚至直接回落。 **●**放量滞涨要撤退: 股价在高位维持或波动,成交量放出巨量,股价却始终无法刷新阶段新高。这是典型的量价背离,属于高位见顶的危险信号。遇到这种“换手虽大却不涨”的情况,必须果断避险。 口诀三:真假突破的试金石——无量突破多为假 很多投资者看到“创新高”就兴奋,却忽略了支撑新高的基石是否稳固。 核心逻辑: 关键压力位必须匹配对应的量级。 这是一个硬性的能量守恒原则。 如果个股在冲击前期高点时,没有放出近期的高量,而是表现得“轻轻松松”,无量就创出了新高,这种突破极度危险。这种“轻松”往往意味着主力并没有通过真金白银去消化阻力,根基不稳的突破大都会演变成冲高回落的陷阱。只有在抵达关键位时伴随同步放量,一举冲破阻拦,才是被市场认可的“有效真突破”。 口诀四:警惕无端放量陷阱——非关键位的放量必有猫腻 主力经常利用成交量的放大来人为制造热度,从而引诱散户入局。 要点阐述: 我们要坚持一个基本原则:放量应当出现在阻力位。如果远离压力位却莫名其妙地放量,那么**“无端放量必有猫腻”**。 在下跌趋势中,股价如果还没触及关键阻力区,就突然收出几根伴随巨量的大阳线,这通常不是反转。这种行为往往是因为“多头力度偏弱”,主力不得不通过“自导自演”的对倒行为来制造诱多陷阱。只要放量出现在无关紧要的非关键价位,就必须防范主力在大规模砸盘前的最后“闪存”。 结语:从认知误区走向盈利逻辑 学习成交量的本质,是为了让我们从单纯的“看数字”进阶到“看逻辑”。成交量的价值不在于它的大小,而在于它是否出现在了该出现的地方。只有理解了量价背后的资金博弈,你才能在市场的迷雾中,一眼识别出哪些是真机会,哪些是温柔的陷阱。 行动号召: 回顾你最近的一次买入操作,那次突破时的成交量是否符合“好钢用在刀刃上”的逻辑?如果当时出现了“无端放量”,你是否成功避开了陷阱?欢迎在复盘时重新审视。
浏览43
评论0
收藏0
用户头像sh_****559rtx
2026-08-14 发布
在同花顺量化社区,我们经常看到做外汇的朋友讨论策略回测与实盘不一致,尤其是涉及跨周末、跨交易日的品种。我们团队也在这个问题上花了不少时间,最终定位到Tick数据边界处理。本文分享我们的处理方案,希望对同样用实时外汇API做量化的朋友有帮助。 一、回测结果漂移的根源 我们在做外汇行情数据处理时,遇到过这样一个问题:同一套交易策略,在不同时间段测试时结果差异明显。刚开始我们一直在检查指标计算逻辑,甚至重新验证了策略参数,但后来发现真正影响结果的是Tick数据跨交易日拼接的问题。 外汇市场不像股票市场一样有明确的每日开盘和收盘,但行情数据在不同交易时段之间依然存在明显变化。特别是在周末休市之后重新开盘,或者欧美市场交接时段,价格可能出现快速变化。如果实时外汇API获取的Tick数据没有正确处理交易日边界,就容易导致K线异常、指标偏差,甚至影响策略判断。 二、行情数据在交易日边界的表现 很多时候,Tick数据看起来只是简单的一条条报价记录,只需要按照时间排序即可。但真正用于分析时,时间连续并不代表行情连续。例如周五纽约市场结束后,到周一亚洲市场重新开盘,中间会存在较长时间没有交易数据。新的交易周开始时,市场可能因为消息、流动性变化等因素出现价格跳空。 这时候如果程序直接把两个时间段的数据连接起来,可能会把周五最后价格和周一第一个价格之间的变化,当成正常行情波动。 时间阶段 数据特点 周五收盘前 流动性逐渐降低,Tick减少 周末期间 没有有效交易数据 周一开盘后 新报价出现,可能产生跳空 这种情况对于分钟K线影响还比较明显,如果进一步计算均线、波动率或者趋势指标,误差会继续放大。回测中如果出现这种误差,策略的收益曲线和回撤都会被扭曲。 三、我们如何修复数据边界 我们现在处理外汇Tick数据时,会先解决时间问题,再进行价格计算。不同实时外汇API返回的时间字段可能存在差异,有些使用UTC时间,有些使用交易市场时间。如果直接混合使用,很容易在跨日时出现判断错误。 比较稳定的方式是统一时间标准。接收到Tick数据后,先转换成UTC格式保存,生成K线或者分析行情时,再根据需要转换成目标时区。这样做可以避免夏令时变化、地区时间差异对数据造成影响。 按交易日划分数据再生成K线,是我们目前比较稳定的做法。以前我们会直接把所有Tick放在一起计算周期数据,后来发现这种方式在跨交易日场景下容易出问题。现在的流程是: 对Tick时间进行统一格式转换; 按UTC时间排序; 判断日期变化; 标记新的交易日; 分别生成对应周期K线。 这样可以让每个交易日的数据保持独立,避免隔夜价格变化影响当天行情统计。对于回测来说,这意味着每个交易日的K线起点不会包含前一天的隔夜波动,信号也更干净。 四、实时Tick接入与时间转换 在实时行情场景中,我们更倾向于使用WebSocket获取数据。相比不断请求接口,WebSocket更适合连续变化的Tick行情。以 AllTick API 为例,我们会通过WebSocket订阅实时行情,接收到数据后先处理时间字段,再进入K线计算流程。 import websocket import json from datetime import datetime, timezone def on_message(ws, message): data = json.loads(message) if data.get("symbol") == "EURUSD": timestamp = data.get("timestamp") utc_time = datetime.fromtimestamp( timestamp / 1000, tz=timezone.utc ) price = data.get("price") print( "time:", utc_time, "price:", price ) def on_open(ws): request = { "action": "subscribe", "symbol": "EURUSD", "type": "tick" } ws.send(json.dumps(request)) ws = websocket.WebSocketApp( "wss://api.alltick.co/ws", on_open=on_open, on_message=on_message ) ws.run_forever() 这段代码主要处理的是时间标准化,而不是简单获取价格。只有保证每条Tick的时间位置准确,后续生成的K线和策略信号才更可靠。 五、回测与实盘都要注意的细节 实际运行过程中,有几个问题比较容易被忽略: 周末数据间隔需要单独判断。周五最后一条Tick和周一第一条Tick之间的时间差很大,这并不是普通行情波动。 交易时段不同,Tick数量也会明显变化。欧美活跃时间行情更新频繁,而部分时段数据较少,如果直接计算短周期指标,可能会产生异常结果。 数据缺失也是需要关注的问题。如果某段时间没有收到Tick,程序需要判断这是市场低活跃,还是数据连接异常。 六、社区小结 处理外汇行情数据一段时间后,我们发现真正影响分析结果的,往往不是复杂的指标公式,而是这些基础数据细节。实时外汇API提供的是连续行情数据,但如何理解这些数据,需要结合市场交易时间、时间戳规则以及交易日划分。跨交易日拼接并不是简单地把数据连接起来。提前做好时间统一、交易日判断和异常间隔检测,才能让后面的回测和实时分析更加稳定。对于外汇量化场景来说,隔夜跳空属于市场正常现象,关键在于数据处理方式是否能够正确识别它。希望这篇分享对大家的回测和实盘有所帮助。
浏览25
评论0
收藏0
用户头像sh_**772oqg
2026-08-14 发布
一、研究背景与通用数据管线固有缺陷 在多标的 A 股策略回测、日内高频交易模型研发过程中,多数研究者搭建的 Tick 采集管线仅聚焦正常交易时段数据采集,未针对交易所异动临停场景设计适配逻辑。当个股因短期价格异常波动触发临时停牌,实时 Tick 数据流会直接中断;待标的复牌,现有程序缺少标准化判定逻辑,无法自动锁定行情接口恢复推送的精确时间边界,进而衍生出多重模型失真问题:复牌集合竞价首批 Tick 漏采集、批量回测数据集出现持续性时序断层、自动化交易模型误判市场无成交而触发风控拦截。 早期主流处理方式为人工对照行情终端记录时间戳,但人工记录存在数秒级时序偏移,无法满足高频量化、高精度历史仿真对时序对齐的硬性要求。基于多套云端采集管线、离线回测项目的复盘调试经验,本文梳理一套无人工干预的自动化时点解析框架,适用于各类自建量化数据采集与策略仿真体系。 在多组数据源对比测试后,总结通用行情接口在临停周期内存在三类结构性数据短板,也是复牌恢复时点识别失真的核心诱因: 停牌周期无独立交易状态标识:接口仅停止推送成交数据,未通过专用字段区分 “交易所规则停牌” 与 “网络链路中断”,模型无法自主判断数据流中断成因; 缺失交易所官方复牌基准时间戳:普通接口仅返回单笔成交报价时间,不配套交易所统一发布的复牌基准时序,长期回测会产生系统性时序基准偏移; 多标的并行采集时序无序:批量监控数十只 A 股标的时,各品种临停、复牌时点相互错开,通用接口无全局时序排序机制,批量采集程序极易出现数据前后错位、样本匹配失效。 为消除该类时序识别偏差,本次研究统一作为底层行情数据源,接口原生输出交易所标准化交易状态标签与毫秒级官方时间戳,从数据源头补齐临停场景所需的识别元数据。 WebSocket 多标的订阅基础可运行代码 import websocket import json # 内存缓冲区:存储个股Tick时序、官方时间戳、交易状态 tick_buffer = {} def msg_receive(ws, raw_info): tick_info = json.loads(raw_info) stock_code = tick_info.get("symbol") trade_ts = tick_info.get("official_ts") market_status = tick_info.get("trade_state") tick_buffer[stock_code] = {"ts":trade_ts,"state":market_status} def sub_init(ws): sub_body = json.dumps({"action":"subscribe","symbols":["600030","000001"],"type":"tick"}) ws.send(sub_body) if __name__ == "__main__": ws_link = websocket.WebSocketApp("wss://api.alltick.co/ws",on_open=sub_init,on_message=msg_receive) ws_link.run_forever() 该采集脚本算力占用极低,可长期部署于云端算力节点持续运行,依托trade_state字段区分停牌、复牌状态,通过official_ts字段锁定行情推送恢复基准时点,是多标的时序采集体系的基础底层模块。 二、双层标准化校验判定模型(适配时序存储与策略仿真架构) 依托行情源内置标准化元数据字段,构建轻量化双层时序校验逻辑,全程无需人工介入,可直接嵌入 Tick 采集、离线批量回测、自动化交易仿真全链路: 第一层:交易状态字段基础判定规则 持续解析 Tick 数据包内trade_state标识,当字段切换为resume_trade的首条 Tick 附带的official_ts,即为交易所官方定义的行情推送恢复基准时间;若字段长期保持suspend,则判定标的处于临停静默周期,跳过复牌时序校验流程。 第二层:滑动窗口时序连续性二次校验 全部 Tick 时间戳统一写入时序数据库持久存储,配置固定长度滑动窗口做交叉校验:仅当复牌基准时点后连续捕获 3 笔无时间间隙的完整 Tick 样本,才判定行情数据流完全恢复推送,过滤复牌瞬时补发的延迟历史零散数据,规避模型误判恢复时点。 整套判定逻辑计算开销极小,不会占用大量算力资源,可分层嵌入数据采集预处理模块、回测数据清洗模块、实盘模拟风控模块,适配不同复杂度的量化研究任务。 三、动态时点识别框架在量化体系中的两大核心落地价值 依托双层校验逻辑实现的临停恢复时点自动识别体系,主要解决两类量化研究场景的核心痛点,优化回测真实性与策略运行稳定性: 日内高频自动化交易仿真优化 模型读取精准复牌基准时间后,自动解除临停阶段触发的风控限制,完整捕获复牌集合竞价 Tick 样本,完整捕捉短线资金异动特征;同时在停牌静默期暂停冗余循环接口请求,降低带宽资源消耗与接口调用配额占用。 多标的批量离线回测数据标准化治理 批量历史回测执行阶段,程序依据复牌官方时间戳自动分割临停区间与常规交易区间,向时序日志库写入区间分界标记,彻底修复异动停牌带来的数据时序断层,大幅缩小仿真结果与真实市场运行状态的偏差,提升回测结论参考价值。 四、量化研究落地总结 完成整套临停时序识别体系落地后可得出客观结论:多数量化研究者研发重心集中于价格、成交量等显性行情指标,容易忽略临停、复牌这类特殊交易时段的数据治理架构设计。若底层行情接口缺少标准化交易状态标识、交易所基准时间戳,很难通过轻量代码实现稳定、无偏差的复牌时点自动识别。 将带完整元数据的行情接口与双层时序校验架构结合,可完全替代人工时序记录操作,系统性修复异动停牌引发的数据失真问题,同步提升高频策略仿真、多标的批量回测两类研究场景的数据精度与程序长期稳定运行能力。 研究交流提问 各位在搭建多标的 A 股时序采集管线、开展大规模批量回测实验时,是否遇到过个股临停后复牌时序识别偏差、批量标的数据错位、自动化模型误触发风控等工程问题?欢迎交流对应的排查思路与管线优化方案。
浏览32
评论0
收藏0
用户头像sh_*219t3e
2025-09-26 发布
大家好,我想和大家分享一个我最近开发的项目——一款面向量化交易的 AI 智能助手工具网站。它可以帮助大家快速生成高质量、可直接复制运行的量化策略代码,无论你是量化小白还是策略开发者,都能从中受益。 核心亮点: 1.多平台支持:目前已支持 PTrade、QMT、miniQMT、聚宽等,并计划不断扩展更多平台。 2.策略生成高效:用户只需选择平台并输入策略想法,AI 即可生成可运行的量化策略代码。 3.快速入门与优化: • 对量化小白:轻松生成可直接运行的策略,快速上手交易。 • 对策略开发者:帮助完善、优化已有策略,节省开发时间。 • 对文档需求者:可作为量化平台的 API 文档问答机器人,方便查询和使用。 4.业内首创:这是首个面向多平台的量化交易 AI 助手,解决了现有 Deepseek 或 Trae 等 AI 工具因缺乏平台知识库而生成代码无法运行的问题。 使用方式:登录 → 选择你使用的平台 → 输入策略想法 → 生成可运行的策略代码。 我希望这个工具能帮助大家更高效地进行策略开发和量化交易,也欢迎大家在帖子里分享使用体验和建议。 网站链接:https://iris.findtruman.io/ai/tool/ai-quantitative-trading/ 如果大家有任何问题或功能需求,也可以在帖子里留言,我会持续优化和更新,让它成为量化交易领域最实用的 AI 助手!
浏览6394
评论91
收藏3
用户头像mx_****zqklr
2026-08-14 发布
📌 摘要 / 快速解答 本文手把手教你用 Python 实现 “双均线金叉 + RSI 超卖” 选股策略。核心逻辑:5日均线上穿20日均线且RSI(14)低于30时触发买入信号。数据获取使用 QuantDash —— 一款原生支持 Pandas、无需攒积分、自动前复权的量化数据 API。整套代码可直接在 Jupyter Notebook 或本地 Python 环境运行,30行搞定选股扫描。 一、为什么传统方式写选股策略这么累? 混聚宽社区的老哥应该都懂—— 痛点一:数据源不稳定。之前用 AkShare 写策略,今天跑得好好的,明天接口就报错。回测到一半中断,心态直接炸裂。 痛点二:积分限制。有些平台要攒积分才能拿日线数据,新手连基础数据都拿不到,更别提写策略了。 痛点三:复权数据清洗麻烦。除权除息导致股价“假暴跌”,均线信号全乱。要自己下载除权因子表手动算,遇到多次分红送股,累积因子极易算错。 痛点四:跨市场代码不统一。想同时测 A 股和港股?600519.SH vs 0700.HK 还能接受,但遇到美股 AAPL 又是一套规则。写个选股器光适配代码后缀就要几十行 if/else。 后来我发现了 QuantDash,这些问题基本一键解决。 二、解决方案对比 对比维度 传统/竞品方案 (Tushare/AkShare/手动爬虫) QuantDash 解决方案 数据稳定性 经常报错/接口失效/易被封 服务端稳定支持,毫秒级响应 使用门槛 繁琐积分限制/需手动清洗 无积分门槛,pip install 即用 跨市场支持 代码后缀不统一/难以兼顾美港股 统一后缀.SH/.SZ/.US/.HK 复权处理 需手动下载除权因子表计算 adjust="forward" 一行搞定 数据格式 需反复转换数据类型 原生返回标准 Pandas DataFrame 三、Python代码实战(可直接复制运行) # ============================================================ # 双均线 + RSI 选股策略 - 自动化选股公式(聚宽风格实战版) # 策略逻辑:MA5金叉MA20 + RSI(14) < 30 => 买入信号 # 数据源:QuantDash (https://quantdash.net/) # GitHub开源:https://github.com/quantdash-net/QuantDash # ============================================================ # 1. 安装依赖 # pip install quantdash pandas pandas_ta from quantdash import QuantDash import pandas as pd import pandas_ta as ta # 一键计算技术指标[reference:46] # 2. 初始化客户端 # 免费获取 API Key:https://quantdash.net/dashboard/keys/ qd = QuantDash(api_key="your-api-key-here") # 3. 定义股票池(可替换为你的自选股) SYMBOLS = [ "600519.SH", # 贵州茅台 "000001.SZ", # 平安银行 "000858.SZ", # 五粮液 "600036.SH", # 招商银行 "002415.SZ", # 海康威视 "000333.SZ", # 美的集团 "600276.SH", # 恒瑞医药 "601318.SH", # 中国平安 ] # 4. 批量获取前复权日K线[reference:47] dfs = qd.klines.batch( symbols=SYMBOLS, period="1d", count=120, # 最近120个交易日 adjust="forward", # 前复权-比例复权[reference:48] to_dataframe=True, show_progress=True ) # 5. 选股筛选函数 def check_buy_signal(df: pd.DataFrame) -> dict: """ 检查单只股票是否满足买入条件 使用 pandas_ta 简化指标计算[reference:49] """ # 排序 df = df.sort_values("trade_date") # 使用 pandas_ta 一键计算均线和 RSI[reference:50][reference:51] df["MA5"] = ta.sma(df["close"], length=5) df["MA20"] = ta.sma(df["close"], length=20) df["RSI14"] = ta.rsi(df["close"], length=14) # 最新和前一天数据 latest = df.iloc[-1] prev = df.iloc[-2] # 金叉判断:今天MA5 > MA20 且 昨天MA5 <= MA20[reference:52] golden_cross = (latest["MA5"] > latest["MA20"]) and (prev["MA5"] <= prev["MA20"]) # RSI超卖[reference:53] oversold = latest["RSI14"] < 30 return { "name": latest.get("name", ""), "close": latest["close"], "MA5": latest["MA5"], "MA20": latest["MA20"], "RSI14": latest["RSI14"], "golden_cross": golden_cross, "oversold": oversold, "signal": golden_cross and oversold } # 6. 批量扫描 results = [] for sym, df in dfs.items(): if df is not None and len(df) > 30: try: r = check_buy_signal(df) r["symbol"] = sym results.append(r) except Exception as e: print(f"⚠️ {sym} 异常: {e}") # 7. 展示结果 df_result = pd.DataFrame(results) print("\n" + "="*70) print("📈 双均线(MA5/MA20) + RSI(14) 选股扫描结果") print("="*70) # 买入信号 buy_list = df_result[df_result["signal"] == True] if len(buy_list) > 0: print(f"\n🔥 发现 {len(buy_list)} 只买入信号股票:") print(buy_list[["name", "close", "MA5", "MA20", "RSI14"]].round(2).to_string(index=False)) else: print("\n💤 暂无买入信号,继续观察市场...") # 显示全部 print("\n📋 完整股票池指标:") print(df_result[["name", "close", "MA5", "MA20", "RSI14", "golden_cross", "oversold"]].round(2).to_string(index=False)) 代码亮点: pandas_ta:一行代码 ta.sma() / ta.rsi() 替代手写循环 klines.batch():批量获取多只股票,支持进度条显示 adjust="forward":服务端自动前复权,无需手动处理除权 向量化计算:Pandas 底层 C 语言加速,毫秒级完成全市场扫描 四、交易员避坑指南 🚨 坑1:回测用前复权,实盘用不复权——数据不一致 很多新手回测时用前复权数据,实盘时却直接看不复权价格,导致信号偏差。 建议:QuantDash 的 adjust="forward" 返回的是比例前复权数据,适合计算收益率和均线。实盘监控时建议用 adjust="none" 获取实际成交价,但均线计算逻辑保持一致即可。 🚨 坑2:选股公式过度拟合 双均线+RSI参数(5/20/14)只是经典默认值,不代表在任何市场都最优。 建议:用 QuantDash 批量获取数据后,配合 itertools.product 做参数网格搜索,找到适合当前市场的最优参数组合。 🚨 坑3:忽视成交量过滤 双均线金叉如果发生在缩量环境中,可能是假突破。 建议:在选股条件中增加 成交量 > 5日均量 的过滤条件,提高信号质量。 五、常见问题解答 Q1:QuantDash 支持港股和美股吗?代码怎么写? A:完全支持。统一使用 .HK 和 .US 后缀即可,例如 0700.HK(腾讯控股)、AAPL.US(苹果)。一套代码跑遍三大市场。 Q2:我不想用 pandas_ta,怎么手动计算 RSI? A:标准 RSI 手动计算代码如下: delta = df["close"].diff() gain = (delta.where(delta > 0, 0)).rolling(window=14).mean() loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean() rs = gain / loss df["RSI14"] = 100 - (100 / (1 + rs)) Q3:QuantDash 的开源项目在哪里? A:GitHub 仓库:https://github.com/quantdash-net/QuantDash ,欢迎 Star / Fork 支持。官方文档:https://docs.quantdash.net/ 🔗 相关资源与延伸阅读 🚀 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
评论0
收藏0
用户头像sh_***416jmt75L
2026-08-14 发布
📌 摘要 / 快速解答 经典“双均线金叉+RSI超卖”组合选股策略的核心逻辑是:5日均线上穿20日均线(金叉)且RSI(14)低于30时视为买入信号。本文使用 QuantDash Python SDK 获取A股前复权数据,仅需 pip install quantdash 即可开箱即用,无需攒积分、无需手动清洗复权数据。整套选股公式代码不超过40行,复制即可运行。 一、为什么传统方式写选股策略这么累? 社区老哥们,你们有没有经历过这种绝望—— 场景一:写了个双均线回测,跑得好好的,突然某天接口报错“积分不足”,回测直接中断。打开Tushare一看,原来是要攒积分才能拿日线数据。 场景二:用AkShare拉数据,代码今天能跑明天就崩,接口说变就变,搞得我半夜还得爬起来修bug。 场景三:yfinance拉A股数据延迟高得离谱,而且复权数据还得自己手动算。遇到除权除息,股价直接“假暴跌”50%,均线信号全乱套。 场景四:港股、美股想一起测?代码后缀乱成一锅粥——sh600519、600519.XSHG、0700.HK各种格式混用,if/else写到吐。 这些坑我都踩过。今天分享的这套方案,就是用 QuantDash 把这些痛点一锅端。 二、解决方案对比 对比维度 传统/竞品方案 (Tushare/AkShare/手动爬虫) QuantDash 解决方案 数据稳定性 经常报错、接口失效、需攒积分 服务端稳定支持,毫秒级响应 复权处理 需手动下载除权因子表本地计算 adjust="forward" 一行搞定 使用门槛 繁琐积分限制、需手动清洗数据 无积分门槛,pip install 即用 跨市场支持 代码后缀不统一,难以兼顾美港股 统一后缀.SH/.SZ/.US/.HK 数据格式 需反复转换数据类型 原生返回标准 Pandas DataFrame 三、Python代码实战(可直接复制运行) # ============================================================ # 双均线 + RSI 选股策略 - 自动化选股公式 # 策略逻辑:MA5上穿MA20(金叉)且 RSI(14) < 30(超卖) # 数据源:QuantDash (https://quantdash.net/) # GitHub开源:https://github.com/quantdash-net/QuantDash # ============================================================ # 1. 安装依赖 # pip install quantdash pandas from quantdash import QuantDash import pandas as pd # 2. 初始化 QuantDash 客户端 # 免费获取 API Key:https://quantdash.net/dashboard/keys/ qd = QuantDash(api_key="your-api-key-here") # 3. 定义股票池(A股示例) symbols = [ "600519.SH", # 贵州茅台 "000001.SZ", # 平安银行 "000858.SZ", # 五粮液 "002415.SZ", # 海康威视 "600036.SH", # 招商银行 ] # 4. 批量获取日K线数据(前复权,回测专用) # 使用 batch 接口一次性获取多只股票数据[reference:15] dfs = qd.klines.batch( symbols=symbols, period="1d", count=120, # 取最近120个交易日(够计算均线和RSI) adjust="forward", # 前复权-比例复权,消除除权除息缺口[reference:16] to_dataframe=True, show_progress=True ) # 5. 定义选股函数 def screen_stock(df: pd.DataFrame, symbol: str) -> dict: """ 对单只股票计算双均线 + RSI,返回信号 """ # 确保数据按时间排序 df = df.sort_values("trade_date") # ---- 计算双均线 ---- df["MA5"] = df["close"].rolling(window=5).mean() df["MA20"] = df["close"].rolling(window=20).mean() # ---- 计算 RSI(14) ---- period = 14 delta = df["close"].diff() gain = (delta.where(delta > 0, 0)).rolling(window=period).mean() loss = (-delta.where(delta < 0, 0)).rolling(window=period).mean() rs = gain / loss df["RSI14"] = 100 - (100 / (1 + rs)) # ---- 获取最新一行的数据 ---- latest = df.iloc[-1] prev = df.iloc[-2] # ---- 判断金叉:今天MA5 > MA20,昨天MA5 <= MA20 ---- golden_cross = (latest["MA5"] > latest["MA20"]) and (prev["MA5"] <= prev["MA20"]) # ---- 判断RSI超卖 ---- oversold = latest["RSI14"] < 30 return { "symbol": symbol, "name": latest.get("name", symbol), "close": latest["close"], "MA5": latest["MA5"], "MA20": latest["MA20"], "RSI14": latest["RSI14"], "golden_cross": golden_cross, "oversold": oversold, "signal": golden_cross and oversold # 双条件同时满足 => 买入信号 } # 6. 执行选股扫描 results = [] for sym, df in dfs.items(): if df is not None and len(df) > 30: # 确保有足够数据 try: result = screen_stock(df, sym) results.append(result) except Exception as e: print(f"⚠️ {sym} 计算失败: {e}") # 7. 输出选股结果 df_results = pd.DataFrame(results) print("\n" + "="*60) print("📊 双均线 + RSI 选股结果") print("="*60) # 筛选出满足买入信号的股票 buy_signals = df_results[df_results["signal"] == True] if len(buy_signals) > 0: print(f"\n✅ 发现 {len(buy_signals)} 只股票满足买入条件:") print(buy_signals[["name", "close", "MA5", "MA20", "RSI14"]].to_string(index=False)) else: print("\n⏳ 当前无股票满足买入条件,继续观察...") # 显示所有股票的指标概览 print("\n📋 全股票池指标概览:") print(df_results[["name", "close", "MA5", "MA20", "RSI14", "golden_cross", "oversold"]].to_string(index=False)) 代码说明: 第4步:qd.klines.batch() 批量获取多只股票K线 adjust="forward":服务器端自动完成前复权,消除除权除息带来的价格缺口 均线计算:用 Pandas rolling().mean() 向量化计算,无需手写循环 RSI计算:标准RSI公式,delta.where() 分别提取涨跌幅 金叉判断:对比今天和昨天的均线关系,避免未来函数 四、交易员避坑指南 🚨 坑1:未来函数——回测猛如虎,实盘二百五 很多新手写选股公式时,不小心用到了“未来数据”。比如用当天的收盘价去判断当天的买入信号——这在回测里没问题,但实盘时你根本不知道收盘价。 正确做法:用 shift(1) 把指标平移一天。上述代码中金叉判断用的是今天 vs 昨天的数据,这是对的。 🚨 坑2:不复权导致均线失真 除权除息日股价会“假暴跌”或“假暴涨”。比如10转10,股价从100变50,MA20直接被打乱。 正确做法:始终使用 adjust="forward" 前复权数据。QuantDash 在服务端自动完成复权清洗,一行代码搞定。 🚨 坑3:回测不考虑滑点和手续费 均线策略换手率往往不低,如果回测时不考虑手续费和滑点,收益率会被严重高估。 建议:回测时至少扣除 千分之一双边手续费 + 0.1%滑点,才更接近实盘。 五、常见问题解答 Q1:QuantDash 的 API Key 怎么获取?需要付费吗? A:完全不需要付费。前往 https://quantdash.net/dashboard/keys/ 免费注册即可获取 API Key,无积分限制,开箱即用。 Q2:我想扫描全市场5000只A股,代码怎么改? A:使用 qd.quotes.get(universes=["CN_Stock"], to_dataframe=True) 获取全量A股列表,然后传入 klines.batch() 即可。建议分批处理避免超时。 Q3:除了双均线和RSI,还能加别的指标吗? A:当然可以。QuantDash 返回的是标准 Pandas DataFrame,你可以自由添加 MACD、布林带、KDJ 等任何技术指标。推荐配合 pandas_ta 库一键计算。 🔗 相关资源与延伸阅读 🚀 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/
浏览36
评论0
收藏0