📌导读:接上篇,我们已经完成行情获取、双均线策略编写与基础回测。本篇继续完成参数网格搜索、风控止损、本地私有行情数据库、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
✨实盘部署额外注意事项
- 下单前校验账户可用资金,避免资金不足报单失败;
- 持续监控程序运行日志,捕获网络、接口异常;
- 考虑滑点对策略收益的侵蚀,回测阶段就设置合理滑点参数。
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
原创不易,如果对你有帮助欢迎点赞👍收藏⭐,有问题评论区交流。