Excel自动获取基金估值、计算当日收益和累计收益【2021/01/30更新】
本帖最后由 haogg 于 2021-1-30 14:55 编辑一直没的时间来更新这个小工具,看好像还是有人在用,反馈说刷新不了数据了,抽空修复了下重新发上来,附件是最新版,修复了不能获取净值数据。
后期有时间了再来更新一些收集到的需求:
【*】可切换数据源
【*】可查看昨日估值
【*】更方便更智能的插入基金方式
---------------------------------------------------------------分割线----------------------------------------------------
看到好多坛友因为输错基金代码或者输入了没有实时估值数据的基金而导致报错,就更新了一些容错处理,如果出现异常也不会直接报错了,而是会有友好的提示并且不影响后面的流程【2020/06/05】:
动图中的货币型基金就是没有当日估值这些数据的,只有年化收益,所以是不支持的,还有后面添加的南方原油这个基金估值不会及时公布,所以也获取不到当日的估值,现在这些基金都能很友好的处理了,而不是直接报错,附件和代码已更新。
---------------------------------------------------------------分割线----------------------------------------------------
没想到这个小工具这么多人捧场,我也看到了很多大家的意见,所以连忙进行了一些更新【2020/06/04】:
1、增删基金不需要去修改代码了,只要你保持合计那一行的B列值为####,脚本就能自动识别出需要查询的基金代码截止范围。
2、可以自动获取基金名称(感谢坛友@平Fan_d世界 )
3、新增夏普比率指标,这是个用来判断该基金风险和收益关系的一个指标,我看有些坛友需要,而且数据源也有这个指标,我就抓出来了。
4、新增盘中估值
*夏普比率一栏是可以下拉选择1年期、2年期、3年期这些周期的指标,有些基金成立时间没有那么多年,所以会出现有些两年或者三年期的值为“--”
*第一次打开会风险提示,一定要选择启用宏,不然没法用。wps不知道支不支持,楼主用的是office2010
详情请看下面动图和附件(已更新)
------------------------------------------------我是分割线-----------------------------------------------------------------------------------
昨天看看到有坛友发布了一个自动监控基金的vba,想起了我年初基金建仓时,因为支付宝第二天才能更新昨天的收益和估值,所以自己做的一个vba脚本,能获取到当天的估值和预估收益,好让自己当天就能判断是否加减仓,也分享给大家,算是抛砖引玉。估值可能会和支付宝估值以及第二天实际净值有些误差,因为每个平台的对基金的仓位估算都不一致,支付宝自己的估值和第二天公布的净值也会不一致,但是一般各个平台的估值和实际净值出入不大,这里采取的是东方财富的估值数据。
先上截图
使用说明都附在附件中的excel里面了,下面是vba代码:
Sub 获取涨幅()
Sheets(1).Range("S300").Formula = "=MATCH(" & """####""" & ",B:B,0)-1"
endRow = Sheets(1).Range("S300").Value
Sheets(1).Range("S300").ClearContents
For i = 2 To endRow
If Sheets(1).Range("B" & i).Text <> "" Then
Sheets(1).Range("F" & i) = "正在加载..."
Sheets(1).Range("H" & i) = "正在加载..."
Sheets(1).Range("K" & i) = "正在加载..."
Set HTML = CreateObject("htmlfile")
Set http = CreateObject("Msxml2.ServerXMLHTTP")
Value = Sheets(1).Range("B" & i).Text
HTML.designMode = "on"
http.Open "GET", "http://fund.eastmoney.com/" & Value & ".html", False
http.send
strHtml = http.responseText
If strHtml <> "" Then
HTML.write strHtml
Set trs = HTML.getElementById("gz_gszzl")
Set gz_gsz = HTML.getElementById("gz_gsz")
If Sheets(1).Range("A" & i).Value = "" Then
Title = HTML.getElementsByTagName("title")(0).innerText
Title = Left(Title, InStrRev(Title, "(") - 1)
Sheets(1).Range("A" & i) = Title
End If
If TypeName(trs) <> "Nothing" And TypeName(gz_gsz) <> "Nothing" Then
Sheets(1).Range("K" & i) = gz_gsz.innerText
' 累计收益 (含预估)
gsz = gz_gsz.innerText
If gsz = "--" Then
gsz = "0"
End If
Sheets(1).Range("H" & i) = (gsz - Sheets(1).Range("D" & i).Value) * Sheets(1).Range("C" & i).Value
' 今日估值
' Debug.Print (trs.innerText)
If trs.innerText = "0.00%" Then
Sheets(1).Range("F" & i) = "'" & trs.innerText
Else
Sheets(1).Range("F" & i) = trs.innerText
End If
Call 获取风险指标(Value, i)
Else
Sheets(1).Range("F" & i) = "不支持该基金"
Sheets(1).Range("H" & i) = "不支持该基金"
Sheets(1).Range("K" & i) = "不支持该基金"
End If
Else
Sheets(1).Range("F" & i) = "获取出错,请检查基金代码后重试"
Sheets(1).Range("H" & i) = "获取出错,请检查基金代码后重试"
Sheets(1).Range("K" & i) = "获取出错,请检查基金代码后重试"
End If
End If
Next
End Sub
Sub 获取风险指标(code, i)
Sheets(1).Range("J" & i) = "正在加载..."
Set HTML = CreateObject("htmlfile")
Set http = CreateObject("Msxml2.ServerXMLHTTP")
HTML.designMode = "on"
http.Open "GET", "http://fundf10.eastmoney.com/tsdata_" & code & ".html", False
http.send
strHtml = http.responseText
HTML.write strHtml
Set td = HTML.getElementsByTagName("table")(1).getElementsByTagName("tr")(2).getElementsByTagName("td")
y = Sheets(1).Range("J1").Value
y1 = CStr(td(1).innerText)
y2 = CStr(td(2).innerText)
y3 = CStr(td(3).innerText)
Sheets(1).Range("J" & i).Formula = "=IF(INDEX(J1,1)=" & """夏普比率(1年)""" & "," & Chr(34) & y1 & Chr(34) & ",IF(INDEX(J1,1)=" & """夏普比率(2年)""" & "," & Chr(34) & y2 & Chr(34) & "," & Chr(34) & y3 & Chr(34) & "))"
End Sub
有些人可能不知道查看持仓成本和份额,我这里以支付宝里面的基金为例给大家演示一下:
首先进入支付宝基金持有页,然后点击具体的基金进入详情页
进入详情以后可以看到基金代码,点击小箭头展开持有详情,然后就能看到成本和份额了
大多数的报错是因为基金代码没有用0来补足六位,我已经更新了附件,会自动用0补齐六位,如果已经下载了的可以按以下方式将单元格式修改成自定义-类型里面输入六个0:
做了下修改,输入代码自动获取名称 原先获取数据的网页因为多了一条警示,在按确认按钮之前的今日估值都是空,所以刷不出来了。
我没学过vba,瞎猫抓到一个处理方法,宏做了简单的编辑,给大家参考:
1.http get页面,换到每一个单独基金净值的页面上去抓取: http://fundf10.eastmoney.com/jjjz_" & Value & ".html"
2.页面中筛选标签id,使用:
Set trs = HTML.getElementById("fund_gszf")
Set gz_gsz = HTML.getElementById("fund_gsz") 曾经的树叶 发表于 2020-6-6 09:54
如果我想再加一个基金的话,需要怎么做!
插入一行,然后复制一行模板数据,再粘贴到新插入的行,将粘贴的新行中的名称删除,修改基金代码、成本,份额就可以了。我主贴新更新的动图有这个操作,你可以看下 大佬牛逼啊,下载了。 novajo 发表于 2020-9-2 21:25
对应的网页按F12,要找里面的元素,不是所有的都有对应element ID的。
谢谢,我找到了,那没有ID标签的咋办,如单位净值,我找了下就没有,原楼主的获取页面中,有坛友给出的单位净值获取代码fix_dwjz = HTML.getElementsByTagName("span")(12).innerText,你能看懂吗?我也找不到对应的代码 就是为了这个注册的账号,哈哈哈哈哈,太棒了 shou0823 发表于 2020-6-4 15:19
点启用了,CTRL+R后出现的这个文件C:%users\Public\Nwt\cache\recv
可能和你的其他软件快捷键冲突了,你可以把宏的快捷键修改
https://ftp.bmp.ovh/imgs/2020/06/e6171ae63b795a1e.png
为什么这个今日估值 和 今日估计收益一直不变了
凉米饭 发表于 2020-6-5 17:39
这写法 我实在是看不懂
很不错的工具,暂时用不上,先收藏了 大佬牛逼啊,下载了。https://cdn.jsdelivr.net/gh/hishis/forum-master/public/images/patch.gif 不容易投资有风险 很不错,请问能否加上sharpe ratio 和sortino ratio呢?谢谢 谢谢分享 jhjhsxs 发表于 2020-6-4 11:34
很不错,请问能否加上sharpe ratio 和sortino ratio呢?谢谢
这些专业的投资指标,需要很多参数,等以后有空了看能不能加上去 这个真的是好东西啊,支持啊! {:301_1000:}谢谢分享