news 2026/7/7 20:42:57

【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/7/7 4:31:38

unrpa工具完整指南:5分钟掌握RPA文件提取技巧

unrpa工具完整指南:5分钟掌握RPA文件提取技巧 【免费下载链接】unrpa A program to extract files from the RPA archive format. 项目地址: https://gitcode.com/gh_mirrors/un/unrpa unrpa是一款专门用于提取RPA档案格式文件的强大工具,能够帮助…

作者头像 李华
网站建设 2026/7/7 12:53:05

awd赛题的flag是什么意思_【CTF攻略】CTF线下赛AWD模式下的生存技巧

Hello,大家好,我是Nu1L战队队长Veneno,通过这篇文章说一下关于CTF线下赛的AWD模式(当然也有一些比赛是沙盒模式),以及身为一只Web狗的你如何在各位大佬们的手下存活:)可能没有技术干货,大家勿喷:) 1-何为AWD Attack Wi…

作者头像 李华
网站建设 2026/7/7 19:05:21

【限时揭秘】:掌握这4种方法,轻松导出量子作业执行结果

第一章:量子作业结果导出的核心价值 在量子计算的实际应用中,完成量子线路的执行仅是第一步,真正发挥其价值的关键在于对作业结果的有效导出与后续分析。量子作业的结果通常以量子态测量数据、概率分布或原始计数形式存在,若无法系…

作者头像 李华
网站建设 2026/7/7 14:26:50

基于RIDNet特征注意力机制的YOLOv12图像去噪改进实战:突破噪声环境下目标检测性能瓶颈

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有! 文章目录 基于RIDNet特征注意力机制的YOLOv12图像去噪改进实战:突破噪声环境下目标检测性能瓶颈 一、RIDNet核心技术解析:特征注意力的创新应用 二、完整实现方案…

作者头像 李华
网站建设 2026/7/7 14:39:04

Nordic BLE库实战:构建高性能Android蓝牙应用的核心技巧

在移动应用开发领域,蓝牙低功耗技术已成为连接智能设备的桥梁。Nordic Semiconductor推出的Android-BLE-Library彻底革新了传统BLE开发模式,让开发者能够以优雅的方式构建稳定可靠的蓝牙应用。本文将从实战角度出发,深度解析如何利用该库打造…

作者头像 李华
网站建设 2026/7/7 2:53:26

基于YOLOv12的工业级目标检测优化实战:GIoU/DIoU损失函数深度应用指南

购买即可解锁300+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,别人有的本专栏也有! 文章目录 基于YOLOv12的工业级目标检测优化实战:GIoU/DIoU损失函数深度应用指南 性能突破实证 核心技术原理深度解析 完整代码实现方案 1. 高级损失函数模块实现 2…

作者头像 李华