
去年有个做设计的哥们儿突然问我“我看网上说现在AI能直接帮人炒股赚钱是真的吗我连K线都看不懂能不能用AI写个程序自动买卖”我当时直接给他泼了盆冷水AI又不是算命先生但它的确能让一个完全不懂编程的普通人花三周时间搭出一套属于自己的ETF量化交易系统。这不是天方夜谭我自己就是从零基础走过来的。所谓量化交易说白了就是把你的交易思路写成规则让程序替你盯盘、计算、回测甚至自动下单。而AI在这件事里的真正价值不是“帮你赚钱”而是帮你把“你以为自己懂”的东西变成“程序真能跑得通”的代码。这篇文章就围绕一个字实操。我会把这21天的路线、工具、代码思路、踩坑记录全盘分享出来。你看完不一定能立刻暴富谁要是这么承诺你赶紧拉黑但一定知道从哪开始、每一步干什么、怎么避开我当初踩过的坑。1. 先别急着写代码搞懂ETF和量化交易到底怎么回事1.1 ETF本质一篮子股票的“打包买卖”很多新人一上来就研究各种指标什么MACD、布林带、KDJ结果连自己交易的东西是什么都没搞清楚。ETF全称是Exchange Traded Fund翻译过来就是“交易型开放式指数基金”。你不需要去理解那些绕口的金融术语只要记住一句话买ETF等于一次买入了一篮子股票。举个例子沪深300ETF跟踪的是沪深300指数这个指数里包含300家规模大、流动性好的公司。你买一手沪深300ETF相当于同时持有这300家公司的股份。为什么要选ETF做量化三个理由第一分散风险单只股票暴雷对ETF整体影响有限第二交易规则友好ETF支持T1交易部分跨境、债券类品种支持T0手续费比股票低而且没有印花税第三它的走势相对“干净”不容易被个别庄家操纵更适合用规则去捕捉趋势。普通人做量化我强烈建议从ETF起步而不是去买个股。因为个股的随机性太强财报、管理层、突发事件都会让价格跳空模型很容易被玩坏。而ETF代表的是整个市场或某个行业板块的平均表现逻辑更稳定策略的容错率也更高。1.2 量化交易不是玄学是把规则交给程序“量化”这两个字听起来高大上其实就是把交易思路变成“如果...就...”的规则。比如你观察到一个现象某个ETF的价格跌到20日均线以下后往往会在几天内反弹。那你的第一条规则就是如果收盘价上穿20日均线就买入一定份额。如果收盘价下穿20日均线就卖出清仓。这就是最经典的“双均线策略”虽然简单但它是理解量化交易的最佳入门案例。程序会自动执行这些规则不会因为恐惧而手抖也不会因为贪婪而追高。AI加入之后系统可以帮你做更多事情读取历史数据、计算各种技术指标、自动回测历史行情、生成优化参数、分析回测报告里的异常。但有个核心边界你要清楚AI负责“计算”和“执行”而“你这个策略逻辑是否合理”仍然需要人来判断。我见过太多人让AI随便写个策略回测图看起来漂亮得不得了实盘一跑就翻车为什么因为策略逻辑本身有问题AI只是把问题包装得更好看了。1.3 AI在这套系统里的真实角色把这套系统拆开看AI主要有四个用途。第一代码辅助。你不需要精通Python但你要学会让AI帮你写代码。以前写一个数据获取脚本可能要半天现在用自然语言描述需求AI能生成80%可用的代码你只需要会复制、粘贴、改参数。第二数据清洗与特征分析。原始行情数据经常会缺日期、有停牌导致的数据空洞、前复权/后复权价格混乱。AI能帮你快速写出清洗脚本并且检查数据里有没有明显的异常值。第三策略代码生成。你把策略逻辑描述清楚AI帮你翻译成pandas、backtrader或vectorbt的代码。注意这里的关键是你描述逻辑的能力而不是AI有多聪明。第四回测结果解读。回测跑完之后会吐出一堆指标年化收益率、最大回撤、夏普比率、胜率。AI可以帮你解释这些指标的含义甚至帮你排查回测报告中“收益率异常高”的原因。但记住AI不是“圣杯”。它不会告诉你哪只ETF明天涨也不会替你做最终决策。它更像一个不知疲倦的实习生速递快、态度好但是你得带脑子。2. 21天路线图从零到能跑通一套系统2.1 第1-7天环境准备与数据获取我不管你现在是Mac、Windows还是Linux第一周的任务只有一个把Python跑起来并且拿到可以用的历史数据。环境准备其实很简单。你不需要自己折腾Python环境管理直接用Anaconda。安装完以后打开Anaconda Prompt或者终端创建一个新的虚拟环境然后安装几个核心库pandas、numpy、matplotlib、jupyter、akshare、backtrader。直接用pip安装就行conda create -n etf_quant python3.9 conda activate etf_quant pip install pandas numpy matplotlib jupyter akshare backtrader我这里用的akshare是一个开源财经数据接口库国内ETF的历史行情基本都能拿到。为什么不推荐直接去下载CSV因为数据要长期更新策略要持续验证写代码自动抓数据比手工下载靠谱一万倍。数据获取的代码很简单但会有一些坑。比如你直接用akshare获取ETF历史行情时取到的数据有些字段是“前复权”价格有些是“不复权”价格如果直接把两种价格混着用策略回测的收益率会完全失真。我建议的获取逻辑是先用akshare拉取日线数据然后把数据按日期排序再检查有没有重复的日期和NaN值。代码可以这样写import akshare as ak import pandas as pd # 获取华夏上证50ETF510050的日线数据 df ak.fund_etf_hist_em( symbol510050, perioddaily, start_date20150101, end_date20250101, adjustqfq # 前复权 ) # 数据清洗 df df[[日期, 开盘, 收盘, 最高, 最低, 成交量]] df.columns [date, open, close, high, low, volume] df[date] pd.to_datetime(df[date]) df df.set_index(date) df df.dropna() df df[~df.index.duplicated(keepfirst)] print(df.head()) print(df.tail())这里有一个关键点adjustqfq是前复权。前复权价格会把历史价格按分红送股调整这样回测的收益率和真实买卖更接近。如果不复权遇到大比例分红时回测里可能莫名出现一个巨大的“下跌缺口”但其实你没亏钱。第一周剩下几天建议你去跑一个“历史行情可视化”的小程序把某只ETF近一年的K线图画出来。这能让你直观感受价格波动也顺便熟悉matplotlib和DataFrame操作。2.2 第8-14天策略设计走向代码有了数据第二周开始设计你的第一个策略。不要一上来就整复杂的机器学习模型先用最基础的“双均线策略”。均线的本质是“平滑价格波动”。短期均线反应快长期均线反应慢。当快线上穿慢线时说明短期趋势向上买入当快线下穿慢线时卖出。这个策略的优点在于逻辑透明、容易理解、回测流畅。如果你想让AI帮忙写这个策略可以直接给它这样一个提示词“我有一个DataFrame列名是open、close、high、low、volumeindex是日期。请帮我写一个双均线策略代码使用10日均线和30日均线当close上穿ma10时买入当close下穿ma10时卖出。输出买卖信号序列不要画图只要计算信号的函数。”AI大概率会给你一段像下面这样的代码import pandas as pd def generate_signals(df, short_win10, long_win30): df df.copy() df[ma_short] df[close].rolling(windowshort_win).mean() df[ma_long] df[close].rolling(windowlong_win).mean() # 生成交易信号1表示买入-1表示卖出0表示持有 df[signal] 0 df.loc[df[ma_short] df[ma_long], signal] 1 df.loc[df[ma_short] df[ma_long], signal] -1 # 差分定位交叉点由0变1是金叉由1变0是死叉 df[position] df[signal].diff() return df # 调用示例 df_signal generate_signals(df, 10, 30) print(df_signal[df_signal[position] ! 0].tail(10))注意这段代码里df[position] df[signal].diff()有一个隐藏逻辑diff()会把前一个值减去后一个值所以从0到1时diff为1从1到0时diff为-1。但这里有个小坑如果前一个信号是1当前也是1diff就是0这没问题。但如果你计划在“死叉”时做空融券就不能简单用这个逻辑因为ETF做空成本高普通人不建议。你在第二周要做的就是把这个信号代码跑通并且在图上画出买卖点。看到那些小箭头精准踩在股价转折点上时确实会有一种“我已经悟道了”的错觉。别急第三周的回测会教你重新做人。2.3 第15-21天回测、模拟与纸上交易第三周的核心工作是回测。回测的意思是用历史数据验证你的策略假设从2020年开始你按照这个策略买卖信号操作现在账户会变成什么样我推荐使用backtrader做回测引擎虽然它的文档有点老旧但胜在稳定、社区成熟。用backtrader实现双均线策略的代码会稍长一些我这里给一个精简骨架import backtrader as bt class DualMAStrategy(bt.Strategy): params ((short, 10), (long, 30)) def __init__(self): self.ma_short bt.indicators.SMA(self.data.close, periodself.params.short) self.ma_long bt.indicators.SMA(self.data.close, periodself.params.long) self.crossover bt.indicators.CrossOver(self.ma_short, self.ma_long) def next(self): if not self.position: # 空仓 if self.crossover 0: # 金叉 self.buy(size1000) # 每次买入1000份 else: # 持仓 if self.crossover 0: # 死叉 self.close() # 清仓 if __name__ __main__: cerebro bt.Cerebro() # 把之前获取的DataFrame转换成backtrader数据格式 data bt.feeds.PandasData(datanamedf) # df是前面清洗好的日线数据 cerebro.adddata(data) cerebro.addstrategy(DualMAStrategy) cerebro.broker.setcash(100000.0) # 初始资金10万 cerebro.broker.setcommission(commission0.0003) # 万分之三手续费 cerebro.run() cerebro.plot()跑完回测后一定要看几个关键指标而不是只盯着那个总收益率。我见过太多新手一看到“年化收益率120%”就热血沸腾完全忽略最大回撤是45%。假设你本金5万中途亏到2.75万这个心理压力不是普通人能扛住的。这个阶段还有一件很重要的事纸上交易。找一个模拟交易软件很多券商App自带模拟盘把你回测到的策略原样设置进去跑两周看看。目的是验证你的真实操作速度、下单价格是否和回测一致以及你早上起床后看到亏损时的心理状态。3. 实操环节AI如何帮我写策略、改BUG、看回测3.1 用AI辅助生成策略代码提示词怎么给这年头谁还在傻傻手写代码但AI写代码有一个“垃圾进垃圾出”的问题。给AI的提示词如果太笼统比如“帮我写一个ETF量化策略”它给你一堆看似完美的代码实际运行全是报错。我的经验是提示词必须包含四个要素数据格式、策略逻辑、输出要求、运行环境。我给你一个我实际用过的模板“你是量化交易程序员。我的数据是pandas.DataFrameindex为日期列包括open、high、low、close、volume。现在我要设计一个动量策略过去20个交易日收益率排名前3的ETF作为买入候选每月第一个交易日调仓等权重分配资金。请用python写出回测逻辑用简单循环实现不要用复杂类结构。输出包括每期持仓、期末资产曲线。运行环境是python3.9 pandas。”这个提示词里我把“数据格式”说清楚了把“策略逻辑”量化成具体规则把“输出要求”说清楚了AI才能给你能用的东西。如果你直接问“怎么写量化交易”AI只能给你教科书式回答。拿到AI的代码后不要直接拿真金白银跑先复制到一个临时脚本里打印中间结果验证正确性。比如动量策略需要每个月计算收益率你就先打印某个月所有ETF的收益率排序自己手动算一遍看看跟程序输出是否一致。不要因为代码是AI写的就盲目信任它也会一本正经地胡说八道。3.2 数据获取与清洗AI能帮你避开的几个坑数据是整个系统的基础数据错了策略再牛也是白搭。我踩过的坑里最有代表性的有三个第一个是日期索引不连续。股票市场有节假日不算周末某些日期没有交易。如果你的数据源把停牌日期直接缺失掉而你的策略计算N日平均收益率时用了rolling(20)这个“20”是20个交易日还是20个自然日如果用自然日遇到国庆、春节这种长假数据会错位。解决办法是重置索引并检查日期范围。第二个是前复权数据导致的价格负值。前复权可能会把很久以前的历史价格调整为负数尤其是经历过多次高比例分红的基金。如果你用这个价格去算对数收益率就会得到NaN或无穷大。我的建议是回测近5年数据够用别一上来就拉20年长历史。第三个是未来函数。这词听起来吓人其实很简单你在回测中用了“当天收盘后才可能知道的数据”却在当天开盘价时就买入。一不当心AI生成的工具函数就会偷看未来。最典型的是在用技术指标时指标用了今天的收盘价但你的交易信号也在今天收盘时执行这没问题。但如果你用今天收盘价然后设置以今天的开盘价买入这就是偷看未来。避免方法很简单每天的数据必须严格按顺序处理并且只在close后的下一个open执行交易。AI可以帮你写一个数据质量检测脚本检查每列有没有NaN、检查日期是否连续、检查涨跌幅是否超过合理范围。这种脚本很实用建议直接保存为check_data.py。3.3 回测结果怎么看别被收益率骗了回测跑完AI会给你生成一张收益曲线图看起来不断新高、岁月静好。别急着高兴先检查四个东西。第一个是基准对比。你跑出来的绝对收益率没有意义必须和“买入并持有ETF”的收益对比。比如你的均线策略年化8%但ETF本身过去一年涨了20%那你的策略是亏的因为它连躺平都跑不赢。我在回测脚本里总会加上一列基准收益用df[close].pct_change().cumprod()画出来对比。第二个是回撤。最大回撤这个指标比收益率重要得多。回撤50%需要涨100%才能回本。如果你策略的最大回撤超过20%普通人的心理就已经开始崩了。AI可以帮你算出最大回撤并定位发生时间段然后你应该把这个时间段拉出来看看当时的行情状态问问自己这个回撤能扛住吗。第三个是交易次数。如果策略在10年里只交易了5次这个策略的统计样本太少结果充满偶然性。如果交易了5000次那你得看看手续费和滑点有没有计算在内。AI能帮你统计交易次数和平均每笔盈利这两个数字能直接反映策略的稳定性。第四个是参数敏感度。AI能帮你做一个很实用的操作参数扫描。把双均线的短期线从5、10、15、20一个一个试过去看看策略收益是不是剧烈变化。如果参数从10改成11年化收益率就从25%变成-3%那说明策略处于过拟合状态实盘大概率亏。我把这个扫描结果的截图贴在备忘录里每次想优化策略时先看一眼。4. 普通人最容易踩的坑我全踩过4.1 曲线拟合与过拟合AI生成的策略不一定赚有了AI之后很多人开始疯狂用机器学习模型让AI调参把历史回测曲线拟合得完美无缺。这种行为叫过拟合做出来的策略在历史数据上完美躲过每一次下跌但一到未来就完全失效。我记得自己第一次让AI帮我优化均线参数时AI根据历史数据“找”到了一组神奇参数回测年化50%最大回撤不到5%我当时恨不得立刻卖房入场。好在留了个心眼用这组参数去跑过去一年没见过的数据结果亏损20%。那组神奇参数不过是把噪声当成了规律。正确做法是把历史数据分成“训练集”和“测试集”比如用2020-2022年的数据让AI找出最优参数用2023年以后的数据做一次真实回测。如果测试集表现和训练集差距很大策略就没法用。我在本地脚本里固定了train_end 2022-12-31测试集只出现在最后绝不让AI在优化时看到测试集数据。4.2 忽略交易成本与滑点回测和实盘差距你可能会想“我就买卖几只ETF手续费能有多少”真正跑起来才发现手续费加滑点足以吃掉你的大部分利润。ETF佣金通常是万分之一到万分之三看起来不高但如果你是高频策略比如每年交易200次每次买卖双边都要付费成本会迅速累积。滑点是更隐蔽的杀手。回测代码里你设置“以收盘价买入”但实盘时你在收盘前几秒提交订单成交价格往往比收盘价高一点遇到市场剧烈波动时可能差出好几个价位。我建议在回测中至少设置0.1%的滑点也就是每次买卖都假设成交价格往不利方向偏移0.1%。这样跑出来的结果才接近真实。我的回测参数里固定写了这么一行cerebro.broker.setcommission(commission0.0003, mult1.0) # backtrader中通过slippage模拟滑点 cerebro.broker.set_slippage_perc(perc0.001)有了滑点后很多花里胡哨的策略立刻变形。这也是好事——它在帮你过滤掉那些根本不可能在实盘中赚钱的垃圾策略。4.3 情绪管理与仓位控制AI不能替你决策这可能是整个21天里最容易被忽略的环节。系统搭建完毕、回测看起来能跑、模拟盘也跟了几天于是你心想“要不真金白银试试”然后你开始发现AI程序每次发出买入信号时你都会犹豫“这次会不会是假信号”当程序发出卖出信号时你又想“再拿一下说不定要反弹。”只要你是手动触发交易情绪就会介入。我后来给自己定了一条铁律如果相信这个策略就应该完全按照信号执行如果不相信那应该回去改策略而不是在交易时临时改主意。AI能做到的是持续监控、及时提醒、严格执行但最终按下那个确认键的仍是你。你必须在开始实盘前想清楚这笔钱最多能亏多少连续亏三次你睡得着吗仓位管理是我见过散户最不重视的。有些人上来就把全部资金买满遇到回撤直接套牢。我自己比较保守单策略单ETF仓位最多占总资金20%剩余作为安全垫。当然这个比例因人而异但核心原则是任何策略都有连续亏损的可能你得保证自己活到策略开始赚钱的那一天。4.4 常见问题速查表我在带新手朋友跑这套系统时整理了一份高频问题清单直接贴在这里供参考。现象可能原因解决办法回测收益率高得离谱年化100%出现过拟合或未来函数用更长的测试集数据重新回测检查是否用了未来数据代码报错KeyError: close数据列名不统一打印DataFrame列名确认是Close还是close统一做映射数据里有NaN但dropna()无效数据索引有重复先df df[~df.index.duplicated()]再执行dropna()回测曲线和模拟盘差距大手续费/滑点设置太低提高滑点到0.1%~0.3%确保成本模型准确AI代码运行时内存占用飙升数据量过大且循环里用逐行计算尽量用pandas向量化计算不要用for循环逐行操作策略实盘后连续多笔亏损市场行情风格切换暂停手动交易重新回测近期行情检查策略是否还适用最后再分享一个小技巧。不要在一个策略上死磕给自己预设一个策略终止条件比如“如果连续回撤超过15%就暂停策略复盘逻辑”。这句话听起来容易执行起来难。我自己的做法是把这个阈值写进一个监控脚本里如果资产净值比上一个高点回落超过15%就自动发消息提示强制自己冷静下来。我个人实际操作中的体会是AI能不能帮普通人做交易答案是能但帮的不是“赚钱”而是“用纪律代替冲动”。它帮我把一套模糊的想法变成了可回测、可验证、可优化的完整系统。这21天走完最宝贵的不是那个策略代码而是你开始敬畏市场、理解概率、尊重风险。这才是普通人离交易真相最近的一步。