当前位置:首页>python>量化投资策略:用Python实现配对交易策略,基于baostock的量化实战

量化投资策略:用Python实现配对交易策略,基于baostock的量化实战

  • 2026-10-11 07:16:28
量化投资策略:用Python实现配对交易策略,基于baostock的量化实战
作品介绍
作品名称:用Python实现配对交易策略,基于baostock的量化实战
用到的库:baostock、pandas、datetime
作品简介:该实例实现了一个配对交易策略,通过两只股票的历史价格数据计算价差,并根据标准化价差生成交易信号。策略的核心思想是利用两只股票之间的价差回归特性,进行市场中性套利。

实现过程

一、导入必要的库

import baostock as bsimport pandas as pdimport numpy as npimport matplotlib.pyplot as plt
      二、函数定义login_baostock
      • 使用 bs.login()登录 API,获取数据权限。
      • 检查登录状态,确保后续数据获取正常。
      # 登录baostockdef login_baostock():    lg = bs.login()    if lg.error_code != '0':        print(f"登录失败,错误代码:{lg.error_code}, 错误信息:{lg.error_msg}")        return False    print("登录成功")    return True
                                三、函数定义get_stock_data
                                • 调用 baostock.query_history_k_data_plus 获取指定时间段内的股票收盘价数据。
                                • 数据处理:将日期设置为索引,关闭价转换为浮点数。
                                # 获取历史数据def get_stock_data(stock_code, start_date, end_date):    rs = bs.query_history_k_data_plus(        stock_code,        "date,close",        start_date=start_date,        end_date=end_date,        frequency="d",        adjustflag="3"  # 后复权    )    data_list = []    while (rs.error_code == '0') & rs.next():        data_list.append(rs.get_row_data())    df = pd.DataFrame(data_list, columns=rs.fields)    df['close'] = df['close'].astype(float)    df['date'] = pd.to_datetime(df['date'])    df.set_index('date', inplace=True)    return df
                                四、函数定义calculate_spread
                                • 对两只股票的对数价格计算价差。
                                • 标准化价差:减去均值后除以标准差,使其均值为 0,标准差为 1。
                                # 计算价差和标准化价差def calculate_spread(stock1_data, stock2_data):    stock1_log = np.log(stock1_data['close'])    stock2_log = np.log(stock2_data['close'])    # 计算价差    spread = stock1_log - stock2_log    # 标准化价差    spread_mean = spread.mean()    spread_std = spread.std()    normalized_spread = (spread - spread_mean) / spread_std    return spread, normalized_spread
                                    五、函数定义generate_signals
                                    • 当标准化价差超过设定的进入阈值(如 ±1.0),生成开仓信号。
                                    • 当标准化价差回归到退出阈值(如 ±0.5),生成平仓信号。
                                    • 支持多空双向交易。
                                    # 生成交易信号def generate_signals(normalized_spread, entry_threshold=1.0, exit_threshold=0.5):    signals = pd.Series(index=normalized_spread.index, dtype=float)    position = 0  # 当前持仓状态:0表示无持仓,1表示持有股票1并做空股票2,-1表示持有股票2并做空股票1    for i in range(len(normalized_spread)):        if position == 0:            if normalized_spread[i] > entry_threshold:                signals.iloc[i] = -1  # 做空股票1,做多股票2                position = -1            elif normalized_spread[i] < -entry_threshold:                signals.iloc[i] = 1  # 做多股票1,做空股票2                position = 1        elif position == 1:            if normalized_spread[i] < exit_threshold:                signals.iloc[i] = 0  # 平仓                position = 0        elif position == -1:            if normalized_spread[i] > -exit_threshold:                signals.iloc[i] = 0  # 平仓                position = 0    return signals
                                    六、主程序
                                    • 绘制标准化价差曲线及交易信号点。
                                    • 添加进入和退出阈值的参考线,便于观察策略表现。
                                    # 主程序if __name__ == "__main__":    # 登录baostock    ifnotlogin_baostock():        exit()    # 设置参数    stock1_code = "sh.600519"  # 贵州茅台    stock2_code = "sh.600809"  # 山西汾酒    start_date = "2024-01-01"    end_date = "2025-04-23"    # 获取股票数据    stock1_data = get_stock_data(stock1_code, start_date, end_date)    stock2_data = get_stock_data(stock2_code, start_date, end_date)    # 计算价差和标准化价差    spread, normalized_spread = calculate_spread(stock1_data, stock2_data)    # 生成交易信号    signals = generate_signals(normalized_spread, entry_threshold=1.0, exit_threshold=0.5)    # 设置支持中文的字体    plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体    plt.rcParams['axes.unicode_minus'] = False  # 解决负号 '-' 显示为方块的问题    # 可视化结果    plt.figure(figsize=(14, 7))    plt.plot(normalized_spread, label="标准化价差", color="blue")    plt.axhline(1.0, color='r', linestyle='--', label="进入阈值")    plt.axhline(-1.0, color='r', linestyle='--')    plt.axhline(0.5, color='g', linestyle='--', label="退出阈值")    plt.axhline(-0.5, color='g', linestyle='--')    plt.scatter(signals.index, signals * 2, label="信号", marker='o', color='black')    plt.legend()    plt.title("配对交易策略")    plt.show()    # 注销baostock    bs.logout()
                                    七、结语

                                    以上就是本次分享的全部内容,如果你有任何疑问或想要分享的经验,评论区永远为你敞开。你的每一个点赞和转发,都是对我们最大的支持和鼓励!

                                    再次感谢你的阅读,期待在下一次分享中与你相见!

                                    精选阅读

                                    python自动化系列:自动屏幕截图工具

                                    python自动化系列:实现一个简单的网络监控工具

                                    python自动化系列:自动抓取网站文章的工具(有知有行-E大)

                                    python自动化系列:一键批量导出Excel工作表为图片,简化报告制作流程

                                    python自动化系列:基于Excel数据自动生成员工工资调整通知

                                    python自动化系列:轻松找出两份word文档的细微差别
                                    python自动化系列:如何使用Python轻松调整视频分辨率至720p
                                    python自动化系列:使用 Pandas 将制表符分隔的文本文件转换为 Excel 文件
                                    python自动化系列:如何批量筛选Excel文件中的“销售数量”数据
                                    python自动化系列:深入Excel数据验证与清洗(行)
                                    python自动化系列:自动化文件备份,守护数据安全的定时任务
                                    python自动化系列:利用Python实现电费通知单自动化生成-高效、精准、个性化
                                    python自动化系列:每天定时提醒员工离职日期,助力人力资源管理

                                    python自动化系列:从DAT到图片-轻松恢复微信聊天记录中的丢失照片

                                    python自动化系列:轻松合并多个Excel文件中的数据

                                    python自动化系列:轻松获取百度热搜Top20条数据

                                    python自动化系列:批量重命名多个 Excel 文件中的工作表

                                    python自动化系列:批量合并文件夹内所有Excel工作簿中指定名称的工作表

                                    python自动化系列:Python助力Excel数据高效拆分与整理

                                    python自动化系列:批量将图片转换为PNG格式

                                    python自动化系列:实现Word文档到PDF格式的批量转换过程

                                    python自动化系列:查找大文件的Python脚本,轻松管理磁盘空间

                                    python自动化系列:轻松将图片批量转换为PDF,图文教程+源码分享

                                    python自动化系列:实现递归批量重命名目录及子目录中的图片文件

                                    python自动化系列:监控指定的Excel文件并在其内容发生变化时同步更新到txt文件

                                    python自动化系列:实现每周日凌晨 2 点自动清理指定文件夹缓存文件

                                    python自动化系列:批量为图片添加边框

                                    python自动化系列:批量修改Word文档中“编程起航”的文本格式

                                    python自动化系列:批量筛选并整合Excel文件中的“钱包”销售记录

                                    最新文章

                                    随机文章