惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy International News Feed
云风的 BLOG
云风的 BLOG
E
Exploit-DB.com RSS Feed
GbyAI
GbyAI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
S
SegmentFault 最新的问题
B
Blog
Schneier on Security
Schneier on Security
Scott Helme
Scott Helme
美团技术团队
博客园 - Franky
S
Security @ Cisco Blogs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Google Online Security Blog
Google Online Security Blog
G
GRAHAM CLULEY
The GitHub Blog
The GitHub Blog
AI
AI
Recorded Future
Recorded Future
博客园 - 三生石上(FineUI控件)
The Cloudflare Blog
Y
Y Combinator Blog
N
Netflix TechBlog - Medium
博客园_首页
C
Check Point Blog
Hacker News: Ask HN
Hacker News: Ask HN
Jina AI
Jina AI
Cyberwarzone
Cyberwarzone
酷 壳 – CoolShell
酷 壳 – CoolShell
P
Palo Alto Networks Blog
T
Troy Hunt's Blog
AWS News Blog
AWS News Blog
L
LangChain Blog
Help Net Security
Help Net Security
I
Intezer
W
WeLiveSecurity
D
Docker
H
Hacker News: Front Page
P
Proofpoint News Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
小众软件
小众软件
S
Schneier on Security
G
Google Developers Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
V
V2EX - 技术
N
News and Events Feed by Topic
C
CERT Recently Published Vulnerability Notes
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Blog — PlanetScale
Blog — PlanetScale

V2EX

