


实现过程
一、导入必要的库
import baostock as bsimport pandas as pdimport numpy as npimport matplotlib.pyplot as plt
# 登录baostockdef login_baostock():lg = bs.login()if lg.error_code != '0':print(f"登录失败,错误代码:{lg.error_code}, 错误信息:{lg.error_msg}")return Falseprint("登录成功")return True
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
# 计算价差和标准化价差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_stdreturn spread, normalized_spread
# 生成交易信号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并做空股票1for i in range(len(normalized_spread)):if position == 0:if normalized_spread[i] > entry_threshold:signals.iloc[i] = -1 # 做空股票1,做多股票2position = -1elif normalized_spread[i] < -entry_threshold:signals.iloc[i] = 1 # 做多股票1,做空股票2position = 1elif position == 1:if normalized_spread[i] < exit_threshold:signals.iloc[i] = 0 # 平仓position = 0elif position == -1:if normalized_spread[i] > -exit_threshold:signals.iloc[i] = 0 # 平仓position = 0return signals
# 主程序if __name__ == "__main__":# 登录baostockifnotlogin_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()# 注销baostockbs.logout()
以上就是本次分享的全部内容,如果你有任何疑问或想要分享的经验,评论区永远为你敞开。你的每一个点赞和转发,都是对我们最大的支持和鼓励!
再次感谢你的阅读,期待在下一次分享中与你相见!
精选阅读
python自动化系列:自动抓取网站文章的工具(有知有行-E大)
python自动化系列:一键批量导出Excel工作表为图片,简化报告制作流程
python自动化系列:基于Excel数据自动生成员工工资调整通知
python自动化系列:从DAT到图片-轻松恢复微信聊天记录中的丢失照片
python自动化系列:批量重命名多个 Excel 文件中的工作表
python自动化系列:批量合并文件夹内所有Excel工作簿中指定名称的工作表
python自动化系列:Python助力Excel数据高效拆分与整理
python自动化系列:实现Word文档到PDF格式的批量转换过程
python自动化系列:查找大文件的Python脚本,轻松管理磁盘空间
python自动化系列:轻松将图片批量转换为PDF,图文教程+源码分享
python自动化系列:实现递归批量重命名目录及子目录中的图片文件
python自动化系列:监控指定的Excel文件并在其内容发生变化时同步更新到txt文件
python自动化系列:实现每周日凌晨 2 点自动清理指定文件夹缓存文件