funds.pl是一个Perl脚本,用来跟踪中国开放式基金投资收益(暂不包括货币基金),当前版本1.3.4。
该工具从专业网站得到所有基金净值,然后根据用户提供的信息列出所有用户投资的资金信息,并统计出每只基金的收益,以及总收益。结果输出为网页,并用firefox打开。
HTML::TableExtract, Config::General, LWP::UserAgent, Encode, Pod::Usage, DateTime, XML::Atom以及HTML::Template。下载funds.pl和funds.tmpl到本地,第一次运行时会提示用户并没有提供任何基金投资组合信息,建议用户按照例子编写,并存在.funds目录里。 
$ perl funds.pl 没有找到中国开放式基金投资组合数据 请参照文件/path/example.conf里的格式,将投资组合保存在文件/path/config里
example.conf的内容如下: 
# example for config <fund 000001> # 买入净值 net = 1.00 # 持有数量 number = 1000 # 投入资本 investment = 1002 </fund>
其中“000001”是基金代码,而“买入净值”目前没有任何用处,但会显示在结果网页上。config文件可以含有多种资金投资信息,但同一种基金只能有一项,因此无法记录用户多次投资的信息,但可以将多次投资同一只基金的信息综合到一项里面,计算结果是一样的。后续版本将提供处理同种基金多项信息的功能。
如果用户系统定义了HOME环境变量,那么.funds目录会建在用户的home目录下,否则建在当前目录下。修改好config文件后将funds.tmpl也放在同一个目录下,缺省情况下,统计结果也会存在该目录下。因为基金信息每天更新一次,为了节省带宽,提高响应速度,该工具会在当天第一次运行时将所有基金信息存在.funds目录下,以后无需每次从网上提取,当然,无论何时运行,一天之内的结果总是一样的,即前一天投资的收益情况。
填好基金投资信息后,以后只需每日运行:
$ perl funds.pl
即可。
该程序可以作为cron job定期运行,并将结果发布到网站上,同时提供Atom Feed。方法如下:
在您的web服务器上运行
$ crontab -e
然后编辑文件如下:
0 8 * * * perl /path/to/script/funds.pl -c /path/to/config/ -d /path/to/output --domain=www.yourdomain.com 2>&1 >/path/to/log
缺省的urlpath值为fundcalc,所以Atom Feed的网址为 http://www.yourdomain.com/fundcalc/atom.xml, 订阅它就可以及时了解投资状况,无需手工每天运行。man 5 crontab查看crontab文件的编写帮助。
为防止一些意想不到的问题,可以多添加几项,然而由于基金信息一天公布一次,所以太多了也没用。建议添加两项,注意:后面的cron job最好使用--refresh选项。
--firsturl=1可以先查询金融界网站--output选项时,使用该选项指定的路径无效,而采用指定文件所在的路径--username选项,提供多用户支持。 funds.info符号链接至最新的基金数据文件。 XML::Atom所有对象的输入的utf8 flag必须关掉。--domain, --urlpath, --config-directory, --output-directory。funds.tmpl模板上增加Atom Feed。 --output选项指定输出文件名,否则当HTML文件存在时直接打开,而不去覆盖,以免改变最近更新时间。 DateTime归来)及本页链接。 Pod::Usage显示帮助信息 --verbose,并将所有输出信息翻译为中文。--refresh或者--firsturl时,如果网站上的数据并不比本地缓存数据新,将不再显示HTML页面。 --output,用来指定输出文件位置。--discard-data,使用该选项时,从网站上取回的基金净值数据将不会保存到本地。DateTime获取日期,日期信息从网页上提取,并保存到funds.info文件,以及当天的基金净值数据文件里。--refresh时覆盖funds.info文件,以及当天的基金净值数据文件里。 funds.tmpl放在config文件所在目录,而不是和funds.pl放在一起。 HTML::Template生成报表,而不是直接打印HTML语句。 --refresh和--firsturl 本工具以GPL协议(第二版本,或以上)发布,对该程序的运行结果作者不做任何担保,任何结果由使用该程序的用户自己承担。