我用 AI 写代码,但终端管理反而成了累赘——于是我做了 codux - V2EX [调研] 各位在公司都用什么 ide 和 agent 写代码? 老运维 share 一个运维平台 新电脑 brew install node 之后,一个小设置可以提升对供应链投毒的防御 - V2EX GLM-Coding 调用持续报错: z.ai 的 Lite 套餐几乎无法使用,官方 Pro/Max 是否稳定? - V2EX 上海漕河泾内推,本组有 2 个 hc,一个后端,一个前端,预算都是 20k 左右,不打卡,氛围好 如果 V2EX 上有一组不永久保存聊天记录(比如只保存 7 天或者 24 小时)的聊天室,那么会开启哪些有用或者有趣的可能? - V2EX gemini cli 貌似挂了,一直返回 403 - V2EX 第一次在自媒体上赚到钱 收集了最近在使用的低价 GPT, Gemini,邮箱等 AI 会员的小店合集 讨论个大实话:现在企业还在说 AI 编程提效 20%, 30%的,真的太落后,没用懂 AI。因为包括很多前沿公司,已经狂奔到提效 200%-500%的情况 [招聘][远程][币安] 前端/后端/QA/iOS/Android 至少 3 年以上经验 目前有大量 HC 欢迎投递 Chatgpt Pro 用量用不完的可以开这些设置 面试的时候好像遇到钓鱼了,给各位避个坑 cursor 年续费 22 号到期, 自动续费是否还是老的计次套餐呢 - V2EX 被两件破事毁掉的一下午,琐碎的内耗消磨人的精力 使用 Planet 存储 Codex 的会话或者重要信息 - V2EX 如果业务部门领导不要你开发功能,而是要求你教会它用 claude code 开发功能,你会怎么做? 分享一个 MacOS 接绿联 CM818 USB 转 DP 转接器使用感受 - V2EX 我的 HR 朋友 10 年老 Java ,非全大专,大家帮忙看看简历 开源了一个 AI 口语练习工具,音素级发音评分,完全免费可自部署 V2EX 上有哪些你觉得很有趣、印象深刻的妹纸? 字节为啥不出个国内版 Vercel? 有在大马的朋友吗? 问个运营商问题 你们在有领导的公司大群发过的最大胆的消息是什么 公司裁员,目前没有工作。想试试摆摊,做一个移动鲜啤打酒车 我的硬盘 Memblaze Pblaze 5 Linux 下不识别,给 Linux 内核提交了补丁, AI 说有望被合并 - V2EX 只有我一个人觉得 codex 不好用? 做了个 AI + 真人专家监督的广告投放平台 Auxora, 7 个品牌跑出 6x ROAS 如何走出至亲的离世 Claude Web 端貌似 claude-opus-4-7 偷偷上了? 现在 Apple 开发者帳號應該是用哪个地区会更好? - V2EX 用回测筛选因子的一点经验分享 给女儿 vibe 了一个故事类的 app,做完发现,这类应用似乎上线难度极大? - V2EX 手机格式化 bitget 钱包没了,里面开通的银行卡还有机会拿到吗 - V2EX [送码] TransVoice - 我的第一款 App 上架啦!实时转写+翻译+字幕,会议听课好助手! PictureHub 高清摄影作品的画廊 Planet 的第一个使用 macOS 26 SDK 构建的 Insider 版本 20260416-1 - V2EX 成都二手房是不是在涨价,有点坐不住了 - V2EX claude 生态(skill mcp plugin)等 Studio Display XDR VESA 适配器脱落 有在用印度区 applestore 的大哥嘛,请教一下礼品卡去哪里买呢 - V2EX 我好像知道京东家政爆火的原因了 - V2EX 薅了公司的 a 家 api key,用机场 ip 做代理容易被封吗 如何在初期就识别 HR 在刷 KPI,没打算招你? [分享]精心打造一个 AI 编程知识库(算法/设计模式/提示词/Skills),助力程序员转型 港版 iPhone 在国内支持联通 5GA 吗?在广东用 想办港卡 AI 对 it 行业影响太大了 我做了个把照片变成 iOS 小组件贴纸的 App ChatGPT Pro 5x 套餐 量真的很足! I have found a method to directly generate advertising video materials using scripts 在小城市开个店,给人写软件,有前途吗 chrome 最新的 147 版直接卡爆炸了 - V2EX 为什么厂家不在 skill/mcp 这类的工具中塞广告呢?这样不是可以大赚嘛? minimax 真是脸都不要了,工作日下午 14:00 定时开启 529,脸都不要了。训练模型居然占用用户使用时间 外资非核心部门 vs 另一家外资的核心部门,该跳吗? iTad 标签 扩展 加小动作 ? - V2EX 去年 H200 能买,不让买是代替快出来了? - V2EX AI 赛事通 - 2026 年 4 月中国区新增 AI 竞赛和黑客松汇总 - V2EX V2EX › 登录 现在安卓开发都在做啥 - V2EX 浏览器插件 沉浸式翻译 是不支持自定义模型了吗? - V2EX Codex 里的 GPT5.4 也能降智?上午让它改两个问题,改了一个小时了, plus 额度用了一半了还是没改好,和前几天用的体感完全不一样。要它改的问题也不复杂。服了。 目前有使用 claude code 的收到人脸认证的吗 - V2EX 分享一个自己做的 Nginx 管理工具,实时请求动态预览!(无奈市面上实在找不到好用的,自己撸了个) - V2EX claude code 崩了么? 今天在反重力上用 claude 一点都不丝滑,有同样的感受吗? opencode 消息周知插件 今天 claude opus 和前两天比,质的飞跃 - V2EX 999 包月价? - V2EX 一个版本, 50 项更新:我们几乎重做了整个播放页 本地大模型多大显存够用? GOGDNS 一款简易的私人 DNS 服务器 - V2EX API key (GLM) 怎么使用 claude code desktop ? Claude 这样订阅有问题吗 - V2EX 帮我爸找回了一篇赛博兰亭集序 求推荐稳定、高性价比使用 Claude Opus 4.6 的渠道/平台 搞个云端 claude code 防止 封号 - V2EX 用 Claude 要实名了,内地用户怎么办? OpenAI Plus 和 Team 都缩水了吗 海外 Android 手机有什么好用的国内第三方应用市场推荐吗 - V2EX 把电脑伪装成电视,用 DLNA 投屏拿到视频号直播流地址 - V2EX claude 认证莫慌 北京互联网法院有什么攻略么?起诉北京智谱华章科技股份有限公司退款可行么? - V2EX Claude 开始引入身份验证 求 vscode 做笔记软件的插件推荐 - V2EX 讯飞星辰的 Coding Plan 如何? Anthropic 宣布在 Claude 平台推行身份验证机制 科普一下低价 gpt 是怎么来的 有没有长期关注 Claude 的朋友,我建了一个 Channel 自动抓取 Claude Team 的推文 啃了那篇 54 页的 Agent Harness 综述, 给大伙讲个省流版 现在那家的 coding plan 还能买到 是不是最近会有什么更聪明的大模型要发布了呀? 用多了 AI 后,有没有觉得 AI 生成的文章有很强的既视感? 如何 实践 Harness 工程? 今日份 GPT 5.4 笑话 如何建一个自己的号池,让 cursor 真正实现 token 自由 写了三个月 Agent Harness,我终于敢让 Claude Code 全自动写代码了
6 步选股 4 个坑 5 年 14 倍:"菜场大妈"策略拆解优化实录 - V2EX
hxj20061987 · 2026-06-15 · via V2EX

一、开篇:我,被大妈教育了

