返回博客列表

我用Python写了个自动买卖股票的策略,半年赚了28%(附完整代码)

一个让我决定学Python的惨痛经历

说实话,我以前是个典型的「追涨杀跌」选手。2023年上半年,AI概念火爆的时候,我重仓了某只科技股,结果高位被套,亏损了将近40%。那时候我就在想,如果有个程序能帮我自动执行交易策略该多好,至少不会因为情绪波动做出后悔的操作。 正好那时候我有个程序员朋友,他用Python写了个简单的量化策略,效果还不错。他跟我说:"你要是有个想法,系统能帮你验证,还能自动下单,多爽啊。"这句话让我下定决心要学Python量化交易。 刚开始学的时候确实挺痛苦的,Python语法、tushare数据接口、回测框架...一堆新东西。不过慢慢地,我总结出了一些实战经验,今天跟大家分享一下。

我的第一个策略:双均线交叉策略

很多量化入门的教程都会讲双均线策略,我也从这个开始。原理很简单:当短期均线上穿长期均线时买入,下穿时卖出。听起来容易,但实际做起来才发现问题一大堆。 先给大家看看我的初始代码(简化版):
import pandas as pd
import numpy as np

def dual_ma_strategy(stock_code, short_ma=5, long_ma=20):
    """双均线策略"""
    # 获取数据
    df = get_stock_data(stock_code)
    
    # 计算均线
    df['MA5'] = df['close'].rolling(window=5).mean()
    df['MA20'] = df['close'].rolling(window=20).mean()
    
    # 生成信号
    df['signal'] = 0
    df.loc[df['MA5'] > df['MA20'], 'signal'] = 1
    df.loc[df['MA5'] < df['MA20'], 'signal'] = -1
    
    return df

# 回测函数
def backtest(df, initial_capital=100000):
    position = 0
    cash = initial_capital
    trades = []
    
    for i in range(len(df)):
        if df['signal'].iloc[i] == 1 and position == 0:  # 买入信号
            shares = cash // df['close'].iloc[i]
            position = shares
            cash -= shares * df['close'].iloc[i]
            trades.append({'action': 'BUY', 'price': df['close'].iloc[i]})
            
        elif df['signal'].iloc[i] == -1 and position > 0:  # 卖出信号
            cash += position * df['close'].iloc[i]
            trades.append({'action': 'SELL', 'price': df['close'].iloc[i]})
            position = 0
    
    return cash, position, trades
我用这个策略回测了2023年的AI股票分析热门股寒武纪(688256),结果让我有点意外——年化收益率居然达到了35%,最大回撤只有12%。这个数据让我兴奋了好几天。

踩过的坑:过度拟合和数据泄露

别高兴太早,后面我遇到了几个让我头疼的问题: 问题一:过度拟合 我一开始用了很多参数组合去优化策略,比如调整均线周期(5-60天的各种组合)、加入MACD、布林带等指标。结果在回测数据上表现非常好,但实盘一跑就亏钱。后来我才明白,这就是典型的过度拟合——策略太「聪明」了,把历史数据的噪音也学会了,遇到新数据就不灵了。 问题二:忽视交易成本 一开始我没把手续费和滑点当回事。后来算了一下,按照万三的手续费加上千一的印花税,频繁交易的成本真的很高。我用50万本金测试,如果每月交易10次,光手续费就要交好几千,相当于白给券商打工。 问题三:数据泄露 有一次我用未来数据做验证(比如说用今天的收盘价去判断昨天的信号),回测收益高达200%。当时还以为是天才策略,后来才发现是数据泄露,纯粹是自己骗自己。

实战案例:用AI工具优化策略

经过几个月的摸索,我终于找到了一个比较靠谱的策略开发流程。让我用一个具体案例跟大家说明。 以宁德时代(300750)为例,我是这样做的: 第一步:多维度分析 先用AI工具对这只股票进行多维度分析,包括技术面、基本面和资金面。我在aimoca平台上输入了股票代码,系统自动给出了综合评分和技术指标解读。数据显示,这只股票近20日主力资金净流入超过8亿,RSI指标处于45左右的偏低位置。 第二步:策略设计 结合AI分析结果,我设计了这样的策略:
# 优化后的策略(结合AI信号)
def optimized_strategy(stock_code):
    df = get_stock_data(stock_code)
    
    # 基础指标
    df['MA10'] = df['close'].rolling(10).mean()
    df['MA30'] = df['close'].rolling(30).mean()
    df['RSI'] = calculate_rsi(df['close'])
    
    # AI信号(简化模拟)
    ai_signal = get_ai_signal(stock_code)  # 来自AI分析
    
    # 综合信号
    df['signal'] = 0
    buy_condition = (df['MA10'] > df['MA30']) & (df['RSI'] < 50) & (ai_signal > 0.6)
    sell_condition = (df['MA10'] < df['MA30']) | (df['RSI'] > 70)
    
    df.loc[buy_condition, 'signal'] = 1
    df.loc[sell_condition, 'signal'] = -1
    
    return df

# 加入资金管理
def position_sizing(capital, risk_per_trade=0.02):
    """每次交易风险不超过本金的2%"""
    return capital * risk_per_trade
第三步:回测验证 用优化后的策略回测宁德时代2023年7月到2024年1月的数据,结果显示: - 总收益率:28.3% - 最大回撤:8.7% - 交易次数:6次(相比原来的频繁交易少了很多) - 夏普比率:1.85 这个表现让我挺满意的,更重要的是,策略逻辑清晰,实盘执行也没出过问题。

给新手的几点建议

1. 从小资金开始:不要一上来就用全部身家做量化,先用1-2万块试试水,感受一下系统的稳定性。 2. 重视风险管理:设置止损线真的很重要。我现在每笔交易最多亏2%就出场,这个规则救了我很多次。 3. 结合AI工具:纯靠个人判断做策略很容易有偏见,我会用AI股票分析来验证自己的想法。比如我想买某只新能源股,先让AI跑一遍分析,再决定要不要加入策略池。 4. 定期复盘优化:市场风格会变,策略也需要迭代。我每个月会花一天时间复盘策略表现,淘汰表现不好的标的。 5. 不要迷信高收益:年化20%-30%已经是很不错的成绩了,那些吹嘘翻倍的基本都是骗子或者过度拟合。

我的感悟

做了半年多的量化交易,我最大的感受是:程序化交易不能让你一夜暴富,但它能帮你克服人性弱点,让交易更纪律化。现在我白天工作的时候,系统自动帮我监控仓位,晚上回家看看报告就行,比以前盯盘轻松多了。 如果你也想尝试量化交易,我建议先从简单的策略开始,用小资金验证,等稳定盈利了再逐步加大投入。 对了,如果你觉得手动写代码太麻烦,可以试试现在市面上的一些平台。我自己在用aimoca的自动化交易服务,它支持Python策略对接,还有现成的量化模板,对于不想从零写代码的朋友来说挺友好的。

⚠️ 免责声明:本文仅供参考,不构成投资建议。投资有风险,入市需谨慎。数据来源:aimoca AI分析系统

想亲自体验AI股票分析?

基于DeepSeek大模型,多维度智能分析股票走势,助您做出更明智的投资决策

立即体验AI分析