长城证券量化怎么写策略做回测?2026年GWT策略实战指南(附代码详解)
发布时间:3小时前阅读:29
开通了长城证券的 GWT,打开策略模块却懵了:策略到底怎么写?参数填什么?代码怎么敲?回测结果怎么看、怎么判断好坏?网上教程要么太浅、要么直接甩一段代码看不懂。
今天就把从"选策略→写代码→跑回测→看结果→优化→上实盘"的每一步都拆开写细,代码逐行解释,参数给具体范围,结果给好坏标准,你照着这篇就能动手做出第一个策略。先说明:GWT 内核与 QMT 完全一致,均由迅投公司开发,功能、接口相通,网上 QMT 的策略代码在 GWT 上基本能直接借鉴(具体接口以 GWT 官方文档为准)。
一、动手前先搞懂:策略和回测是什么
· 策略:把交易逻辑写成代码。比如"5日均线上穿20日均线买入、下穿卖出",写成代码就是策略。
· 回测:用历史数据(比如过去1年的行情)跑一遍策略,看它过去赚不赚钱、风险多大。
· 一句话:策略是"怎么交易",回测是"这套方法过去行不行"。
新手第一个策略建议选"双均线策略":逻辑最简单(金叉买、死叉卖)、参数最少(只有两个均线周期)、容易跑通完整流程。下面全程以双均线策略为例。
二、第一步:用 GWT 内置模板跑通第一个回测(不会编程也能做)
先别写代码,用内置模板跑通流程,理解"填参数→跑回测→看结果"的链路。
操作步骤(每步写细)
1. 打开 GWT → 登录资金账号;
2. 找到策略模块:在主界面找"策略"/"策略管理"/"量化"入口(不同版本叫法略有不同);
3. 找内置模板:在策略模块里找"策略模板"/"示例策略"/"系统策略";
4. 选"双均线策略"模板;
5. 填参数(这些参数决定策略怎么跑,很重要):
| 参数 | 填什么 | 说明 |
| 交易品种 | 如 510300(沪深300ETF) | 新手先用ETF,波动小、好理解 |
| 短期均线周期 | 5 | 近5日均价 |
| 长期均线周期 | 20 | 近20日均价 |
| 回测开始时间 | 如 2025-01-01 | 建议至少回测1年 |
| 回测结束时间 | 如 2025-12-31 | 覆盖不同行情更靠谱 |
| 初始资金 | 100000 | 10万起步 |
| 手续费 | 万分之3(0.0003) | 按实际佣金填,影响成本 |
6. 点"回测"/"运行回测" → GWT 用历史数据跑一遍;
7. 看结果:会弹出收益率、最大回撤、交易次数等(下文第五步详解怎么判断好坏)。
避坑:
· 品种别选太冷门的股票,成交不活跃的回测结果会失真,新手用宽基ETF(510300、510500等)更稳;
· 回测时间至少1年,太短不具统计意义,最好覆盖上涨和下跌两种行情;
· 手续费一定要填,不填会高估收益(默认可能为0,显得策略很赚钱,实盘全被手续费吃掉)。
这一步的目标:跑通流程,看到回测结果,不用管策略好不好。
三、第二步:自己写双均线策略(会基础 Python,代码逐行解释)
跑通模板后,就可以自己写策略了。下面是一份接近可用的双均线策略代码(接口名以 GWT 官方文档为准,这里用通用 QMT 风格示意),逐行解释:
# ===== 初始化:策略开始时执行一次,设置参数 =====
def init(context):
context.stock = '510300' # 交易品种:沪深300ETF
context.short = 5 # 短期均线周期:5日
context.long = 20 # 长期均线周期:20日
context.cash_per_trade = 50000 # 每次买入用多少资金(约半仓)
# ===== 每个交易日收盘时执行一次 =====
def handle_bar(context):
# 1. 取近N日的收盘价,算均线
hist = get_history(context.stock, count=context.long + 1)
closes = [bar['close'] for bar in hist] # 取出收盘价
short_ma = sum(closes[-context.short:]) / context.short # 5日均价
long_ma = sum(closes[-context.long:]) / context.long # 20日均价
# 2. 取上一根K线的均线值,用来判断"是否刚刚金叉/死叉"
prev_short = sum(closes[-context.short-1:-1]) / context.short
prev_long = sum(closes[-context.long-1:-1]) / context.long
# 3. 查当前持仓
position = get_position(context.stock)
# 4. 金叉买入:昨天短均线还在长均线下方,今天穿上去 = 金叉
if prev_short <= prev_long and short_ma > long_ma and position == 0:
buy_amount = context.cash_per_trade / closes[-1] # 能买多少股
order_target_percent(context.stock, 0.5) # 买入到约50%仓位
# 5. 死叉卖出:昨天短均线还在长均线上方,今天穿下去 = 死叉
elif prev_short >= prev_long and short_ma < long_ma and position > 0:
order_target_percent(context.stock, 0) # 清仓卖出
逐行解释:
· init:策略启动时跑一次,用来设置参数(品种、均线周期、每次买多少)。context 是存放参数的容器。
· handle_bar:每个交易日跑一次,是策略的核心。
· get_history:取历史K线数据,count 是取多少根。取 long+1 根是为了算今天的均线和昨天的均线。
· closes[-context.short:]:Python 切片,取最后5个收盘价(最近5日)。
· prev_short / prev_long:昨天的均线值,和今天的对比,才能判断"刚刚发生金叉",而不是"已经金叉好几天"。
· get_position:查当前持有多少股。
· order_target_percent:把仓位调到目标比例,0.5 = 半仓,0 = 清仓。这个接口比"买多少股"更方便。
关键逻辑(新手必须理解)
金叉 = 昨天短均线≤长均线,今天短均线>长均线(刚刚穿上去),这才是"买入信号"。如果只看"短均线>长均线",可能金叉好几天了才买,错过启动点。死叉同理反过来。
避坑:
· 接口名以 GWT 官方文档为准,上面是 QMT 通用风格示意,实际函数名可能略有差异,照着 GWT 自带模板的接口名改;
· 先复制 GWT 自带的示例策略,在它基础上改,比从零写更不容易报错;
· 报错了先看报错信息,常见的是"取不到数据"(品种代码不对)、"数组越界"(取的历史数据不够);
· 不会 Python 的朋友:把上面代码复制进去,改改品种代码和均线周期,能跑就行,慢慢再学语法。
四、第三步:跑回测(怎么设置回测参数)
代码写好,回测参数设置也很关键:
1. 回测区间:至少1年,最好覆盖上涨、下跌、震荡三种行情(如2023-2025);
2. 初始资金:10万起步,太少买不了多少;
3. 手续费:填实际佣金(如万分之3),不填会严重高估收益;
4. 滑点:建议设千分之1(0.001),模拟实盘成交价和回测价的偏差;
5. 运行频率:双均线策略用日级别(每天收盘跑一次)就够了,别用分钟级,太慢且没意义。
设置好点"回测",等它跑完出结果。
避坑:
· 回测跑很慢?检查是不是用了分钟级频率或太多品种;
· 报"数据不足"?把回测开始时间往后调,或确认品种代码对不对。
五、第四步:看懂回测结果(每个指标怎么判断好坏)
回测跑完会出一堆指标,新手重点看这几个,每个都有好坏标准:
| 指标 | 是什么 | 多少算好 | 多少算差 |
| 总收益率 | 回测区间总盈亏 | 正收益,且跑赢同期沪深300 | 负收益,或远低于沪深300 |
| 年化收益率 | 换算成一年的收益率 | 10%以上算不错(新手) | 低于银行理财就没意义 |
| 最大回撤 | 从最高点到最低点最大跌幅 | -15%以内算稳 | 超过-30%风险太大 |
| 胜率 | 盈利交易占比 | 50%以上算可以 | 低于40%要小心(靠大盈小亏) |
| 交易次数 | 回测期间交易几次 | 20-100次有统计意义 | 太少(<10)或太多(>200)都不好 |
| 夏普比率 | 每承担1单位风险得多少收益 | 大于1算好 | 小于0.5风险收益不对等 |
判断策略好坏的核心标准
新手重点看"总收益率 + 最大回撤"两个:
· 收益率为正 + 最大回撤在自己能承受范围(如-15%以内)= 策略基本可用;
· 收益率很高但回撤也很大(如收益50%但回撤-40%)= 风险太大,别上实盘;
· 收益率为负 = 策略逻辑有问题,回去改。
避坑:
· 收益率高得离谱(如年化200%)要警惕,很可能是过度拟合或用了未来数据,实盘必亏;
· 胜率高不等于赚钱,胜率90%但每次赚1%亏20%照样亏,要看总收益;
· 交易次数太少(如1年只交易3次)结果不可靠,碰巧成分大。
六、第五步:优化策略(具体怎么改)
回测结果不理想,按这几个方向优化,每个都给具体操作:
1. 调均线周期
试不同组合,看哪个表现好。常见组合:
· 5日/20日(经典)
· 10日/30日(更稳健,信号少)
· 5日/10日(更灵敏,信号多)
改法:把代码里 context.short 和 context.long 改成新数字,重新回测对比。
2. 加止盈止损
控制单笔风险。在代码里加:
# 在 handle_bar 里,卖出条件后加:
# 止盈:盈利8%卖出
if position > 0 and 当前价格 >= 买入价 * 1.08:
order_target_percent(context.stock, 0)
# 止损:亏损5%卖出
if position > 0 and 当前价格 <= 买入价 * 0.95:
order_target_percent(context.stock, 0)
3. 加过滤条件(减少假信号)
比如"只在放量时金叉才买"——加个成交量条件:
# 取成交量,今天量大于5日均量才算"放量"
volume = closes今天的成交量
avg_volume = 近5日平均成交量
if 金叉 and volume > avg_volume:
买入
4. 多周期多品种验证
· 换不同时间段(如2020-2022、2023-2025)回测,看策略是否稳定;
· 换不同品种(510500、159915等)测试,看是否只在某只ETF上有效。
警惕过度拟合
过度拟合 = 参数调到完美适配历史,实盘必亏。判断方法:如果参数稍微改一下(5日改成6日)策略就表现很差,说明过度拟合了。策略逻辑要能解释"为什么这么交易",而不是单纯堆参数碰运气。
七、第六步:模拟盘验证再到实盘
回测好了,千万别直接上实盘,按这三步:
1. 模拟盘验证
· GWT 切换到模拟盘环境(用虚拟资金);
· 让策略按真实行情跑 1—2周;
· 看实际成交价、滑点和回测是否一致;
· 确认没有异常(如频繁撤单、成交不了)。
2. 小仓位实盘
· 模拟跑顺了,切到实盘账户;
· 用小仓位(如总资金的10%-20%)先跑;
· 实盘第一件事:在风控模块设 单笔最大仓位、止损线(如亏损5%)、最大亏损。
3. 持续监控
· 实盘后定期看表现(每天/每周看一次);
· 市场环境变了(如从震荡转单边下跌)及时调整或暂停策略;
· 策略连续亏损超过预期,先暂停找原因。
避坑:
· 回测≠实盘:实盘有滑点、延迟、流动性影响,回测赚钱实盘亏钱很常见;
· 别一上来满仓:先用小钱验证实盘表现,稳定了再加仓;
· 风控永远第一位:宁可少赚,也别让单次亏损失控。
八、策略实战注意事项
1. 从双均线起步:新手别碰复杂策略,先跑通双均线,理解完整流程再进阶。
2. 逻辑比代码重要:理解"为什么金叉买、死叉卖",比记住代码更有价值。
3. 警惕过度拟合:参数别调得太死,能解释逻辑才行。
4. 回测≠实盘:滑点、延迟、流动性都会让实盘和回测有差距。
5. 量化不是稳赚不赔:策略会失效,市场风险永远在,不存在"保本高收益"的策略。
6. 有问题问客户经理:代码报错、接口不会用、回测异常,随时联系客户经理。
写策略、做回测,按这篇一步步来:用模板跑通流程 → 复制代码改参数 → 跑回测 → 看"收益率+最大回撤"判断好坏 → 调参数/加止盈止损优化 → 模拟1—2周 → 小仓位实盘,新手也能做出自己的第一个策略。GWT 内核同 QMT、由迅投开发,网上 QMT 策略代码和教程都能直接借鉴,资源很充足。
如果你对量化策略感兴趣,又一直被门槛挡在门外,不妨通过叩富问财平台对接长城证券官方认证客户经理(叩富问财可对接持牌客户经理),开通 GWT,开始你的策略实战之旅。
温馨提示:投资有风险,选择需谨慎。量化交易涉及策略风险、技术风险及市场风险,请根据自身情况谨慎决策。本文不构成投资建议,策略代码为示意(接口名以 GWT 官方文档为准),实际使用请结合 GWT 官方文档和自带模板调整。
温馨提示:投资有风险,选择需谨慎。
下一篇资讯:
暂无下一篇


问一问

+微信
分享该文章