最近在聚宽社区翻到一个叫"菜场大妈"的策略,名字接地气,回测成绩还挺能打。今天来拆解一下它的核心逻辑,顺便做点优化。

花了不少时间研究量化,看文章、调参数、研究各种多因子模型,每天盯着 Alpha 信号、因子暴露、信息比率……然后呢?

年化跑不赢沪深 300 。

有一天我妈跟我说,她闺蜜在菜场摆摊,顺手买了几只"便宜的、但公司还在赚钱的"小股票放着,几年下来收益还挺好。

我当场沉默了三分钟。


大妈炒股的逻辑,其实就三条:

  1. 便宜——贵的我买不起,也不放心
  2. 有肉——不能是只讲故事的空壳子,得有真收入
  3. ——大公司牛人多,哪轮到我捡漏

听起来很土?但这三条,其实就是"小市值低价策略"的核心逻辑。


二、大妈的选菜秘籍

整个策略的核心思路,可以用一套"去菜场买菜"来解释。

第一步:扔掉烂菜叶子(基础过滤)

大妈第一眼看菜,先排除烂掉的、发霉的、一看就没法吃的

股票里的"烂菜叶子"就是:

  • ST 股票:名字前面贴了黄色标签,绝对不碰,看着便宜,全是坑
  • 退市边缘股:名字里带"退"的,大妈直接转身走人
  • 停牌股:菜摊今天关门,你掏钱也买不到
# 过滤 ST 及其他具有退市标签的股票
def filter_st_stock(stock_list):
    current_data = get_current_data()
    return [stock for stock in stock_list
            if not current_data[stock].is_st           # 不是 ST
            and 'ST' not in current_data[stock].name   # 名字里没有 ST
            and '*' not in current_data[stock].name    # 没有星号(*ST )
            and '退' not in current_data[stock].name]  # 没有退字

另外,科创板和北交所也不去——大妈不去高档精品超市,她就逛老菜市场,接地气,看得懂,买得放心。

# 过滤科创北交股票
def filter_kcbj_stock(stock_list):
    for stock in stock_list[:]:
        if stock[0] == '4' or stock[0] == '8' or stock[:2] == '68' \
           or stock[:3] == '300' or stock[:3] == '301':
            stock_list.remove(stock)
    return stock_list

第二步:检查有没有肉(基本面防雷)

光便宜不行,还得有真材实料

大妈挑肉的标准很简单:

  • 净利润必须大于 0——不赚钱的公司,买它干什么?
  • 营业收入大于 1 亿——连 1 个"小目标"都没有,别浪费咱的买菜钱
q = query(
    valuation.code,
    valuation.market_cap,
    income.np_parent_company_owners,  # 归母净利润
    income.net_profit,                # 净利润
    income.operating_revenue          # 营业收入
).filter(
    valuation.code.in_(stocks),
    valuation.market_cap.between(g.min_mv, g.max_mv),   # 市值区间
    income.np_parent_company_owners > 0,                 # 有真肉
    income.net_profit > 0,                               # 净利润也得正
    income.operating_revenue > 1e8                       # 营收过亿才算数
).order_by(valuation.market_cap.asc())                   # 市值从小到大排

这个筛选直接干掉了绝大多数"讲故事的仙股"。


第三步:大妈的极简审美——10 块以下才考虑

这是大妈最硬核的原则:

超过 10 块钱的菜,太金贵,不买。

# 过滤股价高于 10 元的股票
def filter_highprice_stock(context, stock_list):
    last_prices = history(1, unit='1m', field='close', security_list=stock_list)
    return [stock for stock in stock_list
            if stock in context.portfolio.positions.keys()
            or last_prices[stock][-1] <10]

原版策略过滤的是 9 元以上,我稍微放宽到 10 元——毕竟通货膨胀嘛,大妈也得跟上时代。


第四步:专挑边角料——市值最小的 4 只

经过前面三轮筛选,剩下的候选菜已经都是"便宜有肉的好货"了。

接下来怎么选?按市值从小到大排,挑最"边角料"的 4 只。

捡漏心理:专挑摊位最边角没人注意的那几样,够小、够便宜、胜在没人哄抬价格。

目标市值区间:10 亿到 100 亿之间(不能太小,太小容易跑路;不能太大,太大轮不到散户吃肉)。

g.stock_num = 4       # 最多买 4 只
g.min_mv = 10         # 最小市值 10 亿
g.max_mv = 1e8        # 最大市值 1000 亿(写法是万亿单位,实为 100 亿)

第五步:隔夜馊了,赶紧处理(卖出逻辑)

