[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(
symbol="000001",
period="daily",
start_date="20230101",
end_date="20231231",
adjust="qfq"
)
实现本地缓存机制
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 / Linux |
Ctrl + Alt + L |
|
macOS |
Cmd + Option + L |
然后,全选-->Tab键将历史代码批量移入else语义块,成功。
正当准备编译python Programmer,WPS旧版出现兼容错误,且无法卸载。触发CMD控制语句杀死所有WPS进程:
PyCharm代码格式化快捷键
- Windows: Ctrl+Alt+L
- macOS: Cmd+Option+L
处理旧版本兼容问题
taskkill /f /im wps.exe /im wpscenter.exe
双均线策略实现
基础策略结构
# 示例代码框架
class DualMovingAverageStrategy:
def __init__(self, short_window=5, long_window=20):
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 volume
0 2026-01-01 100.883183 100.622211 102.024751 100.622211 8370
1 2026-01-02 101.600693 101.878001 102.702161 101.042040 5466
2 2026-01-03 102.039085 103.172353 103.891608 101.306357 9729
3 2026-01-04 103.315741 104.993927 104.993927 101.017948 5476
4 2026-01-05 104.555795 104.721134 104.863435 103.018389 8575
=策略板块=
datetime open close ... Signal Daily_Return Strategy_Return
190 2026-07-10 59.546354 59.645863 ... 1 0.032662 0.032662
191 2026-07-11 58.894652 58.394644 ... 0 -0.020977 -0.020977
192 2026-07-12 60.537032 60.403046 ... 0 0.034394 0.000000
193 2026-07-13 59.810484 60.074738 ... 0 -0.005435 -0.000000
194 2026-07-14 60.669199 59.751485 ... 0 -0.005381 -0.000000
195 2026-07-15 57.821111 58.322093 ... 0 -0.023922 -0.000000
196 2026-07-16 58.492415 58.890667 ... 0 0.009749 0.000000
197 2026-07-17 58.073435 58.112769 ... 0 -0.013209 -0.000000
198 2026-07-18 59.177274 60.360820 ... 0 0.038684 0.000000
199 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% 9
2026-03-15 78.80 2026-03-23 76.72 -2.64% -2.70% 8
2026-05-12 64.12 2026-05-23 63.54 -0.91% -0.97% 11
2026-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(period=self.p.short_period)
self.long_ma = bt.indicators.SMA(period=self.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(symbol="000001", period="daily", start_date="20230101", end_date="20231231", adjust="qfq")
2.加入延时
import time
time.sleep(1) # 每次请求间隔1秒以上
#替代方案
import random
time.sleep(random.uniform(0.5, 2)) # 随机延时
3.使用代理 IP
proxies = {
'http': 'http://你的代理IP:端口',
'https': 'https://你的代理IP:端口'
}
4.缓存数据
import pandas as pd
# 首次获取后保存到本地
df.to_csv('stock_data.csv', encoding='utf-8-sig')
# 下次优先读取本地文件
读取本地CSV文件的代码如下:
## 基础读取
import pandas as pd
# 读取之前保存的CSV文件
df = pd.read_csv('stock_data.csv', encoding='utf-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, encoding='utf-8-sig')
print("从本地文件读取成功")
else:
# 本地文件不存在,从网络获取
import akshare as ak
df = ak.stock_zh_a_hist(symbol="000001", period="daily", start_date="20230101", end_date="20231231", adjust="qfq")
# 保存到本地
df.to_csv(file_path, encoding='utf-8-sig', index=False)
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, encoding='utf-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(symbol="000001", period="daily", start_date="20230101", end_date="20231231", adjust="qfq")
df.to_csv(file_path, encoding='utf-8-sig', index=False)
print("数据已更新并保存到本地")
return df
# 使用
df = get_stock_data()
## 常用参数说明
# 基本读取
df = pd.read_csv('stock_data.csv', encoding='utf-8-sig')
# 常用参数
df = pd.read_csv(
'stock_data.csv',
encoding='utf-8-sig', # 编码格式(与保存时一致)
index_col=0, # 将第0列设为索引
parse_dates=['日期'], # 将日期列解析为datetime类型
dtype={'股票代码': str} # 指定列的数据类型
)
5.错峰访问
交易时间表

完整工作流程
- 通过AKShare获取实时/历史行情数据
- 实现本地缓存和自动更新机制
- 开发双均线策略核心逻辑
- 使用Backtrader进行策略回测
- 优化请求频率和异常处理机制
- 生成可视化回测报告和绩效指标
在发现复制大段文字能自动粘贴原文链接前,进行了“如何转载他人的文章”的一个尝试:首先,打开目标文章,在浏览器中打开需要被转载的CSDN文章。然后,按下F12键打开开发者模式。接着,定位正文代码,在开发者工具中找到“元素”(Elements)标签页,使用快捷键 Ctrl+F 打开搜索框,输入article_content 进行搜索。最后,复制HTML代码:找到 id="article_content" 或 id="content_views" 的代码块。下面是F12模式的操作界面。

Fig.3 目标文章的开发者模式

参考量化流程环节,继续开展独立研究。下图为量化全流程图。

原文链接:量化交易全面入门指南(2025最新版)_量化交易入门-CSDN博客
Fig.5 量化全流程图
更多推荐





所有评论(0)