用JoinQuant写你的第一个量化策略:从Python零基础到跑通回测(附完整代码)

张开发
2026/4/18 2:43:19 15 分钟阅读

分享文章

用JoinQuant写你的第一个量化策略:从Python零基础到跑通回测(附完整代码)
用JoinQuant写你的第一个量化策略从Python零基础到跑通回测附完整代码第一次听说量化交易时很多人脑海中会浮现出华尔街精英对着六个屏幕同时操作的画面。但事实上随着像JoinQuant这样的在线量化平台出现普通人用十几行Python代码就能实现自动化投资策略。本文将带你从零开始用最直观的方式体验量化交易的完整流程——即使你昨天才安装Python。1. 准备工作认识JoinQuant平台JoinQuant是国内领先的量化研究平台提供从数据获取、策略编写到回测验证的一站式服务。它的核心优势在于零配置环境无需自己搭建数据接口或交易系统丰富的历史数据包含A股、ETF、期货等市场数据可视化回测直观展示策略表现的关键指标提示注册后建议先浏览策略研究页面的公开策略感受量化策略的多样性平台界面主要分为四个区域策略列表管理已有策略代码编辑器编写策略的核心区域回测结果展示收益曲线和各项指标日志输出调试策略的重要工具# 最简单的策略框架示例 def initialize(context): pass def handle_data(context, data): pass2. 编写第一个策略十行代码实现均线交易我们从最经典的金叉死叉策略入手。这个策略的逻辑是当短期均线上穿长期均线时买入金叉当短期均线下穿长期均线时卖出死叉def initialize(context): # 设置要交易的股票这里以平安银行为例 g.security 000001.XSHE # 设置均线周期 g.short_window 5 g.long_window 20 def handle_data(context, data): # 获取历史数据 prices history(g.long_window, 1d, close, [g.security]) # 计算均线 short_ma prices[g.security].rolling(windowg.short_window).mean() long_ma prices[g.security].rolling(windowg.long_window).mean() # 交易逻辑 if short_ma[-1] long_ma[-1] and short_ma[-2] long_ma[-2]: order_target(g.security, 10000) # 买入10000元 elif short_ma[-1] long_ma[-1] and short_ma[-2] long_ma[-2]: order_target(g.security, 0) # 清仓关键点解析history()函数获取历史数据rolling().mean()计算移动平均order_target()执行交易指令3. 运行回测与结果解读点击运行回测按钮后平台会生成详细的报告。新手最需要关注的三个指标是指标名称含义理想范围年化收益率策略的年平均收益10%最大回撤最大亏损幅度30%夏普比率风险调整后收益1注意第一次回测时建议选择2015-2020年这样的完整周期避免特殊行情的影响常见的回测问题排查没有交易记录检查交易条件是否过于严格收益曲线异常确认是否考虑了交易手续费数据缺失确保股票代码正确且在该时间段已上市# 添加交易成本的改进版初始化 def initialize(context): set_option(use_real_price, True) # 使用真实价格 set_order_cost(OrderCost( open_tax0, close_tax0.001, # 印花税 open_commission0.0003, close_commission0.0003, # 佣金 min_commission5), typestock) # 最低佣金4. 策略优化与进阶方向当基础策略能稳定运行后可以考虑以下优化方向4.1 增加过滤条件排除ST股票filter_st_stocks()避开涨跌停get_price(security, end_datecontext.current_dt, frequencydaily, fields[high_limit, low_limit])4.2 多股票策略将单一股票扩展为股票池def initialize(context): g.stock_pool [000001.XSHE, 600000.XSHG] g.position_size 0.2 # 每只股票仓位占比 def handle_data(context, data): for stock in g.stock_pool: prices history(20, 1d, close, [stock]) # ...其余逻辑类似单股票策略 order_target_value(stock, context.portfolio.total_value * g.position_size)4.3 风险控制模块添加止损逻辑def handle_data(context, data): for stock in context.portfolio.positions: cost context.portfolio.positions[stock].avg_cost current data[stock].close if current cost * 0.9: # 亏损超过10%时止损 order_target(stock, 0) log.info(止损卖出{}.format(stock))5. 从回测到实盘的注意事项当策略准备投入实盘时需要特别注意滑点影响设置set_slippage()模拟成交价偏差交易限制A股的T1制度需要在代码中体现资金管理实盘建议先用小资金测试策略过拟合避免在历史数据上表现太好但在实盘失效# 实盘前建议添加的配置 def initialize(context): set_benchmark(000300.XSHG) # 设置沪深300为基准 set_option(avoid_future_data, True) # 防止未来函数 log.set_level(order, error) # 设置日志级别第一次看到自己的策略自动执行买卖操作时那种成就感是难以言表的。建议从简单的策略开始逐步增加复杂度——我见过太多新手因为一开始追求完美策略而放弃。记住量化交易的核心不是寻找圣杯而是建立可重复、可验证的投资流程。

更多文章