miniqmt 行情的备选方案 ---tdxrs(下)

📌导读:接上篇,我们已经完成行情获取、双均线策略编写与基础回测。本篇继续完成参数网格搜索、风控止损、本地私有行情数据库、CLI 命令行工具,完成从回测到接近实盘的完整链路。 上篇传送门:《miniqmt 行情的备选方案 ---tdxrs(上)》

四、场景演示与完整代码(续)

5. 参数优化:网格搜索均线组合

网格搜索遍历多组快慢均线参数,对比每组参数回测后的夏普比率,从中挑选表现较优的均线组合。

⚠️重要提醒:网格搜索很容易造成过拟合,在历史数据表现完美的参数,未来不一定有效,优化完成后务必使用样本外数据做二次验证。

bash 复制代码
import backtrader.analyzers as btanalyzers

# 待遍历参数:(短期均线,长期均线)
param_grid = [
    (10, 30),
    (20, 50),
    (15, 60),
    (30,80)
]

best_sharpe = -999
best_params = None

for fast_period, slow_period in param_grid:
    cerebro = bt.Cerebro()
    data = bt.feeds.PandasData(dataname=df)
    cerebro.adddata(data)
    cerebro.addstrategy(SmaCrossStrategy, fast=fast_period, slow=slow_period)

    # 加入夏普分析器
    cerebro.addanalyzer(btanalyzers.SharpeRatio, _name='sharpe', riskfreerate=0.03)
    cerebro.broker.set_cash(100000)

    result = cerebro.run()
    sharpe = result[0].analyzers.sharpe.get_analysis()['sharperatio']

    print(f"fast:{fast_period}, slow:{slow_period}, 夏普比率:{sharpe:.3f}")
    if sharpe is not None and sharpe > best_sharpe:
        best_sharpe = sharpe
        best_params = (fast_period, slow_period)

print(f"\n最优参数组合 fast={best_params[0]}, slow={best_params[1]},最优夏普={best_sharpe:.3f}")

6. 风险管理:止损与仓位控制

回测跑通不等于可以直接实盘。止损和仓位管理是保护本金最重要的环节。 下面在策略内部增加固定比例止损,同时根据账户资金动态计算下单仓位。

bash 复制代码
class SmaCrossRiskStrategy(bt.Strategy):
    params = (
        ('fast', 20),
        ('slow', 50),
        ('stop_loss_pct', 0.02), # 2%固定止损
    )

    def __init__(self):
        self.sma_fast = bt.indicators.SMA(period=self.p.fast)
        self.sma_slow = bt.indicators.SMA(period=self.p.slow)
        self.order = None
        self.stop_order = None

    def next(self):
        # 如果有未完成订单,跳过本次
        if self.order:
            return

        if not self.position:
            # 金叉信号,开多仓
            if self.sma_fast[0] > self.sma_slow[0] and self.sma_fast[-1] <= self.sma_slow[-1]:
                # 动态仓位,使用账户70%资金
                size = int((self.broker.getvalue() * 0.7) / self.data.close[0])
                self.order = self.buy(size=size)
        else:
            # 死叉直接平仓
            if self.sma_fast[0] < self.sma_slow[0] and self.sma_fast[-1] >= self.sma_slow[-1]:
                self.order = self.close()

    # 订单通知回调,开仓成功后设置止损单
    def notify_order(self, order):
        if order.status == order.Completed:
            if order.isbuy() and not self.stop_order:
                stop_price = order.executed.price * (1 - self.p.stop_loss_pct)
                self.stop_order = self.sell(exectype=bt.Order.Stop, price=stop_price, size=order.executed.size)
        self.order = None

✨实盘部署额外注意事项

  1. 下单前校验账户可用资金,避免资金不足报单失败;
  2. 持续监控程序运行日志,捕获网络、接口异常;
  3. 考虑滑点对策略收益的侵蚀,回测阶段就设置合理滑点参数。

7. 私人数据库与 CLI:把数据留在本地

tdxrs内置Downloader下载器,可以批量下载全市场日线 K 线保存至本地磁盘,搭配DailyBarReader实现高速读取,搭建属于自己的私有量化数据库,不再每次远程请求行情服务器。

bash 复制代码
from tdxrs import Downloader, DailyBarReader

# 批量下载全市场日线数据到本地目录
downloader = Downloader(save_dir="./tdx_data")
downloader.download_all_stock_daily()

# 本地高速读取日线数据
reader = DailyBarReader("./tdx_data")
df_local = reader.read_stock_daily("600519")
print(df_local.head())

🚀无需编写 Python 代码,还可以直接在终端使用内置 CLI 命令查询行情:

bash 复制代码
# 查看帮助
tdxrs --help
# 获取指定股票日线
tdxrs bars SH 600519 daily --count 200

五、全文总结

tdxrs基于 Rust 重写,相比传统 Python 解析库拥有9‑11 倍本地解析性能,完整支持 A 股、ETF、LOF、REITs 等各类品种行情,是 miniQMT 行情接口关停之后,非常理想的替代行情底座。

配合 Python 生态:Pandas做数据清洗、TA‑Lib计算指标、Backtrader完成回测,我们可以实现一套完整链路:

数据获取 → 指标计算 → 生成交易信号 → 策略回测评估 → 参数寻优 → 风控加固 → 本地私有数据库

本案例演示的双均线只是趋势跟踪策略的入门,基于这套行情底座,还可以继续拓展开发均值回归、突破交易、配对交易、统计套利、多因子选股等各类量化策略。

💡提示:回测结果不代表未来收益,任何策略投入实盘前务必做好充分验证。


标签#量化交易 #tdxrs #miniqmt替代 #python量化 #backtrader

原创不易,如果对你有帮助欢迎点赞👍收藏⭐,有问题评论区交流。

相关推荐
2601_962381582 小时前
Python爬虫requests框架详解!零基础学会网络请求,抓取全网数据
爬虫·python·网络请求·数据抓取·requests框架
李可以量化2 小时前
miniqmt 行情的备选方案 ---tdxrs(上)
python
Cenxi2 小时前
f-string 完全手册:60 题从入门到实战
python
2601_962299882 小时前
Python编写Linux命令指南
linux·python·开发·命令·指南
此冬歌咏2 小时前
自动化服务器运维监控系统(python+shell)
linux·运维·服务器·开发语言·python·自动化
zhanghaha13142 小时前
Python进阶教程:23_Scrapy 爬虫框架 零基础超详细教程
python·信息可视化
爱读源码的大都督3 小时前
DeepSeek面试官问:生产RAG系统回答不准确,该如何定位和优化?这样回答,能让面试官当场给你Offer!
java·后端·python
“AI国潮设计-小江”3 小时前
【Python实战】SDXL精准控制“普宁英歌舞×星空蛋糕”IP落地,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc
k4m7v2pz3 小时前
从 Python 搬到 Rust:pyglet MIDI DAW 变成 egui 鬼畜采样器的迁移复盘
开发语言·python·rust