Python爬取满7天赎回零费率基金:短线基金定投
前言:基金常识
1、A类基金与C类基金
基金有三部分费率:
1、申购费率
2、赎回费率
3、运作费率
其中,运作费率包括:管理费率(通常每年0.5%到1.5%)、托管费率(通常每年0.1%到0.25%)、销售服务费率(C类基金通常每年0.1%到1.0%,其它类基金通常为0)。运作费率是从基金资产中每日计提的(每日公告的基金净值已扣除,无需投资者在交易中另行支付)。
A类基金是为中长期持有设计的,C类基金是为短线持有设计的。由此,A类基金与C类基金在费率上的区别:
1、A类基金通常有申购费率;赎回费率多为:小于7天1.50%、7至29天0.5%到0.75%、30至364天0.5%、365至729天0.1%到0.25%、满730天0费率(有些A类基金分档较少,甚至类似C类基金满30天0费率)。
2、C类基金申购零费率;多数C类基金赎回费率为:小于7天1.50%、7至29天0.5%、满30天0费率,少数C类基金为:小于7天1.50%、满7天0费率。
3、由于C类基金每日净值会自动计提销售服务费率,因此同一支基金,C类基金净值低于A类基金净值(差异等于已计提的销售服务费)。
2、ETF、LOF、ETF联接基金、FOF
ETF的全称是“Exchange Traded Funds”,本身是指数基金(股指基金、债券指数基金、期货指数基金等等),所以中文翻译是“交易型开放式指数基金”。与普通指数基金的区别在于:ETF股指基金是满仓股票,投资者赎回ETF时拿到的也是一篮子股票(因此ETF是场内交易的:投资者需有股票账户或场内基金账户);而普通指数基金有10%的现金,赎回时取得现金。
LOF的全称是“Listed Open-ended Fund”,中文是“上市型开放式基金”。LOF基金的申赎与普通指数基金相同,都是用现金来和基金份额进行交换,可以场外交易;LOF基金与普通指数基金的区别在于:LOF基金既可以被动跟踪指数,也可以主动选择其中的股票,其走势与指数可以有一定的差异(等同于“增强指数基金”)。
ETF联接基金,是联接ETF进行申赎的基金。对于普通投资者而言,达到ETF的申购门槛比较困难,而且ETF的申赎也不方便。因此基金公司发行ETF的时候,会同时推出ETF联接基金(通常90%持有该ETF),亦即ETF基金的代理,其管理费和托管费和对应的ETF是一致的(不重复收取),此外,联接A有申购费率,联接C则计提销售服务费率。
FOF基金,是投资基金的基金,可以理解为一篮子基金。细节方面,为防止利益输送,证监会对其投资的基金种类和比例有一些规定。
一、满7天赎回零费率基金
只有C类基金适合短线操作,且忽略以下类型的基金:债券型、货币型等等。
然后爬取之后发现:
1、股票C基金里面,是不存在满7天赎回零费率的,不必爬取了;
2、混合C基金里面,虽然能搜出几个满7天赎回零费率基金,但要么不开放申购,要么规模较小可能清算关闭,因此也不必爬取了;
3、QDII基金里面有一些QDII-指数C基金是满7天赎回零费率的,但其申购时间会多一天,因此不太适合短线操作;
4、因此,最后只选择指数基金和联接基金。
注:天天基金网后来将指数基金与ETF联接基金合并为“指数型-股票”,以下代码改了过来,但图表和说明则不改了。
二、实战
1、爬取基金数据
import pandas as pd
import requests
import execjs
# import os
# os.environ["EXECJS_RUNTIME"] = "JScript"
url = 'http://fund.eastmoney.com/js/fundcode_search.js'
content = requests.get(url)
jsContent = execjs.compile(content.text)
rawData = jsContent.eval('r')
jjcode=[]
jjname=[]
jjtype=[]
# 忽略:债券型、债券指数、货币型、定开、QDII、FOF等
# 保留:股票型、股票指数、混合型、联接基金的C类基金;
for code in rawData:
if len(code) > 2:
name = code[2]
type = code[3]
if name[-1] == 'C':
#if type == '股票指数' or type == '联接基金':
if type[:3] == '指数型':
jjcode.append(code[0])
jjname.append(code[2])
jjtype.append(code[3])
# 满7天赎回费率为零
feeString = '<td>大于等于7天</td><td>0.00%</td>'
# 基金状态,基金规模,运作费用
openString = '开放申购'
openString2 = '限大额'
amtString = '亿元'
yearString = '(每年)'
def getUrl(fscode):
head = 'http://fundf10.eastmoney.com/jjfl_'
tail = '.html'
return head+fscode+tail
# 根据基金代码查询费率信息
def getFee(fscode):
content = requests.get(getUrl(fscode))
fees = ''
result = feeString in content.text
if result == True:
result = openString in content.text or openString2 in content.text
if result == True:
nPos = content.text.find(amtString)
if nPos > 5:
sTemp = content.text[nPos-5 : nPos]
fAmount = float(sTemp)
if fAmount < 0.5 and sTemp[:2] == ' 0':
result = False
else:
nPos = content.text.find(yearString)
if nPos > 0 and content.text[nPos-1] == '%':