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'])

风险提示

  1. 历史不代表未来:回测收益≠实盘收益
  2. 滑点和手续费:回测通常忽略,实盘会侵蚀利润
  3. 过度拟合:策略太复杂,反而容易失效
  4. 量化不是赌博:严格止损,资金管理第一

总结

本文介绍了:

  • ✅ 用AKShare免费获取A股数据
  • ✅ 计算RSI技术指标
  • ✅ 可视化K线图
  • ✅ 回测简单策略

下一步学习方向:

  1. 学习更多技术指标(MACD、布林带、KDJ)
  2. 研究因子选股(基本面+技术面)
  3. 了解风险管理和资金管理
  4. 尝试机器学习预测(LSTM、随机森林)

参考资料

  • AKShare官方文档:https://akshare.akfamily.xyz/
  • Pandas官方教程:https://pandas.pydata.org/docs/getting_started/
  • 量化学习路线:https://www.joinquant.com/

免责声明:本文仅为技术分享,不构成任何投资建议。股市有风险,入市需谨慎。


作者信息

  • CSDN:@MMlonghao
  • 专注领域:量化交易、Python数据分析、开源项目
  • 下期预告:《用Python爬取东方财富股吧舆情数据》
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