大妈有一条铁律:隔夜的菜不留。

这里对应的是"昨日涨停股"的处理:

这只股票昨天表现亮眼,涨停了!大妈开心,夸它新鲜。 今天一看,没连板,价格缩回来了。 大妈立刻:**"隔夜的,赶紧处理,换新鲜的来。"**

def check_limit_up(context):
    current_data = get_current_data()
    if g.high_limit_list:
        for stock in g.high_limit_list:         # 昨天涨停的票
            if current_data[stock].last_price \
               <current_data[stock].high_limit:  # 今天没继续涨停
                order_target(stock, 0)            # 清仓
                g.just_sold.append(stock)         # 记录已卖,不二次买入
    # 卖了之后,如果持仓不够,再候补买入
    position_count = len(context.portfolio.positions)
    if g.stock_num > position_count and position_count != 0:
        my_Trader(context)
        psize = context.portfolio.available_cash / (g.stock_num - position_count)
        for s in g.choice:
            if s not in context.portfolio.positions and s not in g.just_sold:
                order_value(s, psize)
                if len(context.portfolio.positions) == g.stock_num:
                    break

注意先卖后买,这是个细节优化——原版是先买后卖,导致卖掉的票要隔天才能补仓,白白空仓一天。


第六步:一周去一次菜场(换仓节奏)

大妈不每天去菜场,那太累了。她每周一早上进一次城,买够就回家

run_weekly(my_Trader, 1, time='13:50')  # 每周第 1 个交易日,13:50 选股
run_weekly(go_Trader, 1, time='14:00')  # 每周第 1 个交易日,14:00 下单

每周换一次仓,频率不算高,也省手续费。大妈的核心竞争力之一,就是不天天折腾


三、翻车现场实录——代码比菜还难伺候

写策略的过程,踩了不少坑,挑几个有代表性的跟大家分享。

坑一:滑点是隐形摊位费

刚开始没设滑点,回测数据漂亮得一塌糊涂。

等我加上 FixedSlippage(0.02) 和真实手续费之后,收益率肉眼可见地往下掉。

set_slippage(FixedSlippage(0.02))
set_order_cost(OrderCost(
    close_tax=0.001,            # 印花税 0.1%(卖出才收)
    open_commission=0.0001,     # 买入佣金 0.01%
    close_commission=0.0005,    # 卖出佣金 0.05%
    min_commission=0.1          # 最低 5 毛
), type='stock')

这就是菜场的"摊位费":你看着菜很便宜,结果各种税费加起来,利润被切走一大块。

结论:纸面富贵不算数,扣完成本才是真收益。


坑二:提前钦定几只 ETF ,曲线漂亮到怀疑人生——这叫上帝视角,不叫量化

这个坑不是代码 bug ,是人的 bug 。

接手这个策略的时候,它已经配了一段"组合配置"的逻辑——在小市值股票之外,还额外指定了几只 ETF:

黄金 ETF( 518880 )、纳斯达克 ETF( 513100 )、芯片 ETF( 159995 )……

配置理由写得头头是道:分散化、降回撤、对冲 A 股风险……

一跑回测:2016 年到 2025 年,年化亮瞎眼,曲线好看得像 PPT 配图。

我当时觉得自己是天才。

然后仔细一看,冷汗下来了——

这几只 ETF 是谁选的?按什么选的?

黄金,2024 年大涨;纳斯达克,2023 年翻倍反弹;芯片,也有过自己的高光时刻……

这些都是已经发生的历史。策略里写死了"就买这几只",然后用历史回测来"验证"它们表现好——

这不是量化,这是开卷考试然后说自己考满分


把这几只硬编码的 ETF 全部剔除之后,换成动态筛选的逻辑——

收益率啪啪往下掉。

曲线一下子瘦了一大圈,以前那段"漂亮区间"直接垮掉一半。

这就是过拟合的最朴素版本:用上帝视角挑菜,当然买的全是好菜。但你在真实菜场里没有上帝视角,前一天猪肉涨价了你也不知道。

结论:回测数据越漂亮,越要多问一句"为什么"——是策略真的好,还是你亲手喂了它正确答案?


坑三:9:30 下单,大妈两手空空

这个坑藏得很深,或者说——回测系统藏得太好了

策略里有一段逻辑,要在 9:30 开盘第一分钟执行买卖:

run_daily(check_limit_up, time='9:30')

理论上完全合理——越早下单越好,抢先手嘛。

回测跑下来,成交记录里也都有,数据漂漂亮亮。

但如果一上 SHIPAN ,就尴尬了。

