过去一年尝试过不少记账软件,有用过 Beancount 通过硬核的分录方式进行记账,也有本土的软件(如图图、钱迹),最后觉得还是最老牌、国际化的软件 Moneywiz 更胜一筹。它内置的投资模块虽然非常强大,但是和他的大多数自动功能一样:不够接地气。
与银行的直连接口基本都是对接海外银行,但这个功能是升级付费功能,况且我也没有自动记账的习惯,因此对整体使用体验的影响并不是很大。但另一个功能——股票、基金净值的自动更新就比较影响我的日常效率了。
相较于其他的主流软件,Moneywiz 的投资管理功能是比较强大的,可以跟踪个股和基金的每日走势,并且设定成本基准。主要的海外市场用户基本可以无缝衔接,但大陆用户就无福享受了,主要原因有二:
- 因为众所周知的原因,Yahoo Finance 在境内访问极不稳定;以及
- 大多数中国基金并没有纳入到 Yahoo Finance 的数据库中。
之前也有询问过开发者,考虑到中国的潜在用户群,是否有考虑过把中国的基金纳入到自动更新的范围内。开发者也坦言并未有此计划,但以后会开放 URL Scheme 方便自主开发。话虽这么说,但是并在去年并没有看到详细的说明。
这次封控在家,再重新捣鼓 python 的时候不经意间去 Moneywiz 的官网上看了一下,发现更新基金净值的 URL Scheme 文档已经更新了。于是一时兴起,在不断的摸索中捣鼓出了自己的第一个 python 实用项目。(顺便发在了 Github 上)
主体构想
在 Moneywiz 的官网 技术文档 中,我看到 URL Scheme 主要需要以下三个参数:
symbol(required)price(required)date(optional)
那我的首要目标是找到类似于 Yahoo Finance,能够抓取到国内基金数据的源。在网上搜索过后,发现天天基金网的数据较全,而且现有的代码也比较成熟,于是借花献佛,选择了一套代码作为我的开发基础。
整个代码的思路也即变成了:从网上的 js 脚本抓取数据,然后提取我们需要的值,组成 URL Scheme,然后启动程序自动更新。
首先尝试访问 js 代码,找到对应数据的 key:
|
|
如果与 URL Scheme 对应的话就是:
symbol(required) – “fundcode”price(required) – “dwjz”date(optional) – “jzrq”
最后将 print 调整为 webbrowser.open() 来运行 URL Scheme。至此主体框架基本完成。
调整代码
基本实现了功能后,还需要继续进行调整。
基金代码
由于国内的基金代码多位六位数字,在输入 MoneyWiz 之后,由于和其他国家的股票代码多有冲突,常常会「自作多情」地抓取到其他股票的价格,造成数据错误。因此,我在六位数字后人工增加了.CN 的后缀(参考其他股票软件的命名方法),组织了软件的自动更新。因此,需要在代码中也让其手工带上这个后缀。
日期格式
对于变成小白来说,这可能是最难的一个调整了。其实到上一步为止,整个代码已经可以实现 90% 的效果了,系统已经能够实现自动更新。但如果仔细看的话,基金净值更新的日期并非我们代码中的日期,而是我们执行代码的日期(下一个工作日)。
问题就出在日期的格式上。从数据源中得到的日期格式为 YYYY-MM-DD 而 Moneywiz 需要的格式是 YYYYMMDD,如果无法识别的话,Moneywiz 就会把当天的日期作为生效日期。
所以最后使用了 datetime.strptime 和 datetime.strftime 两个功能调整了日期格式。导入后 bug 解除。
小白的感悟
我也没想到一个纯种文科生有一天会在部落格上写技术文章。整个过程就是发现问题-解决问题的过程。互联网真是一个好东西,就算是像我一样的变成小白,也能够依靠前人的经验、网上的解答东拼西凑出一个可以运行,并且极大地提高自己软件使用效率的小程序。