楼主: zy727326192
5339 2

[程序化交易] 量化,海龟交易法则基本原理,如何实现海龟交易策略。 [推广有奖]

  • 0关注
  • 0粉丝

学前班

50%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0.0002
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
1 小时
注册时间
2021-10-1
最后登录
2022-3-14

楼主
zy727326192 发表于 2022-3-14 14:10:27 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
原文地址:https://www.fmz.cn/digest-topic/8978什么是海龟策略?

几乎所有的宽客(Quant)都听说过海龟交易策略,该策略以海龟交易法则为核心。海龟交易法则,起源于八十年代的美国,是一套简单有效的交易法则。这个法则以及使用这个法则的人的故事被写成了一本书——《海龟交易法则》,这是一本入门量化投资的经典书籍。

股票证券的程序化、量化交易以前门槛可不低,以前软件支持少,账户开户门槛极高。FMZ.CN(国内站)支持富途证券、中泰XTP,开通了富途证券就可以很方便的做程序化模拟盘、实盘测试。本篇我们就一起学习设计一个股票版本的多品种海龟交易策略,初期我们主要基于回测系统进行设计、研究,慢慢的扩展至富途证券的模拟盘(模拟账户)。

策略设计:

策略架构我们参考http://FMZ.CN上开源的「商品期货多品种海龟策略」。和商品期货版本一样,我们设计一个海龟交易逻辑管理对象的构造函数TTManager。构造的对象(obj)用来操作、管理每个股票的海龟交易逻辑的执行。

  1. var TTManager = {
  2.     New: function(needRestore, symbol, initBalance, keepBalance, riskRatio, atrLen, enterPeriodA, leavePeriodA, enterPeriodB, leavePeriodB, useFilter,
  3.         multiplierN, multiplierS, maxLots) {

  4.         // subscribe
  5.         var symbolDetail = _C(exchange.SetContractType, symbol)
  6.         if (symbolDetail.VolumeMultiple == 0) {
  7.             Log(symbolDetail)
  8.             throw "股票合约信息异常"
  9.         } else {
  10.             Log("合约", symbolDetail.InstrumentName, "一手", symbolDetail.VolumeMultiple, "股, 最大下单量", symbolDetail.MaxLimitOrderVolume, ", 最小下单量", symbolDetail.VolumeMultiple)
  11.         }
  12.         
  13.         var obj = {
  14.             symbol: symbol,
  15.             tradeSymbol: symbolDetail.InstrumentID,
  16.             initBalance: initBalance,
  17.             keepBalance: keepBalance,
  18.             riskRatio: riskRatio,
  19.             atrLen: atrLen,
  20.             enterPeriodA: enterPeriodA,
  21.             leavePeriodA: leavePeriodA,
  22.             enterPeriodB: enterPeriodB,
  23.             leavePeriodB: leavePeriodB,
  24.             useFilter: useFilter,
  25.             multiplierN: multiplierN,
  26.             multiplierS: multiplierS
  27.         }
  28.         obj.maxLots = maxLots
  29.         obj.lastPrice = 0
  30.         obj.symbolDetail = symbolDetail
  31.         obj.status = {
  32.             symbol: symbol,
  33.             recordsLen: 0,
  34.             vm: [],
  35.             open: 0,
  36.             cover: 0,
  37.             st: 0,
  38.             marketPosition: 0,
  39.             lastPrice: 0,
  40.             holdPrice: 0,
  41.             holdAmount: 0,
  42.             holdProfit: 0,
  43.             switchCount: 0,
  44.             N: 0,
  45.             upLine: 0,
  46.             downLine: 0,
  47.             lastErr: "",
  48.             lastErrTime: "",
  49.             stopPrice: '',
  50.             leavePrice: '',
  51.             isTrading: false
  52.         }
  53.         ...
复制代码

股票市场和商品期货市场又有些差别,下面我们来一起分析一下这些差别,然后对于策略进行具体的修改、设计。

  • 交易时间差别
    我们需要单独设计一个函数,识别开盘休盘时间,如下函数设计,给构造函数TTManager返回的对象obj增加方法:
    1. obj.newDate = function() {
    2.           var timezone = 8                                
    3.           var offset_GMT = new Date().getTimezoneOffset()
    4.           var nowDate = new Date().getTime()              
    5.           var targetDate = new Date(nowDate + offset_GMT * 60 * 1000 + timezone * 60 * 60 * 1000)
    6.           return targetDate
    7.       }

    8.       obj.isSymbolTrading = function() {
    9.           // 使用 newDate() 代替 new Date() 因为服务器时区问题
    10.           var now = obj.newDate()
    11.           var day = now.getDay()
    12.           var hour = now.getHours()
    13.           var minute = now.getMinutes()
    14.           StatusMsg = "非交易时段"
    15.           if (day === 0 || day === 6) {
    16.               return false
    17.           }
    18.           if((hour == 9 && minute >= 30) || (hour == 11 && minute < 30) || (hour > 9 && hour < 11)) {
    19.               // 9:30-11:30
    20.               StatusMsg = "交易时段"
    21.               return true
    22.           } else if (hour >= 13 && hour < 15) {
    23.               // 13:00-15:00
    24.               StatusMsg = "交易时段"
    25.               return true
    26.           }            
    27.           return false
    28.       }
    复制代码
    • 交易方向的差别

    商品期货有开仓、平仓。股票只有买、卖,没有开仓平仓。股票类似于现货,但是也有持仓,买入的股票会在GetPosition函数获取的持仓列表中显示。

    需要我们对交易下单的部分做设计,增加函数:

    1. obj.sell = function(e, contractType, lots, insDetail) {
    2.     ...
    3. }

    4. obj.buy = function(e, contractType, opAmount, insDetail) {
    5.     ...
    6. }
    复制代码
    • 下单头寸计算

    商品期货交易下单时是按照合约张数下单,一张合约根据其合约乘数代表一定量的商品(例如rb合约,一张代表10吨螺纹钢)。股票虽说也是有按手计算的(根据板块有的1手100股,有的500股,还有的200股)。但是下单的时候必须是股数,并且要能被一手的股数整除。不能整除的会报错。

    这样就需要对海龟交易法计算头寸的部分做一定修改:


    1.           var atrs = TA.ATR(records, atrLen)
    2.           var N = _N(atrs[atrs.length - 1], 4)

    3.           var account = _C(exchange.GetAccount)
    4.           var unit = parseInt((obj.initBalance-obj.keepBalance) * (obj.riskRatio / 100) / N / obj.symbolDetail.VolumeMultiple)
    5.           var canOpen = parseInt((account.Balance-obj.keepBalance) / (lastPrice * 1.2) / obj.symbolDetail.VolumeMultiple)
    6.           unit = Math.min(unit, canOpen)
    7.           unit = unit * obj.symbolDetail.VolumeMultiple
    8.           if (unit < obj.symbolDetail.VolumeMultiple) {
    9.               obj.setLastError("可开 " + unit + " 手 无法开仓, " + (canOpen >= obj.symbolDetail.VolumeMultiple ? "风控触发" : "资金限制") + "。 可用: " + account.Balance)
    10.               return
    11.           }

    12.           // 交易函数
    13.           if (opCode == 2) {
    14.               throw "股票不支持做空"
    15.           }
    复制代码
    策略注释

    为了方便理解策略代码,我们对策略通篇注释。


    1. 由于篇幅长度限制,请移步https://www.fmz.cn/digest-topic/8978查看源代码。
    复制代码
    回测测试、研究

    我们选择几只股票回测:600519.SH,600690.SH,600006.SH,601328.SH,600887.SH,600121.SH,601633.SH。

    其它参数设置:



    回测时状态栏信息输出:





    可以观察到,海龟交易法这种趋势跟踪策略需要在有较大的行情时才会有较好的盈利。在行情反复震荡时可能会有一定回撤。
    涨幅较大的贵州茅台贡献了整体收益的绝大部分,看来选股也是十分重要的因素。并且根据状态栏中显示的统计数据来看,海龟交易法的止损次数要远高于策略成功盈利次数。这也是策略的思路核心,用较小的头寸试错。一旦抓住趋势突破加仓,抓住肥尾。创造震荡期损失数倍的盈利。
    完整策略:https://www.fmz.cn/strategy/346551
    该策略仅用于回测研究,实盘请自行优化、修改。




二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:海龟交易法则 海龟交易 如何实现 基本原理 交易策略

沙发
mqlts 发表于 2023-11-26 09:28:29

藤椅
xingjingguan 发表于 2024-9-9 10:33:01

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群
GMT+8, 2026-4-27 11:18