9:30 开盘的第一分钟,实际上是集合竞价刚刚结束的瞬间。行情数据还没稳定下发,API 还没完全就绪,大量股票这一秒钟根本拿不到有效的实时价格——

于是下单,要么直接报错,要么以 0 价格挂出去被拒单,总之:两手空空,什么都没买到。

回测里的 9:30 是"模拟的 9:30",数据是现成的,下单当然成功。 ******里的 9:30 是"真实的 9:30",数据还在飞,根本接不住。


改成 9:319:35 之后,下单终于正常了。

但收益往下掉了。

因为策略里有依赖"开盘价"的买卖判断,哪怕晚了 1~5 分钟,成交价就不一样了,有些单子该买的没买上,该卖的滑了点。

看起来只差几分钟,代入收益一算,差距比想象中大。

结论:回测的时间刻度是理想化的,****的第一分钟是混沌的。9:30 下单,在这个系统里就是一个幻觉。**


坑四:大妈不止损,一套套到认命

这是原版策略最让我不安的一个设计——它没有止损。

大妈的哲学是:买来的菜,就算有点蔫,也不扔。泡泡水,明天还能吃。

策略里只有两种卖出情形:

  1. 股票掉出候选池(市值涨太大、财务变差、变 ST 了)
  2. 昨天涨停今天没连板

跌了 10%?不管。跌了 20%?继续拿着。只要它还符合小市值条件,就一直持有。

极端行情一来,这个策略会被套得很难看。2020 年春节后复市那天,我看着日志:

[止损] 002112 三变科技 成本=6.94 现价=5.83 亏损=-16.0%,强制清仓
[止损] 600099 林海股份 成本=6.74 现价=5.65 亏损=-16.2%,强制清仓
[止损] 600493 凤竹纺织 成本=5.67 现价=4.77 亏损=-15.9%,强制清仓

等等,这是我加了止损之后的日志,亏损还是达到了 15%+。

原因很简单:跌停股票卖不掉。

止损单挂出去,市场全是卖盘没有买盘,当天根本成交不了。第二天继续跌停,继续挂单,继续成交不了—— 这就是"跳空"的残酷现实:止损线写的是 8%,真正止损的时候可能已经亏了 15%。

最后加了两个补丁才勉强解决:

  • g.stop_loss_set 记录已发止损单的股票,跌停时静默重试,不重复打日志
  • 止损后的股票本周不再买回,防止刚割肉就被自动补仓
g.stop_loss_ratio = 0.08    # 止损线 8%
g.stop_loss_set = set()     # 已发止损单,跌停未成交则次日重试

结论:止损写进代码只是第一步,跌停穿越才是真正的硬伤。极端行情面前,8%的止损线可能保不住你,但有和没有,差距还是很大。


四、最后说一句

折腾一圈之后,我发现我最初看不上的东西,反而是最难做到的。

量化圈有个通病:喜欢追求复杂。因子越多越好,模型越深越好,参数越精细越好。

但菜场大妈的策略只有三个筛选条件,逻辑三句话说完,参数五个以内,任何人看懂之后都能在脑子里复现一遍。

这就是它最宝贵的地方:逻辑清晰。

你知道它为什么买,你知道它为什么卖,你知道它会在什么情况下亏钱,你不会因为"这个信号我也说不清楚为什么"而在极端行情裂开。


说到稳定性,我的实际体感是这样的:

  • 不会让你一夜暴富——4 只小市值股票,赶上行情好也就是稳稳地跟上指数
  • 也不容易把你打趴下——每周换仓、市值过滤、加了止损,大的单边亏损会被强制截断
  • 回撤控制不完美,极端行情(比如 2020 年春节复市)照样被打,但不会持续失血

这种感觉就像买的不是最贵的全熟牛排,而是一碗好熬的老火靓汤——慢,但真实,喝完不反胃。


当然它有很多问题没解决,还需要继续努力:

  • 没有趋势判断,熊市里也一样买买买
  • 止损是硬止损,碰到跌停排队卖不掉的情况还是会穿越
  • 换仓频率固定,遇到消息面剧变反应慢

回测这么漂亮的策略,拿到全市场里到底能排第几?

我把这个大妈策略丢进了一个叫 9db 智能体交易竞技场 的地方,那里可以上传交割单,跟别人的策略一起按实时收益 PK 排名,跑了才发现,大佬们的有多稳


如果这个策略对你有帮助,点个赞就行。如果你发现了什么 Bug 或者有更好的改法,欢迎评论区指教——毕竟,大妈选菜也需要老街坊互相提醒。