news 2025/12/29 9:15:42

【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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/23 9:56:46

Element Plus终极CI/CD自动化部署完整指南

Element Plus终极CI/CD自动化部署完整指南 【免费下载链接】element-plus element-plus/element-plus: Element Plus 是一个基于 Vue 3 的组件库,提供了丰富且易于使用的 UI 组件,用于快速搭建企业级桌面和移动端的前端应用。 项目地址: https://gitco…

作者头像 李华
网站建设 2025/12/23 16:19:45

开源TTS新星EmotiVoice:实现零样本声音克隆

开源TTS新星EmotiVoice:实现零样本声音克隆 在智能语音助手、虚拟偶像和互动游戏NPC日益普及的今天,用户对语音合成的要求早已不再满足于“能说”,而是追求“像人”——有温度、有情绪、有个性。然而,传统文本转语音(T…

作者头像 李华
网站建设 2025/12/24 21:52:13

量子计算+机器学习+可视化(VSCode终极配置指南)

第一章:量子机器学习的 VSCode 数据可视化 在量子机器学习领域,数据可视化是理解复杂量子态与模型行为的关键环节。VSCode 凭借其强大的扩展生态和集成能力,成为开发人员实现高效可视化的首选工具。通过结合 Python、Qiskit 以及 Plotly 等库…

作者头像 李华
网站建设 2025/12/23 16:19:43

轻量级MP3解码终极指南:为什么minimp3是音频开发者的首选

轻量级MP3解码终极指南:为什么minimp3是音频开发者的首选 【免费下载链接】minimp3 Minimalistic MP3 decoder single header library 项目地址: https://gitcode.com/gh_mirrors/mi/minimp3 在嵌入式系统、移动应用和游戏开发中,音频解码往往是资…

作者头像 李华
网站建设 2025/12/24 12:36:43

Citra模拟器终极使用指南:5步快速上手3DS游戏

Citra模拟器终极使用指南:5步快速上手3DS游戏 【免费下载链接】citra 项目地址: https://gitcode.com/GitHub_Trending/ci/citra 还在为如何在电脑上畅玩3DS游戏而苦恼吗?想要获得比原版设备更出色的游戏体验?Citra模拟器正是你需要的…

作者头像 李华