0%

理财:量化分析平台,一个定投策略的实现

不得不说理财是一项基本的能力,从工作开始有意识地买了很多理财产品,股票,基金,p2p。仅仅基金就买过股票型,指数型,还有比较复杂的分级基金A/B。之前的购买大部分是尝试性的,漫无目的,更没有任何仔细的思量。似乎这叫做赌博更加合适。
经过这一年的尝试,渐渐确定了我的理财目标。几个原则:

  • 作为非专业人员,不会花大量时间在这上面,如股票看盘
  • 为自己风险可以偏大,为父母,风险可控。基本公式:

    理财资产(非固定收益类)/总资产=100-年龄
    在此基础上微调:

    • 自己:比例 > 75% —> 85%左右,40%回撤
    • 父母:比例 < 45% —> 40%,18%回撤
  • 不投资不了解的产品,必须经过数据计算后投资

目标:

  • 追求 > 10%的年化收益,目标为15%

这篇文章讲讲最近了解的金融数据的回测平台。简单来说就是指定策略然后使用历史数据技术模拟投资,查看结果。

国内的量化平台

基本了解了一下国内的策略平台功能比较弱,但是由于数据原因也没有其他好的选择。基本是两个平台

  • UQER-优矿
  • 聚宽

这两个平台十分相似,我怀疑是互相抄袭的,或者抄的国外的某平台,可是。。。。他们的数据也不全,很多数据只有2013年以后。

使用

这没什么可说的,其实就是Python语法+常用的数据处理lib+平台API,
对我而言,python使用的比较少,基本语法没有问题,但是一些输出处理的库就是否生疏了,比如numpy,spicy,panda等,这些库大大的方便我们进行数据运算和整合:

分析常用的lib

  • numpy:主要提供了array数据结构(多纬度),与元组/列表最大的区别是,它约束数组内的数据类型要相同,一些细微的操作也不通

    1
    2
    [4]*4 -->  [4,4,4,4]
    np.array([4])*4 --> array([16])
  • spicy:向量和矩阵的相关操作,基本上算是一个高级的科学计算器,如计算逆矩阵,特征值等等功能,与线性代数相关。

  • panda:金融计算的高级库,提供了Series和DataFrame两种高级的数据结果,前者理解成列,后者理解成表(一个表是由n个列组成的)。
  • 高级的有:机器学习算法库等,这就不懂了
  • 其他的自定义绘图库matplotlib等

基本功能

这两个平台都基于ipython提供了两种基本的功能:code和strategy。

jupyter与ipython:这个东西很有用,jupyter是一个网页交互器,对于脚本语言可以即可写,即可得到结果。ipython是一个接口可以让jupyter支持python的编译执行,可以缓存其他的语言如ruby。这个东西是学习python这些语言的强力助手,提供自动不全的公共,适合边学习边实验。

简单地说:

  • code:纯洁的python运行环境,可以调用各种api,包括python自己的lib和金融平台提供的api。一个常见的流程是:使用平台api获取数据—>用python的数据处理工具处理—>写一下模板方法和变量(具体逻辑)—>import平台提供的回测库,调用回测api(需要把刚才写的模板方法和变量作为参数传入)—>拿到结果,用python的数据处理工具处理—>用python的绘图工具如matplotlib画出结果。优点是自由度高,缺点,必须要自己各种处理数据画图。

    1
    2
    3
    4
    5
    6
    7
    8
    bt, acct = quartz.backtest(start = start,end = end,\
    benchmark = benchmark,\
    universe = universe,\
    capital_base = capital_base,\
    initialize = initialize,\
    handle_data = handle_data,\
    refresh_rate = refresh_rate)
    # 下面绘图
  • strategy:一个模板化的python环境,实现一下模板的方法和变量(与上面类似):如在handle_data中判断然后下单,但是你不需要手动应用回测库开始回测,点击运行自动调研模板方法,绘制出图。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    start = '2014-01-01'                       # 回测起始时间
    end = '2015-01-01' # 回测结束时间
    benchmark = 'HS300' # 策略参考标准
    universe = ['000001.XSHE', '600000.XSHG'] # 证券池,支持股票和基金
    capital_base = 100000 # 起始资金
    freq = 'd' # 策略类型,'d'表示日间策略使用日线回测,'m'表示日内策略使用分钟线回测
    refresh_rate = 1 # 调仓频率,表示执行handle_data的时间间隔,若freq = 'd'时间间隔的单位为交易日,若freq = 'm'时间间隔为分钟
    def initialize(account): # 初始化虚拟账户状态
    pass
    def handle_data(account): # 每个交易日的买入卖出指令
    return

核心的概念,就是在某个时机下单。
时机:

  • 日间策略 — 函数每个交易日调用一次,注意,此时下单价格是开盘价格(优矿),框架一般认为必然成功
  • 分钟策略 — 每一分钟调用一次,以市价(当前价格)/限价(限定某个)来下单,未必能买的到

下单:

  • order(stk,100) 以当前价格买100股
  • order_to(stk,100) 以当前价格买/卖,最后剩余100股
  • 其他,按比例什么的,有些平台可以用价格去下单,如买1000块的股票。(内部应该也处理了取整)

一些坑

优矿平台:

  • handle_data里下了单,但是账户信息不会离开变化(比如余额,持股),要下次调用handle_data的时候才变,注意理解!但是其他平台未必。
  • account.universe中的股票的顺序个数都可能被修改!不是你传入的,他会过滤去重排序。
  • 无法增加cash,记追加投资,就是不好实现定投(用策略不行,用code可以自己来)
  • 只支持:股票,场内etf基金,一些场内债券,其他的如分级基金、普通的开放式基金都不支持。
  • secID和ticker证券代码:前者是内部id,因为同一个证券号码可能有多个对应的东西
  • 下单失败努力找原因。。比如,cash太少买不了一手

聚宽:
数据太少,比如etf,只有2014年12月的。。
优点是api比优矿完善的多!

实践

我使用code模式,实现了按月定投逻辑和定期按比例重新分配资产。这里下载。这里面用到一个很有用的库dateutil,可以方便的产生时间序列,比如每个月的最后一天,每年第几天等
分析结果用图表的形式表现出来:
分析结果

总结

这些只是入门的内容,还有很多数据层面的东西要学习以及金融知识,比如那些指标是什么含义。今年有计划看一本金融类的入门书籍。理财是一个长期需要坚持的事情,从简单的策略做起,不断学习,优化,认识到不足,再优化。期望能脱离盲目,我相信,所谓坚持不懈,毫不动摇必须要有强大的学识基础。

欢迎关注我的其它发布渠道