Python量化交易实战:用AKShare免费数据源构建你的第一个策略
·
Python量化交易实战:用AKShare免费数据源构建你的第一个策略
本文面向零基础量化爱好者,手把手教你用纯Python+免费数据源搭建量化分析系统。无需付费API,无需金融背景,跟着做就能跑通。
为什么要学量化交易?
传统炒股靠"感觉",量化交易靠"数据"。
感觉 vs 数据:
- ❌ “我觉得这只股要涨” → 主观情绪,容易追涨杀跌
- ✅ “RSI指标超卖+成交量放大” → 客观信号,有据可依
量化不是"必胜秘籍",而是把你的交易逻辑固化成代码,避免情绪化决策。
准备工作:安装环境
1. 安装Python(已完成可跳过)
推荐Python 3.8+,下载地址:https://www.python.org/downloads/
2. 安装AKShare(免费数据源)
pip install akshare
AKShare是什么?
- 免费、开源的财经数据接口库
- 支持A股、港股、美股、基金、期货、外汇等
- 无需API Key,即装即用
- GitHub:https://github.com/akfamily/akshare
实战1:获取股票历史数据
目标:下载茅台(600519)最近1年的日线数据
import akshare as ak
import pandas as pd
# 获取茅台日线数据(2022-01-01 至今)
df = ak.stock_zh_a_hist(
symbol="600519", # 股票代码
period="daily", # 日线
start_date="20220101",
end_date="20251231",
adjust="qfq" # 前复权
)
# 查看数据
print(df.head())
print(f"共获取 {len(df)} 条数据")
输出示例:
日期 开盘 收盘 最高 最低 成交量 成交额
0 2022-01-04 2050.0 2070.0 2088.0 2045.0 3456789 7123456789
1 2022-01-05 2070.0 2065.0 2085.0 2055.0 3234567 6890123456
...
关键字段解释:
收盘:每天最后一笔成交价(最重要!)成交量:当天成交了多少股成交额:当天成交了多少钱(成交量×均价)
实战2:计算技术指标(RSI)
什么是RSI?
RSI(相对强弱指数):衡量股票"超买"或"超卖"的程度。
- RSI > 70:超买区(可能要跌,考虑卖出)
- RSI < 30:超卖区(可能要涨,考虑买入)
代码实现
def calculate_rsi(df, period=14):
"""
计算RSI指标
:param df: 包含'收盘'列的DataFrame
:param period: RSI周期,默认14天
:return: 添加了RSI列的DataFrame
"""
# 计算价格变化
delta = df['收盘'].diff()
# 分别计算上涨和下跌
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
# 计算平均上涨和平均下跌
avg_gain = gain.rolling(window=period).mean()
avg_loss = loss.rolling(window=period).mean()
# 计算RSI
rs = avg_gain / avg_loss
rsi = 100 - (100 / (1 + rs))
df['RSI'] = rsi
return df
# 使用函数
df = calculate_rsi(df)
# 查看最近的RSI值
print(df[['日期', '收盘', 'RSI']].tail(10))
实战3:绘制K线图+RSI指标
使用mplfinance库可视化
pip install mplfinance
import mplfinance as mpf
# 准备数据(mplfinance要求列名为特定格式)
df_plot = df.copy()
df_plot = df_plot.set_index('日期')
df_plot.columns = ['Open', 'Close', 'High', 'Low', 'Volume', 'Amount', 'RSI']
# 创建RSI子图
rsi_plot = mpf.make_addplot(df_plot['RSI'], panel='lower', color='purple', width=1.5)
# 绘制K线图
mpf.plot(
df_plot,
type='candle',
volume=True,
addplot=rsi_plot,
title='茅台K线图 + RSI指标',
style='yahoo'
)
图表效果:
- 主图:K线(红色涨、绿色跌)
- 副图:RSI曲线(紫色)
实战4:回测简单策略
策略逻辑
买入信号:RSI < 30(超卖)
卖出信号:RSI > 70(超买)
回测代码
def backtest_rsi_strategy(df):
"""
RSI策略回测
"""
df['Signal'] = 0 # 0=持仓, 1=买入, -1=卖出
df['Position'] = 0 # 持仓状态:0=空仓, 1=持仓
for i in range(1, len(df)):
# 买入信号
if df.loc[i, 'RSI'] < 30 and df.loc[i-1, 'Position'] == 0:
df.loc[i, 'Signal'] = 1
df.loc[i, 'Position'] = 1
# 卖出信号
elif df.loc[i, 'RSI'] > 70 and df.loc[i-1, 'Position'] == 1:
df.loc[i, 'Signal'] = -1
df.loc[i, 'Position'] = 0
else:
df.loc[i, 'Position'] = df.loc[i-1, 'Position']
# 计算收益
df['Returns'] = df['收盘'].pct_change()
df['Strategy_Returns'] = df['Position'].shift(1) * df['Returns']
# 累计收益
cumulative_returns = (1 + df['Strategy_Returns']).cumprod()
print(f"策略总收益: {cumulative_returns.iloc[-1]:.2%}")
print(f"买入持有收益: {(df['收盘'].iloc[-1] / df['收盘'].iloc[0] - 1):.2%}")
return df
# 运行回测
df = backtest_rsi_strategy(df)
进阶:多因子策略
单因子(如RSI)容易失效,实战中常用多因子组合:
| 因子类型 | 示例指标 | 作用 |
|---|---|---|
| 趋势因子 | MACD、均线 | 判断大方向 |
| 动量因子 | RSI、KDJ | 捕捉超买超卖 |
| 成交量因子 | 量比、换手率 | 确认资金意图 |
| 情绪因子 | 北向资金、融资余额 | 跟随聪明钱 |
示例:RSI + MACD 组合策略
# 计算MACD
def calculate_macd(df, fast=12, slow=26, signal=9):
ema_fast = df['收盘'].ewm(span=fast).mean()
ema_slow = df['收盘'].ewm(span=slow).mean()
df['MACD'] = ema_fast - ema_slow
df['Signal_Line'] = df['MACD'].ewm(span=signal).mean()
df['MACD_Hist'] = df['MACD'] - df['Signal_Line']
return df
df = calculate_macd(df)
# 组合信号:RSI < 30 且 MACD > Signal_Line(金叉)
buy_signal = (df['RSI'] < 30) & (df['MACD'] > df['Signal_Line'])
风险提示
- 历史不代表未来:回测收益≠实盘收益
- 滑点和手续费:回测通常忽略,实盘会侵蚀利润
- 过度拟合:策略太复杂,反而容易失效
- 量化不是赌博:严格止损,资金管理第一
总结
本文介绍了:
- ✅ 用AKShare免费获取A股数据
- ✅ 计算RSI技术指标
- ✅ 可视化K线图
- ✅ 回测简单策略
下一步学习方向:
- 学习更多技术指标(MACD、布林带、KDJ)
- 研究因子选股(基本面+技术面)
- 了解风险管理和资金管理
- 尝试机器学习预测(LSTM、随机森林)
参考资料
- AKShare官方文档:https://akshare.akfamily.xyz/
- Pandas官方教程:https://pandas.pydata.org/docs/getting_started/
- 量化学习路线:https://www.joinquant.com/
免责声明:本文仅为技术分享,不构成任何投资建议。股市有风险,入市需谨慎。
作者信息:
- CSDN:@MMlonghao
- 专注领域:量化交易、Python数据分析、开源项目
- 下期预告:《用Python爬取东方财富股吧舆情数据》
更多推荐


所有评论(0)