缘起
随着配置的基金数目越来越多,感觉自己对整体投资情况的把握越来越困难。特别是不怎么记账,止盈之后都无法精确知道自己赚了多少钱这一事实令我非常不爽,于是起了写一个可以进行基金投资仓位管理和分析的模块这样的想法。当时是想做一个基金投资记账的瑞士军刀,可以实现最小化的记账信息输入和最大化的量化信息展示。这样一方面减少了记账的数据量,另一方面更好的实时掌握投资的总体情况和各个分项的细节,保证掌握投资的全局,更好的为下一步投资的规划和仓位做指导。于是就有了这个项目的开始,从 parse 天天基金的 API 开始,一直到了现在的状态。这个项目能做到的事,也比初始的计划多出了许多,当然整个模块的核心还是基金交易和投资组合的处理。
在这篇文字里,我将记录一些开发过程中的小细节,项目已实现的基本功能速览,以及项目基础使用的最白话说明。
一个细节
一个最有趣发现是有些基金申购时份额小数点后两位不是四舍五入,而是无脑舍掉的,话说虽然钱不多,但这种只让投资人吃四舍五入亏有点尴尬。而且这样的话,越是定投亏的越多,因为每次申购大概吃半分钱的亏,每周定投,一年就会白白多亏掉两毛多,好吧,是不太多。目前发现这样做的基金有两只,都是景顺长城的。为此我还专门建立了个 droplist
列表用来在模块里维护这样做的基金代码列表,欢迎发现还有其他这样的基金提醒给我。当然,这么小的差别,我估计正常人没实盘是发现不了的。
我是怎么发现的呢,在写了最基本的通过账单生成真实的持仓情况的 trade 类中,我对我的所有持有的基金过了一遍,确保算得一分的误差都没有,其他基金都没有哪怕一分的误差,只有景顺这两只,300增强和500低波,和真实持仓的份额,差了大约0.几,这对于以0.01为单位的份额来说,已经误差很大了。于是我比较了每次模拟申购的结果和真实申购的结果,发现很多次我的计算给出的申购得到的份额都比真实申购大0.01,于是才想可能是份额四舍五入机制的不同,改为全部舍去,果然最后模拟持仓份额和真实持仓相同。于是我去找了这两个基金的招募说明书,可以参考这里,鉴于招募书很长,全文搜索四舍五入,可以发现这样的话:
上述金额的计算结果按四舍五入的方法,保留到小数点后两位,份额的计算结果按舍去尾数的方法,保留到小数点后两位,由此产生的收益或损失由基金财产承担。
果然,其份额计算用的是“舍去尾数”的方法。值得指出的是,并不是所有景顺长城这家公司的基金都这样,我也查阅了其他该公司的基金,其对份额采用的也是四舍五入的方法。但实际上,如果你没有真实购买的数据做 benchmark,即使某只基金也采用了舍去尾数的方法,通过简单程序测试,也没办法指导。鉴于没有人将这一信息提炼出来,所以唯一可以确定每只基金份额近似的方法,就是取该基金的招募书里大海捞针的去找,而这一步骤显然很难自动化。因此最后还是采取了维护一个该类型基金列表的方案。值得指出的是,如果不是追求完美的强迫症,把基金份额的全舍误做四舍五入几乎完全不影响任何结果。
设计理念
上面这个例子,体现出了xalpha在精确性上毫不含糊这一点,所有的申购赎回全部完全模拟,不仅费率模拟,折扣模拟,连赎回部分的仓位先入先出,不同持有时间的仓位赎回费率不同,以及分级基金份额折算时是按各次购买的份额分别四舍五入,这些只会影响一分钱的细节全部都考虑在了程序的设计之中。因此可以使得通过程序模拟的持仓和盈利和真实值一分钱的差别都不存在,这也是一个可以进行实仓管理的程序的自我要求所在。
在做到持仓一览一分不差的同时, xalpha 还要求了最少的数据输入,也就是把记账的精力降到最低。对于每一个基金,每次交易只需要在对应的日期行记录一个数即可。买入时记录的是申购金额(正),而卖出时记录的是赎回份额(负)。之所以两者不同,也适合基金的精神高度契合的,对于基金,都是采取的金额申购,份额赎回的处理方式。因此在申购时你并不知道这些钱可以买多少份额,赎回时也无法确切知道赎回的这些份有多少钱。不过没关系,你不需要第二天再去确认净值,份额之类的重新记账,相反,只需要在买卖时,把对应你知道的一个数记在表中就 ok 了。其他的一切,包括申购费,当时净值,不同时间的持仓对应的不同档次的赎回费,基金分红,基金份额折算, xalpha 都可以自动为你考虑好,最大限度的解放跟踪投资的精力,同时又能最大限度的定量分析投资的效果,可以说绝对精确和最大限度的省心省事就是 xalpha 的两大支柱理念。你所做的所有事情就是告诉程序基金代码,和每次交易只用记一个数字的 csv,你得到的将是投资管理的新世界。
功能概览
xalpha 还会开发下去,不过还是暂时总结一下现阶段其提供的模块和功能。
- 全部场外基金(包括货币基金)的信息获取:指定一个代码,你就能了解的基金名称,历史单位净值,历史分红送转情况,基金的折扣申购费,基金的不同持仓时长的赎回费等多样的信息。
- 全部 A 股指数的信息获取:同样是一个代码,获取指数名称和每日净值。
- 可以对多只基金和指数同时进行量化分析,给出走势分布和相关性分析。
- 虚拟可调的货币基金类型:除了前述的真实货币基金类外,还可以建立虚拟的货币基金类,来模拟理财等的行为,或单纯作为量化的基准,可以实现更灵活的仓位管理。
- 只需最简的账单外加一个代码就可以精确模拟一只基金你的全部交易行为,并可以输出各种量化数据和可视化。
- 只需一个最简的账单,就可实现多基金投资系统的投资精确模拟,同时提供总金额固定和总金额变动两个选项,可以显示全部基金投资的总结表和多样的持仓与交易量化,包括折线图,河流图,饼图,柱形图等。所有可视化均为可交互的 web 级可视化方案。
- 可以非常简便的制定各种基于日期和点数的定投策略,包括变额定投和复杂的网格策略均可以一行完成,并进行详细的回测分析与可视化展示。
- 可以根据置顶的策略,建立邮件按时提醒脚本,从此实现按计划买入和对市场的实时监控,尤其适合复杂网格策略的执行,不许自己再去看盘和计算执行条件和金额。
小白入门
秉持 fund investment for humans 的理念,我已经尽量将接口做的最为友好,同时配置了大量实例 ipynb 供入门学习。其中既包括了基础的应用和一些稍微进阶的研究。当然项目使用的最基础部分,甚至都不需要以前会用 python,这一部分我就以从没接触过 python 的人的视角,简要提示怎么使用 xalpha。下面没有手把手的教学,只是对没接触过 python,打开 github 项目会一脸蒙比的人一个如何能上手的关键字提示。
首先关键字是 python3,要想使用该项目,需要电脑安装 python3,随便百度和谷歌一下,带上你的系统类型,比如 windows,相信就可以搞定这一步,反正和装个其他程序也没啥区别。
然后就是 pip,python3 的包管理器,安装 python 发行版也许会自带。没带也没关系,还是加系统类型,pip安装使用这些关键字搜索一下教程,自己安装一下,然后pip install xalpha
即可。此时,你已可以在 python 环境使用 xalpha 了,具体例子可以参照文档的实例,记得先 import xalpha
。
当然如果想用的更方便更爽,可视化更灵活。第三个关键字就是 jupyter notebook,继续自行百度怎么安装和使用吧。
我只能帮到这里,这程度了。
项目地址
EOF