目录

前情回顾

​编辑数据获取与处理

​编辑策略开发环境配置

​编辑双均线策略实现

基础策略结构

回测框架集成

性能优化要点

​编辑完整工作流程


前情回顾

搭建好基础的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.错峰访问

交易时间表


完整工作流程

  1. 通过AKShare获取实时/历史行情数据
  2. 实现本地缓存和自动更新机制
  3. 开发双均线策略核心逻辑
  4. 使用Backtrader进行策略回测
  5. 优化请求频率和异常处理机制
  6. 生成可视化回测报告和绩效指标

在发现复制大段文字能自动粘贴原文链接前,进行了“如何转载他人的文章”的一个尝试:首先,打开目标文章,在浏览器中打开需要被转载的CSDN文章。然后,按下F12键打开开发者模式。接着,定位正文代码,在开发者工具中找到“元素”(Elements)标签页,使用快捷键 Ctrl+F 打开搜索框,输入article_content 进行搜索。最后,复制HTML代码:找到 id="article_content" 或 id="content_views" 的代码块。下面是F12模式的操作界面。

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

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

原文链接:量化交易全面入门指南(2025最新版)_量化交易入门-CSDN博客

Fig.5 量化全流程图

更多推荐