news 2026/5/1 9:07:56

【Python实战干货】手把手带你回测A股经典趋势策略(附验证源码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Python实战干货】手把手带你回测A股经典趋势策略(附验证源码)

前言:为什么你要做量化回测?
在A股市场摸爬滚打,你是否也遇到过这种情况:

听大V说“金叉买入”,结果一买就被套?
感觉某个指标很准,但不敢重仓,因为不知道历史表现如何?
想复盘几年的数据,手动拉K线图拉到眼瞎?
“凭感觉交易是亏损的开始,用数据说话才是盈利的基石。”

今天这篇文章,不讲虚的理论,直接上实战干货。我将手把手教你用Python搭建一个简单的回测框架,利用Tushare获取A股历史数据,验证一个经典的**“双均线趋势策略”**到底赚不赚钱。

一、 工欲善其事:数据源的选择
做量化,数据是第一生产力。很多新手还在用爬虫爬新浪财经,不仅速度慢,还容易被封IP。

在Python量化圈,最硬核、最稳定的数据源非 Tushare 莫属。它提供了极其丰富的A股日线、财务、宏观数据,而且接口简单,Pandas直接读取,非常适合做回测。

⚠️ 注意: 运行本文代码需要Tushare的Token(API密钥)。
如果你还没有账号,强烈建议通过以下链接免费注册(注册后即可获取基础积分,免费拉取日线数据):

👉 Tushare大数据社区注册链接(点击跳转)

(PS:通过此链接注册支持博主,咱们一起薅社区羊毛获取更多数据权限!)
二、 策略思路:双均线+动态止盈
为了演示,我们选取一个经典且逻辑清晰的策略:MA5与MA20双均线策略。

买入信号:当5日均线(短期趋势)上穿20日均线(中期趋势),形成“金叉”,视为趋势向上,全仓买入。
卖出信号:当5日均线(短期趋势)下穿20日均线(中期趋势),形成“死叉”,视为趋势走坏,清仓止损/止盈。
虽然策略简单,但通过Python回测,我们可以直观地看到它在具体个股上的表现(比如“茅指数”代表贵州茅台)。

三、 Python代码实战(完整版)
环境准备:请确保安装了 pandas, tushare, matplotlib。

code
Bash

download

content_copy

expand_less
pip install pandas tushare matplotlib

  1. 获取数据
    首先,我们需要拿到股票的历史K线数据。这里就用到了我们申请的Tushare Token。

code
Python

download

content_copy

expand_less
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt

----------------------------------------------------

1. 初始化设置

----------------------------------------------------

替换为你自己的Token(一定要去注册获取,否则无法运行)

注册地址:https://tushare.pro/register?reg=833676

ts.set_token(‘你的Tushare_Token_粘贴在这里’)
pro = ts.pro_api()

2. 获取数据函数

def get_data(ts_code, start_date, end_date):
print(f"正在获取 {ts_code} 的数据…")
# 使用Tushare的通用行情接口
df = pro.daily(ts_code=ts_code, start_date=start_date, end_date=end_date)

# 数据清洗:Tushare返回的数据通常是倒序的,需要按时间正序排列 df = df.sort_values('trade_date') df['trade_date'] = pd.to_datetime(df['trade_date']) df.set_index('trade_date', inplace=True) # 只保留我们需要的列 df = df[['open', 'high', 'low', 'close', 'vol']] return df

获取 贵州茅台(600519.SH) 过去5年的数据

df = get_data(‘600519.SH’, ‘20180101’, ‘20231231’)
print(df.head())
2. 策略逻辑实现(向量化回测)
相比于循环(For-loop),Pandas的向量化操作速度快几十倍。

code
Python

download

content_copy

expand_less

----------------------------------------------------

3. 计算技术指标

----------------------------------------------------

计算5日和20日均线

df[‘MA5’] = df[‘close’].rolling(window=5).mean()
df[‘MA20’] = df[‘close’].rolling(window=20).mean()

----------------------------------------------------

4. 生成交易信号

----------------------------------------------------

信号逻辑:

signal = 1 (持有/买入)

signal = 0 (空仓/卖出)

初始化信号列

df[‘signal’] = 0

当 MA5 > MA20 时,标记为 1 (看多)

df.loc[df[‘MA5’] > df[‘MA20’], ‘signal’] = 1

计算仓位变化:1->0 是卖出,0->1 是买入

shift(1) 是为了避免未来函数,我们只能用昨天的数据决定今天的操作

df[‘position’] = df[‘signal’].shift(1)
df[‘position’].fillna(0, inplace=True)

----------------------------------------------------

5. 计算收益率

----------------------------------------------------

计算股票每日的涨跌幅

df[‘pct_change’] = df[‘close’].pct_change()

策略收益 = 股票涨跌幅 * 昨天的仓位

如果昨天空仓(0),今天无论涨跌都不影响策略收益

df[‘strategy_return’] = df[‘pct_change’] * df[‘position’]

计算累计收益曲线 (复利)

df[‘cumulative_stock_return’] = (1 + df[‘pct_change’]).cumprod()
df[‘cumulative_strategy_return’] = (1 + df[‘strategy_return’]).cumprod()

print(“回测计算完成!”)
3. 可视化结果
数据要可视化才直观。我们将策略收益和股票本身的走势画在一起对比。

code
Python

download

content_copy

expand_less

----------------------------------------------------

6. 绘图展示

----------------------------------------------------

plt.figure(figsize=(12, 6))

画出股票本身的走势(基准)

plt.plot(df.index, df[‘cumulative_stock_return’], label=‘Stock Buy & Hold’, color=‘gray’, linestyle=’–’)

画出策略的走势

plt.plot(df.index, df[‘cumulative_strategy_return’], label=‘MA5/MA20 Strategy’, color=‘red’, linewidth=2)

plt.title(‘Backtest Result: MA5 vs MA20 Strategy (Moutai)’, fontsize=15)
plt.xlabel(‘Date’)
plt.ylabel(‘Cumulative Return’)
plt.legend(loc=‘upper left’)
plt.grid(True)

plt.show()

输出最终收益率

stock_final = df[‘cumulative_stock_return’].iloc[-1] - 1
strategy_final = df[‘cumulative_strategy_return’].iloc[-1] - 1

print(f"股票本身收益: {stock_final:.2%}")
print(f"策略累计收益: {strategy_final:.2%}")
四、 结果分析与避坑指南
运行上述代码后,你会得到一张资金曲线图。

关于收益:在震荡市中,双均线策略可能会频繁止损(左右打脸),导致跑输直接持股;但在大趋势行情中(如2019-2021年的茅台),该策略能吃到最肥美的一段,并成功躲过2022年的大跌。
关于数据质量:回测最忌讳数据有误。例如复权因子如果不处理,股价分红除权会导致巨大的K线缺口,让回测完全失真。Tushare提供了adj=‘qfq’(前复权)参数,大家在进阶使用时一定要注意复权数据的获取。
五、 总结
这只是量化交易的冰山一角。通过Python + Tushare,我们可以:

批量回测全市场5000只股票。
加入财务指标(如:只买ROE>15%的股票)。
加入资金流向分析(Tushare有港资、主力资金数据)。
数据是量化的子弹。 建议大家先把环境搭起来,跑通代码。

🎁 独家福利:
为了方便大家实操,请务必注册Tushare获取稳定的数据权限。
通过博主专属链接注册,可获得额外积分支持:
👉 点击注册 Tushare Pro (推荐)

如果有代码运行问题,欢迎在评论区留言交流!觉得有用请点赞收藏!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 8:00:56

【稀缺资源】资深量子工程师私藏的VSCode配置清单首次公开

第一章:量子模拟器 VSCode 扩展的配置 在开发量子计算应用程序时,Visual Studio Code 配合量子模拟器扩展可显著提升编码效率。通过集成 Q# 语言支持和本地量子模拟环境,开发者能够在熟悉的编辑器中编写、调试并运行量子算法。 安装 Q# 和 Q…

作者头像 李华
网站建设 2026/4/27 4:43:42

FunASR语音识别:如何让AI准确听懂你的专业术语?

FunASR语音识别:如何让AI准确听懂你的专业术语? 【免费下载链接】FunASR A Fundamental End-to-End Speech Recognition Toolkit and Open Source SOTA Pretrained Models, Supporting Speech Recognition, Voice Activity Detection, Text Post-process…

作者头像 李华
网站建设 2026/4/18 12:31:34

终极指南:如何利用开源macOS应用宝库提升工作效率

终极指南:如何利用开源macOS应用宝库提升工作效率 【免费下载链接】open-source-mac-os-apps serhii-londar/open-source-mac-os-apps: 是一个收集了众多开源 macOS 应用程序的仓库,这些应用程序涉及到各种领域,例如编程、生产力工具、游戏等…

作者头像 李华
网站建设 2026/4/27 13:21:04

仅需4步!手把手教你完成智能Agent的容器化部署与服务编排

第一章:智能 Agent 容器化部署概述随着微服务架构和云原生技术的普及,智能 Agent 的部署方式正逐步向容器化演进。容器化为智能 Agent 提供了环境隔离、快速启动、弹性伸缩等核心优势,使其能够在复杂多变的生产环境中稳定运行。容器化带来的核…

作者头像 李华
网站建设 2026/4/7 21:47:37

学历不太好,想学网络安全,这一行看重学历吗?

很长一段时间以来,有很多人在微信上都问我同一个问题: 大佬,我学历不太好,想学网络安全,这一行看重学历吗? 微信上给太多人解释过这个问题了,今天专门来写一篇文章给大家说说我的看法。 先说结…

作者头像 李华
网站建设 2026/4/28 9:11:00

YOLOv12图像去噪革命:RIDNet单阶段盲真实图像去噪完全指南

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有! 文章目录 YOLOv12图像去噪革命:RIDNet单阶段盲真实图像去噪完全指南 技术突破与性能验证 RIDNet核心技术解析 多尺度特征交互机制 YOLOv12与RIDNet深度集成架构 端…

作者头像 李华