前言:为什么你要做量化回测?
在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
- 获取数据
首先,我们需要拿到股票的历史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 (推荐)
如果有代码运行问题,欢迎在评论区留言交流!觉得有用请点赞收藏!