V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
datayes2015
V2EX  ›  Python

借助 Python 实现海龟交易系统:)

  •  
  •   datayes2015 · 2016-09-06 18:07:41 +08:00 · 12141 次点击
    这是一个创建于 3031 天前的主题,其中的信息可能已经有所发展或是发生改变。
    前言

    海龟交易系统本质上是一个趋势跟随的系统,但是最值得我们学习的,是资金管理尤其是分批建仓及动态止损的部分

    一、趋势捕捉

    唐奇安通道

    该指标是有 Richard Donchian 发明的,是有 3 条不同颜色的曲线组成的,该指标用周期(一般都是 20 )内的最高价和最低价来显示市场价格的波动性,当其通道窄时表示市场波动较小,反之通道宽则表示市场波动比较大。 如图所示:
    该具体分析为:
    当价格冲冲破上轨是就是可能的买的信号;反之,冲破下轨时就是可能的卖的信号。
    该指标的计算方法为:

    上线=Max (最高低, n )
    下线=Min (最低价, n )
    中线=(上线+下线)/2


    海龟交易就是利用唐奇安通道的价格突破来捕捉趋势。
    不过我们在向下突破 10 日唐奇安下沿卖出。
    二、资金管理

    2.1 、 N 值计算

    N 值是仓位管理的核心,涉及加仓及止损。另外, N 值与技术指标平均真实波幅 ATR 很相似
    首先介绍真实波幅: 真实波幅是以下三个值中的最大值
    1 、当前交易日最高价和最低价的波幅
    2 、前一交易日的收盘价与当前交易日最高价的波幅
    3 、前一交易日的收盘价与当前交易日最低价的波幅
    用公式写就是:
    TrueRange=Max(High−Low,High−PreClose,PreClose−Low)
    接下来, N 值计算公式为:
    N=PreN[−19 :]+TrueRange20
    其中 preN 为前面 N 值, TrueRange 为当前的真实波幅,此公式的真是含义为计算之前 20 天(包括今天在内)的 N 的平均值
    另外,有些海龟交易系统用的是 ATR 来代替 N 值, ATR 为真实波幅的 20 日平均。

    2.2 买卖单位及首次建仓

    先给出公式:
    Unit=1%∗AccountN
    首次建仓的时候,当捕捉到趋势,即价格突破唐奇安上轨时,买入 1 个 unit 。
    其意义就是,让一个 N 值的波动与你总资金 1%的波动对应,如果买入 1unit 单位的资产,当天震幅使得总资产的变化不超过 1%。例如:
    现在你有 10 万元资金, 1%波动就是 1000 元。假如标 X 的 N 值为 0.2 元, 1000 元÷0.2 元=5000 股。也就是说,你的第一笔仓位应该是在其突破上轨(假设为 5 元)时立刻买入 5000 股,耗资 25000 元。
    2.3 加仓

    若股价在上一次买入(或加仓)的基础上上涨了 0.5N ,则加仓一个 Unit 。
    接上面的例子:假如 N 值仍为 0.2 。
    价格来到 5 + 0.2*0.5 = 5.1 时,加仓 1 个 Unit ,买入 5000 股,耗资 25500 元,剩余资金 49500 元
    价格来到 5.1 + 0.2*0.5 = 5.2 时再加仓 1 个 unit 。买入 5000 股,耗资 26000 元,剩余资金 23500 元
    2.4 动态止损

    当价格比最后一次买入价格下跌 2N 时,则卖出全部头寸止损。
    接上面的例子,最后一次加仓价格为 5.2 。假如此时 N 值 0.2 元。 当价格下跌到 5.2 - 2*0.2 = 4.8 元时,清仓。
    持仓成本为 ( 5+5.1+5.2 )*5000/15000 = 5.1 元。 此时亏损 ( 5.1-4.8 )*15000 = 4500 元 对于 10 万来说 这波亏损 4.5%
    2.5 止盈

    当股价跌破 10 日唐奇安通道下沿,清空头寸结束本次交易
    三、代码实现

    本代码用 ATR 代替 N 值进行计算,其他逻辑不变:
    ATR=MA(TrueRange,20)
    我们以单只股票为标,建立海龟交易系统,当然,可以将总资产均分为 n 份,同时交易 n 个标。

    计算 ATR 值用日线数据,监控价格突破采用分钟线
    0 初始化参数,在 initialize(account)写入
    def initialize(account):
    account.last_buy_prcie = 0 #上一次买入价
    account.hold_flag = False # 是否持有头寸标志
    account.limit_unit = 4 # 限制最多买入的单元数
    account.unit = 0 # 现在买入 1 单元的股数
    1 唐奇安通道计算及判断入场离场:
    高清源代码请查看: https://uqer.io/community/share/57bd5864228e5b79a575a9b2
    构建策略

    分钟线回测时间略长啊~
    先把上面写的函数集中下,方便微核充启后运行函数



    我们发现,收益基本上处于阶梯状上升。但是几年下来收益也并不高,我们来看看记录下来的数据,分析下整个过程:
    高清源代码请查看: https://uqer.io/community/share/57bd5864228e5b79a575a9b2
    把图画出来:
    红色点为入场点;
    蓝色点为离场点;
    绿色点位止损点


    可以发现:
    ATR 波形有些异常,有些地方会直线上升。分析后发现:因为 quartz 中, account.get_daily_history()取得的最高最低价中,对停牌的情况处理为了 0 !

    我们调整下策略:
    在计算 ATR 时,剔除最高最低为 0 的部分,再做平均。
    数据走势图链接: https://uqer.io/community/share/57bd5864228e5b79a575a9b2
    累计收益相差不多,我们再来看看记录的数据。
    红色点为入场点;
    蓝色点为离场点;
    绿色点位止损点

    数据走势图链接: https://uqer.io/community/share/57bd5864228e5b79a575a9b2
    这次发现, ATR 波形比较正常,在波动剧烈的时候增大。

    观察入场、离场、止损点发现,海龟交易系统捕捉到了大的上涨趋势,在震荡市中不断试错止损。

    上涨过程中出现回调容易震出,减少了回撤的同时也减小了收益。

    再看看仓位情况


    可以发现,大部分持有情况下仓位在 0.5 左右,甚至低于半仓,少数高于半仓的情况最高不超过 0.8 。因此,收益不高也是正常了。

    总结

    本文主要介绍了海龟交易的细节,不过是面向一个投资目标的。当想投多只股票时,可以先设定几个坑位,平分资金,然后对每个坑位采用海龟交易策略。

    海龟交易系统通常会用两个趋势捕捉系统,不同之处在于价格突破的上下线计算。系统 1 :突破上线 20 日最高买,突破下线 10 日最低卖;系统 2 :突破上线 55 日最高买,突破下线 20 日最低卖。 这部分可以通过修改参数实现。

    原始的海龟交易采用唐奇安通道来捕捉趋势,虽然能捕捉到大趋势,但是在震荡的情况下表现不如人意,不过这也是所有趋势型策略的通病。

    海龟交易策略的核心在于资金管理,可以看出策略的回撤比较小,并且还有优化的空间。资金管理不一定要与趋势型策略结合,是不是可以用到多因子策略上?动量反转?均值回归?这些就留给读者们自行尝试了~
    20 条回复    2016-10-20 18:18:36 +08:00
    findex
        1
    findex  
       2016-09-06 18:53:01 +08:00
    分析的不错。这么多,是自己写的吗?

    想了解下,金融 python 的收入如何,能达到一个什么水平,如果只是码代码的话
    aiguozhedaodan
        2
    aiguozhedaodan  
       2016-09-06 19:31:47 +08:00 via Android
    马克
    20150517
        3
    20150517  
       2016-09-07 06:07:31 +08:00
    大智慧公式就能编辑这个...
    xieyingli
        4
    xieyingli  
       2016-09-07 15:58:28 +08:00
    这是转帖么?
    dsg001
        5
    dsg001  
       2016-09-07 20:41:23 +08:00
    十年前用飞狐写指标
    yjzll
        6
    yjzll  
       2016-09-08 12:19:48 +08:00   ❤️ 1
    嘿嘿,不用看,按照这个系统肯定亏钱,原因很简单,按照技术 k 线执行买卖,是一种滞后行为,确定时间周期下,比如日 k 线下,除了大幅波动可以赚到一部分钱(去掉初期上涨段和下跌开始段),其他小幅波动段都是亏钱的,总体上亏的多,赚的少
    按照技术 k 线你只有找到一个方法,就是能从大周期上预期出向上或向下的概率,你才能赚钱
    当然,还有就是作弊,就是在期货盘口不断挂单撤单,制造假象
    yjzll
        7
    yjzll  
       2016-09-08 12:21:21 +08:00
    能从大周期上预期出向上或向下的概率,有人研发出来,可是人家不会告诉你的
    sobigfish
        8
    sobigfish  
       2016-09-08 12:48:02 +08:00
    @yjzll 发出来估计也就不准了。。。多出来的买卖会冲垮那个模型
    MicroGalaxy
        9
    MicroGalaxy  
       2016-09-08 15:47:52 +08:00
    最近在研究,做成客户端。也是趋势交易
    MicroGalaxy
        10
    MicroGalaxy  
       2016-09-08 15:49:31 +08:00
    @sobigfish 这叫程序化交易,有些模型是可以做到大概率赚钱的,例如网格交易和 MACD 。
    lazyyz
        11
    lazyyz  
       2016-09-22 12:56:00 +08:00 via iPhone
    外汇交易 更适合程序化交易, MT4 的 EA 就是用 mql5 编写
    SourceMan
        12
    SourceMan  
       2016-09-22 13:01:15 +08:00
    记录这的交易过程.jpg
    lan894734188
        13
    lan894734188  
       2016-09-23 20:30:32 +08:00 via Android
    意思是自动买入抛出?
    datayes2015
        14
    datayes2015  
    OP
       2016-09-26 15:32:18 +08:00
    @lan894734188 可以这么说
    waruqi
        15
    waruqi  
       2016-09-29 11:23:57 +08:00
    用 mt4 写很方便,不过我写的。。从来没盈利过。。 = =
    alexapollo
        16
    alexapollo  
       2016-09-29 11:24:19 +08:00
    又见量化平台推广贴
    22too
        17
    22too  
       2016-09-29 12:59:44 +08:00
    量化永远是这样的。高频交易才是你们应该尝试的。
    vigoss
        18
    vigoss  
       2016-09-29 14:50:08 +08:00
    dataeye 广告贴。。惨无人道
    ivvei
        19
    ivvei  
       2016-10-19 11:23:23 +08:00
    不适合做 T+1 的股票。
    chcx
        20
    chcx  
       2016-10-20 18:18:36 +08:00
    A 股 T+1 你得等到明天
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5779 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:46 · PVG 09:46 · LAX 17:46 · JFK 20:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.