用jq程序提取中国理财网站上的产品历史净值数据
我的眼睛不好,看手机屏幕五分钟以上就会眼花,视力减退。平时我尽量少地使用手机,能在台式电脑上操作的,就不在手机里操作。奈何现在各部门、各公司都在想尽办法将用户引到手机上操作,如京东手机app上可以领到的优惠券,电脑版里没有。以前,我的手机每充一次电,能用2~3天,因为我很少用手机。但最近不行了,因为我在“微众银行”上买了银行的理财产品。买之前要看产品的介绍信息,买了之后时不时要看它的涨跌幅。随着买到的理财产品越多,我看手机的时间也越来越多。这时,我发现我的视力明显下降了,我认不出迎面走来的邻居了。
我曾咨询过微众银行的工作人员,他们说只有手机app,没有电脑版,所有的信息浏览、交易等等操作,都必须在手机app里完成。手机是一个很好的身份验证工具,这个我认同。但将产品信息仅限制在手机端操作,我就很不理解了。因为电脑的屏幕比手机的屏幕大几十倍,单单查看文字、图片等信息,看电脑屏幕远比手机屏幕舒服。能否让用户按需使用最顺手终端来浏览信息呢?微众银行当然说“不”。或许,从商家的角度来看,手机app能更稳更牢地“捆绑住”用户吧。
我只好自己想办法了,目标是能在电脑里查看银行理财产品的历史净值数据。经过约两周的实践,大概有这样的思路。举例,微众银行app上有卖“信银理财 安盈象强债稳健六个月持有期1号”的产品,那么我们先搜索到这个产品在“中国理财网”的产品编码(Z7002621000234),再以这个产品编码查询到它登记到“中国理财网”的ID(2165077),之后用产品的ID查询到产品的历史净值趋势数据,最后用jq的程序提取出日期和对应的净值数字,汇出到csv表中。
我们需要先验证脚本生成的csv表的净值是否正确。拿2022-08-24的净值1.025为例,对比信银理财官网发布的pdf文件,相符。有了正确的、完整的历史净值表,就可以用电脑的表格程序计算很多参考的指标数值了,如最近一个月、三个月的年化收益率、指定时间区间的年化收益率最大数、最小数和中位数等;也可以将这些参考的指标数值绘出折线趋势图等。在电脑上重新绘出的图,可以放得很大,方便查看,比在手机app上查看灵活得多。
缺点是:不是所有份额的理财产品都有在“中国理财网”上登记。以“信银理财 安盈象强债稳健六个月持有期1号”为例,它在微众银行代销的是B类份额,“中国理财网”就没有相应的历史净值记录。
图1:用脚本查询“中国理财网”的产品历史净值csv表
图2:计算净值的涨跌幅
图3:计算最近一个月、三个月、六个月的年化收益率
图4:计算一个月、三个月、六个月内年化收益率的中位数、最大数和最小数
图5:绘出“日期”和“净值”的折线图
m2.sh 内容:
#!/bin/bash
# 输入理财产品编码,获得产品的ID
wodebm=$1
echo $wodebm
wodecha=$(curl -d "cpdjbm=$wodebm" -X POST "https://www.chinawealth.com.cn/LcSolrSearch.go" | jq -r '.List[].id')
# wodecha=2165077
wodecha=$wodecha
echo "2 $wodecha"
# 以产品的ID查询理财产品的净值表
myfile=$(curl -d "method=cpjztrend&cpid=$wodecha" -X POST "https://www.chinawealth.com.cn/lccpJzcpServlet.go")
# echo $myfile | jq --raw-output '."'"$wodecha"'"[].zjkfzqjsr.time'
# 将获得的产品净值表,用jq程序处理:先转换时间,再提取出时间和与对应的净值数字,最后以csv文件格式保存
# echo $myfile | jq --raw-output '."'"$wodecha"'"[].zjkfzqjsr.time|= (tonumber|. / 1000 + 28800 |strftime("%Y-%m-%d"))'
echo $myfile | jq --raw-output '."'"$wodecha"'"[].zjkfzqjsr.time|= (tonumber|. / 1000 + 28800 |strftime("%Y-%m-%d")) | [."'"$wodecha"'"[] | {date: .zjkfzqjsr.time, nav: .cpjz}] | (map(keys) | add | unique) as $cols | $cols, map(. as $row | $cols | map($row[.]))[] | @csv' > $wodebm.csv
参考:
- https://stackoverflow.com/questions/71040411/jq-convert-milliseconds-to-date
- https://stackoverflow.com/questions/32960857/how-to-convert-arbitrary-simple-json-to-csv-using-jq
- https://stackoverflow.com/questions/44497533/jq-transform-unix-timestamp-to-datetime
- https://jqplay.org/
- https://github.com/stedolan/jq/issues/1735
- https://stackoverflow.com/questions/40027395/passing-bash-variable-to-jq