[Python]​基于Python的A股双均线策略开发与量化开发交易实践指南

📅 2026/8/24 12:31:12
[Python]​基于Python的A股双均线策略开发与量化开发交易实践指南
目录前情回顾​编辑数据获取与处理​编辑策略开发环境配置​编辑双均线策略实现基础策略结构回测框架集成性能优化要点​编辑完整工作流程前情回顾搭建好基础的Python执行模块后开始补充股票策略、接入实际A股市场的数据集。下面是使用Pycharm调试器执行的双均线交易策略的界面展示。Fig1.双均线策略前端界面Fig.2 策略回测Python运行终端数据获取与处理安装AKShare库获取A股数据pip install akshare配置稳定数据获取方案import akshare as ak stock_data ak.stock_zh_a_hist( symbol000001, perioddaily, start_date20230101, end_date20231231, adjustqfq )实现本地缓存机制import pandas as pd import os def get_cached_data(file_path): if os.path.exists(file_path): return pd.read_csv(file_path) data ak.stock_zh_a_hist(...) data.to_csv(file_path) return data环节一获取A股票所有数据。首先安装akshare三方库。接着导入akshare三方库。import akshare as ak策略开发环境配置如何在旧版本中开发“开始补充股票策略、接入实际A股市场的数据集”的功能首先得处理版本差异的隔离问题于是先写一个Demo验证宏分隔逻辑的正确性下面为验证输出界面。Fig.4 Python宏语法Demo此时23年学习的Python基础开始发挥作用既然Python是通过Tab*n缩进来分隔语义块的那么“如何将历史代码批量放入else宏模块”便有迹可循。首先在 PyCharm 中用来一键美化格式化Python 代码的快捷键是操作系统快捷键组合Windows / LinuxCtrl Alt LmacOSCmd Option L然后全选--Tab键将历史代码批量移入else语义块成功。正当准备编译python ProgrammerWPS旧版出现兼容错误且无法卸载。触发CMD控制语句杀死所有WPS进程PyCharm代码格式化快捷键Windows: CtrlAltLmacOS: CmdOptionL处理旧版本兼容问题taskkill /f /im wps.exe /im wpscenter.exe双均线策略实现基础策略结构# 示例代码框架 class DualMovingAverageStrategy: def __init__(self, short_window5, long_window20): self.short_ma short_window self.long_ma long_window def generate_signals(self, data): data[short_ma] data[close].rolling(self.short_ma).mean() data[long_ma] data[close].rolling(self.long_ma).mean() data[signal] 0 data.loc[data[short_ma] data[long_ma], signal] 1 return data环节二进行双均线策略回测。数据板块datetime open close high low volume0 2026-01-01 100.883183 100.622211 102.024751 100.622211 83701 2026-01-02 101.600693 101.878001 102.702161 101.042040 54662 2026-01-03 102.039085 103.172353 103.891608 101.306357 97293 2026-01-04 103.315741 104.993927 104.993927 101.017948 54764 2026-01-05 104.555795 104.721134 104.863435 103.018389 8575策略板块datetime open close ... Signal Daily_Return Strategy_Return190 2026-07-10 59.546354 59.645863 ... 1 0.032662 0.032662191 2026-07-11 58.894652 58.394644 ... 0 -0.020977 -0.020977192 2026-07-12 60.537032 60.403046 ... 0 0.034394 0.000000193 2026-07-13 59.810484 60.074738 ... 0 -0.005435 -0.000000194 2026-07-14 60.669199 59.751485 ... 0 -0.005381 -0.000000195 2026-07-15 57.821111 58.322093 ... 0 -0.023922 -0.000000196 2026-07-16 58.492415 58.890667 ... 0 0.009749 0.000000197 2026-07-17 58.073435 58.112769 ... 0 -0.013209 -0.000000198 2026-07-18 59.177274 60.360820 ... 0 0.038684 0.000000199 2026-07-19 57.603496 57.776188 ... 0 -0.042820 -0.000000[10 rows x 11 columns]指标板块策略累计收益率: 99.09%基准(买入持有)累计收益率: 62.37%策略最大回撤: -8.65%策略夏普比率: 0.0177交易明细 买入日期 买入价格 卖出日期 卖出价格 毛收益率 净收益率 持仓天数2026-02-17 80.21 2026-02-26 77.26 -3.68% -3.74% 92026-03-15 78.80 2026-03-23 76.72 -2.64% -2.70% 82026-05-12 64.12 2026-05-23 63.54 -0.91% -0.97% 112026-06-19 55.15 2026-07-11 58.34 5.78% 5.72% 22 交易统计分析 总交易次数: 4胜率: 25.00%平均每笔净收益率: -0.42%盈亏比: 231.58%最大单笔盈利: 0.0572最大单笔亏损: -0.0374平均持仓天数: 12.5000展示板块回测框架集成Backtrader基础配置import backtrader as bt class DualMACrossover(bt.Strategy): params ( (short_period, 5), (long_period, 20) ) def __init__(self): self.short_ma bt.indicators.SMA(periodself.p.short_period) self.long_ma bt.indicators.SMA(periodself.p.long_period) self.crossover bt.indicators.CrossOver(self.short_ma, self.long_ma)环节三backtrader的回测用法。有兴趣的关注后续更新可参考下面相关链接进行了解。Backtrader 官网https://www.backtrader.com/docu/plotting/plotting/原文链接https://blog.csdn.net/xiaowu1997/article/details/122629350性能优化要点请求频率控制方案import time import random time.sleep(random.uniform(0.5, 2)) # 随机延时代理IP配置方法proxies { http: http://proxy_ip:port, https: https://proxy_ip:port }为了能稳定且长期使用akshare三方库需要注意下面几点1.东方财富的接口stock_zh_a_hist ak.stock_zh_a_hist(symbol000001, perioddaily, start_date20230101, end_date20231231, adjustqfq)2.加入延时import time time.sleep(1) # 每次请求间隔1秒以上 #替代方案 import random time.sleep(random.uniform(0.5, 2)) # 随机延时3.使用代理 IPproxies { http: http://你的代理IP:端口, https: https://你的代理IP:端口 }4.缓存数据import pandas as pd # 首次获取后保存到本地 df.to_csv(stock_data.csv, encodingutf-8-sig) # 下次优先读取本地文件读取本地CSV文件的代码如下## 基础读取 import pandas as pd # 读取之前保存的CSV文件 df pd.read_csv(stock_data.csv, encodingutf-8-sig) # 查看数据 print(df.head()) print(df.info()) ## 完整的优先读取本地文件的逻辑 import pandas as pd import os # 文件路径 file_path stock_data.csv # 判断文件是否存在 if os.path.exists(file_path): # 优先读取本地文件 df pd.read_csv(file_path, encodingutf-8-sig) print(从本地文件读取成功) else: # 本地文件不存在从网络获取 import akshare as ak df ak.stock_zh_a_hist(symbol000001, perioddaily, start_date20230101, end_date20231231, adjustqfq) # 保存到本地 df.to_csv(file_path, encodingutf-8-sig, indexFalse) print(从网络获取并保存到本地)## 带数据时效性检查的版本 import pandas as pd import os import time from datetime import datetime file_path stock_data.csv cache_days 1 # 缓存有效期天数 def get_stock_data(): # 检查本地文件是否存在且未过期 if os.path.exists(file_path): file_modified os.path.getmtime(file_path) days_old (time.time() - file_modified) / 86400 if days_old cache_days: df pd.read_csv(file_path, encodingutf-8-sig) print(f使用缓存数据{datetime.fromtimestamp(file_modified).strftime(%Y-%m-%d)}) return df # 本地文件不存在或已过期重新获取 print(正在从网络获取最新数据...) import akshare as ak df ak.stock_zh_a_hist(symbol000001, perioddaily, start_date20230101, end_date20231231, adjustqfq) df.to_csv(file_path, encodingutf-8-sig, indexFalse) print(数据已更新并保存到本地) return df # 使用 df get_stock_data() ## 常用参数说明 # 基本读取 df pd.read_csv(stock_data.csv, encodingutf-8-sig) # 常用参数 df pd.read_csv( stock_data.csv, encodingutf-8-sig, # 编码格式与保存时一致 index_col0, # 将第0列设为索引 parse_dates[日期], # 将日期列解析为datetime类型 dtype{股票代码: str} # 指定列的数据类型 )5.错峰访问交易时间表完整工作流程通过AKShare获取实时/历史行情数据实现本地缓存和自动更新机制开发双均线策略核心逻辑使用Backtrader进行策略回测优化请求频率和异常处理机制生成可视化回测报告和绩效指标在发现复制大段文字能自动粘贴原文链接前进行了“如何转载他人的文章”的一个尝试首先打开目标文章在浏览器中打开需要被转载的CSDN文章。然后按下F12键打开开发者模式。接着定位正文代码在开发者工具中找到“元素”(Elements)标签页使用快捷键 CtrlF 打开搜索框输入article_content 进行搜索。最后复制HTML代码找到 idarticle_content 或 idcontent_views 的代码块。下面是F12模式的操作界面。Fig.3 目标文章的开发者模式参考量化流程环节继续开展独立研究。下图为量化全流程图。原文链接量化交易全面入门指南2025最新版_量化交易入门-CSDN博客Fig.5 量化全流程图