Files
MoFin/venv/lib/python3.12/site-packages/akshare/fund/fund_em.py
T
知微 fa45d8aa5f fix: 小果地址统一node122(兼容LAN+EasyTier)
- health_checklist.json: 192.168.1.122→node122
- ocr_client.py: docstring IP→node122
- docs/market-data-requirements.md: IP→node122
- 所有API调用通过ProxyHandler({})绕过系统代理
  Privoxy对node122:18003返回500,直连正常
2026-06-30 02:56:35 +08:00

1319 lines
42 KiB
Python

#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Date: 2026/1/20 17:00
Desc: 东方财富网站-天天基金网-基金数据-开放式基金净值
https://fund.eastmoney.com/manager/default.html#dt14;mcreturnjson;ftall;pn20;pi1;scabbname;stasc
1.基金经理基本数据, 建议包含:基金经理代码,基金经理姓名,从业起始日期,现任基金公司,管理资产总规模,上述数据可在"基金经理列表:
https://fund.eastmoney.com/manager/default.html#dt14;mcreturnjson;ftall;pn20;pi1;scabbname;stasc 和
"基金经理理档案如:https://fund.eastmoney.com/manager/30040164.html 获取.
2.基金经理任职数据:可调取全部或特定经理,管理的基金数据,建议包含:基金经理代码,基金经理姓名,基金代码,基金简称,
经理位次(在当前基金的经理中排第几位),起始任职时间,截止任职时间,任职回报.在特定基金的经理信息中可以获取如:
https://fundf10.eastmoney.com/jjjl_001810.html
3.在接口:fund_basic"公募基金列表"增加数据"基金经理代码"(或第一基金经理代码),
"基金经理姓名"(或第一基金经理姓名),"当前基金经理人数","当前经理任职起始时间".
用户ID:269993
"""
import json
import math
import time
from io import StringIO
import pandas as pd
import py_mini_racer
import requests
from akshare.utils import demjson
from akshare.utils.cons import headers
from akshare.utils.tqdm import get_tqdm
def fund_purchase_em() -> pd.DataFrame:
"""
东方财富网站-天天基金网-基金数据-基金申购状态
https://fund.eastmoney.com/Fund_sgzt_bzdm.html#fcode,asc_1
:return: 基金申购状态
:rtype: pandas.DataFrame
"""
url = "https://fund.eastmoney.com/Data/Fund_JJJZ_Data.aspx"
params = {
"t": "8",
"page": "1,50000",
"js": "reData",
"sort": "fcode,asc",
}
r = requests.get(url, params=params, headers=headers)
data_text = r.text
data_json = demjson.decode(data_text.strip("var reData="))
temp_df = pd.DataFrame(data_json["datas"])
temp_df.reset_index(inplace=True)
temp_df["index"] = temp_df.index + 1
temp_df.columns = [
"序号",
"基金代码",
"基金简称",
"基金类型",
"最新净值/万份收益",
"最新净值/万份收益-报告时间",
"申购状态",
"赎回状态",
"下一开放日",
"购买起点",
"日累计限定金额",
"-",
"-",
"手续费",
]
temp_df = temp_df[
[
"序号",
"基金代码",
"基金简称",
"基金类型",
"最新净值/万份收益",
"最新净值/万份收益-报告时间",
"申购状态",
"赎回状态",
"下一开放日",
"购买起点",
"日累计限定金额",
"手续费",
]
]
temp_df["下一开放日"] = pd.to_datetime(
temp_df["下一开放日"], errors="coerce"
).dt.date
temp_df["最新净值/万份收益"] = pd.to_numeric(
temp_df["最新净值/万份收益"], errors="coerce"
)
temp_df["购买起点"] = pd.to_numeric(temp_df["购买起点"], errors="coerce")
temp_df["日累计限定金额"] = pd.to_numeric(
temp_df["日累计限定金额"], errors="coerce"
)
temp_df["手续费"] = temp_df["手续费"].str.strip("%")
temp_df["手续费"] = pd.to_numeric(temp_df["手续费"], errors="coerce")
return temp_df
def fund_name_em() -> pd.DataFrame:
"""
东方财富网站-天天基金网-基金数据-所有基金的名称和类型
https://fund.eastmoney.com/manager/default.html#dt14;mcreturnjson;ftall;pn20;pi1;scabbname;stasc
:return: 所有基金的名称和类型
:rtype: pandas.DataFrame
"""
url = "https://fund.eastmoney.com/js/fundcode_search.js"
r = requests.get(url, headers=headers)
text_data = r.text
data_json = demjson.decode(text_data.strip("var r = ")[:-1])
temp_df = pd.DataFrame(data_json)
temp_df.columns = ["基金代码", "拼音缩写", "基金简称", "基金类型", "拼音全称"]
return temp_df
def fund_info_index_em(
symbol: str = "沪深指数", indicator: str = "被动指数型"
) -> pd.DataFrame:
"""
东方财富网站-天天基金网-基金数据-基金信息-指数型
https://fund.eastmoney.com/trade/zs.html
:param symbol: choice of {"全部", "沪深指数", "行业主题", "大盘指数", "中盘指数", "小盘指数", "股票指数", "债券指数"}
:type symbol: str
:param indicator: choice of {"全部", "被动指数型", "增强指数型"}
:type indicator: str
:return: 基金信息-指数型
:rtype: pandas.DataFrame
"""
symbol_map = {
"全部": "",
"沪深指数": "053",
"行业主题": "054",
"大盘指数": "01",
"中盘指数": "02",
"小盘指数": "03",
"股票指数": "050|001",
"债券指数": "050|003",
}
indicator_map = {
"全部": "",
"被动指数型": "051",
"增强指数型": "052",
}
url = "https://api.fund.eastmoney.com/FundTradeRank/GetRankList"
if symbol in {"股票指数", "债券指数"}:
params = {
"ft": "zs",
"sc": "1n",
"st": "desc",
"pi": "1",
"pn": "10000",
"cp": "",
"ct": "",
"cd": "",
"ms": "",
"fr": symbol_map[symbol].split("|")[0],
"plevel": "",
"fst": "",
"ftype": symbol_map[symbol].split("|")[1],
"fr1": indicator_map[indicator],
"fl": "0",
"isab": "1",
}
else:
params = {
"ft": "zs",
"sc": "1n",
"st": "desc",
"pi": "1",
"pn": "10000",
"cp": "",
"ct": "",
"cd": "",
"ms": "",
"fr": symbol_map[symbol].split("|")[0],
"plevel": "",
"fst": "",
"ftype": "",
"fr1": indicator_map[indicator],
"fl": "0",
"isab": "1",
}
headers = {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Host": "api.fund.eastmoney.com",
"Pragma": "no-cache",
"Proxy-Connection": "keep-alive",
"Referer": "https://fund.eastmoney.com/",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/103.0.0.0 Safari/537.36",
}
r = requests.get(url, params=params, headers=headers)
data_json = r.json()
data_json = json.loads(data_json["Data"])
temp_df = pd.DataFrame([item.split("|") for item in data_json["datas"]])
temp_df.columns = [
"基金代码",
"基金名称",
"-",
"日期",
"单位净值",
"日增长率",
"近1周",
"近1月",
"近3月",
"近6月",
"近1年",
"近2年",
"近3年",
"今年来",
"成立来",
"-",
"-",
"-",
"手续费",
"-",
"-",
"-",
"-",
"-",
"起购金额",
"-",
"-",
"-",
"-",
]
temp_df = temp_df[
[
"基金代码",
"基金名称",
"单位净值",
"日期",
"日增长率",
"近1周",
"近1月",
"近3月",
"近6月",
"近1年",
"近2年",
"近3年",
"今年来",
"成立来",
"手续费",
"起购金额",
]
]
temp_df["跟踪标的"] = symbol
temp_df["跟踪方式"] = indicator
temp_df["单位净值"] = pd.to_numeric(temp_df["单位净值"], errors="coerce")
temp_df["日增长率"] = pd.to_numeric(temp_df["日增长率"], errors="coerce")
temp_df["近1周"] = pd.to_numeric(temp_df["近1周"], errors="coerce")
temp_df["近1月"] = pd.to_numeric(temp_df["近1月"], errors="coerce")
temp_df["近3月"] = pd.to_numeric(temp_df["近3月"], errors="coerce")
temp_df["近6月"] = pd.to_numeric(temp_df["近6月"], errors="coerce")
temp_df["近1年"] = pd.to_numeric(temp_df["近1年"], errors="coerce")
temp_df["近2年"] = pd.to_numeric(temp_df["近2年"], errors="coerce")
temp_df["近3年"] = pd.to_numeric(temp_df["近3年"], errors="coerce")
temp_df["今年来"] = pd.to_numeric(temp_df["今年来"], errors="coerce")
temp_df["成立来"] = pd.to_numeric(temp_df["成立来"], errors="coerce")
temp_df["手续费"] = pd.to_numeric(temp_df["手续费"], errors="coerce")
return temp_df
def fund_open_fund_daily_em() -> pd.DataFrame:
"""
东方财富网-天天基金网-基金数据-开放式基金净值
https://fund.eastmoney.com/fund.html#os_0;isall_0;ft_;pt_1
:return: 当前交易日的所有开放式基金净值数据
:rtype: pandas.DataFrame
"""
url = "https://fund.eastmoney.com/Data/Fund_JJJZ_Data.aspx"
params = {
"t": "1",
"lx": "1",
"letter": "",
"gsid": "",
"text": "",
"sort": "zdf,desc",
"page": "1,50000",
"dt": "1580914040623",
"atfc": "",
"onlySale": "0",
}
res = requests.get(url, params=params, headers=headers)
text_data = res.text
data_json = demjson.decode(text_data.strip("var db="))
temp_df = pd.DataFrame(data_json["datas"])
show_day = data_json["showday"]
temp_df.columns = [
"基金代码",
"基金简称",
"-",
f"{show_day[0]}-单位净值",
f"{show_day[0]}-累计净值",
f"{show_day[1]}-单位净值",
f"{show_day[1]}-累计净值",
"日增长值",
"日增长率",
"申购状态",
"赎回状态",
"-",
"-",
"-",
"-",
"-",
"-",
"手续费",
"-",
"-",
"-",
]
data_df = temp_df[
[
"基金代码",
"基金简称",
f"{show_day[0]}-单位净值",
f"{show_day[0]}-累计净值",
f"{show_day[1]}-单位净值",
f"{show_day[1]}-累计净值",
"日增长值",
"日增长率",
"申购状态",
"赎回状态",
"手续费",
]
]
return data_df
def fund_open_fund_info_em(
symbol: str = "710001", indicator: str = "单位净值走势", period: str = "成立来"
) -> pd.DataFrame:
"""
东方财富网-天天基金网-基金数据-开放式基金净值
https://fund.eastmoney.com/fund.html
:param symbol: 基金代码; 可以通过调用 ak.fund_open_fund_daily_em() 获取所有开放式基金代码
:type symbol: str
:param indicator: 需要获取的指标
:type indicator: str
:param period: "成立来"; choice of {"1月", "3月", "6月", "1年", "3年", "5年", "今年来", "成立来"}
:type period: str
:return: 指定基金指定指标的数据
:rtype: pandas.DataFrame
"""
from akshare.utils.cons import headers
url = f"https://fund.eastmoney.com/pingzhongdata/{symbol}.js" # 各类数据都在里面
r = requests.get(url, headers=headers)
data_text = r.text
js_code = py_mini_racer.MiniRacer()
js_code.eval(data_text)
# 单位净值走势
if indicator == "单位净值走势":
data_json = js_code.execute("Data_netWorthTrend")
temp_df = pd.DataFrame(data_json)
if temp_df.empty:
return pd.DataFrame()
temp_df["x"] = pd.to_datetime(temp_df["x"], unit="ms", utc=True).dt.tz_convert(
"Asia/Shanghai"
)
temp_df["x"] = temp_df["x"].dt.date
temp_df.columns = [
"净值日期",
"单位净值",
"日增长率",
"_",
]
temp_df = temp_df[
[
"净值日期",
"单位净值",
"日增长率",
]
]
temp_df["净值日期"] = pd.to_datetime(
temp_df["净值日期"], errors="coerce"
).dt.date
temp_df["单位净值"] = pd.to_numeric(temp_df["单位净值"], errors="coerce")
temp_df["日增长率"] = pd.to_numeric(temp_df["日增长率"], errors="coerce")
return temp_df
# 累计净值走势
if indicator == "累计净值走势":
data_json = js_code.execute("Data_ACWorthTrend")
temp_df = pd.DataFrame(data_json)
if temp_df.empty:
return pd.DataFrame()
temp_df.columns = ["x", "y"]
temp_df["x"] = pd.to_datetime(temp_df["x"], unit="ms", utc=True).dt.tz_convert(
"Asia/Shanghai"
)
temp_df["x"] = temp_df["x"].dt.date
temp_df.columns = [
"净值日期",
"累计净值",
]
temp_df = temp_df[
[
"净值日期",
"累计净值",
]
]
temp_df["净值日期"] = pd.to_datetime(
temp_df["净值日期"], errors="coerce"
).dt.date
temp_df["累计净值"] = pd.to_numeric(temp_df["累计净值"], errors="coerce")
return temp_df
# 每万份收益
if indicator == "每万份收益":
data_json = js_code.execute("Data_millionCopiesIncome")
temp_df = pd.DataFrame(data_json)
if temp_df.empty:
return pd.DataFrame()
temp_df.columns = ["x", "y"]
temp_df["x"] = pd.to_datetime(temp_df["x"], unit="ms", utc=True).dt.tz_convert(
"Asia/Shanghai"
)
temp_df["x"] = temp_df["x"].dt.date
temp_df.columns = [
"净值日期",
"每万份收益",
]
temp_df = temp_df[
[
"净值日期",
"每万份收益",
]
]
temp_df["净值日期"] = pd.to_datetime(
temp_df["净值日期"], errors="coerce"
).dt.date
temp_df["每万份收益"] = pd.to_numeric(temp_df["每万份收益"], errors="coerce")
return temp_df
# 7日年化收益率
if indicator == "7日年化收益率":
data_json = js_code.execute("Data_sevenDaysYearIncome")
temp_df = pd.DataFrame(data_json)
if temp_df.empty:
return pd.DataFrame()
temp_df.columns = ["x", "y"]
temp_df["x"] = pd.to_datetime(temp_df["x"], unit="ms", utc=True).dt.tz_convert(
"Asia/Shanghai"
)
temp_df["x"] = temp_df["x"].dt.date
temp_df.columns = [
"净值日期",
"7日年化收益率",
]
temp_df = temp_df[
[
"净值日期",
"7日年化收益率",
]
]
temp_df["净值日期"] = pd.to_datetime(
temp_df["净值日期"], errors="coerce"
).dt.date
temp_df["7日年化收益率"] = pd.to_numeric(
temp_df["7日年化收益率"], errors="coerce"
)
return temp_df
# 累计收益率走势
if indicator == "累计收益率走势":
url = "https://api.fund.eastmoney.com/pinzhong/LJSYLZS"
headers = {"Referer": "https://fund.eastmoney.com/"}
period_map = {
"1月": "m",
"3月": "q",
"6月": "hy",
"1年": "y",
"3年": "try",
"5年": "fiy",
"今年来": "sy",
"成立来": "se",
}
params = {
"fundCode": symbol,
"indexcode": "000300",
"type": period_map[period],
}
r = requests.get(url, params=params, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["Data"][0]["data"])
temp_df.columns = ["日期", "累计收益率"]
temp_df["日期"] = pd.to_datetime(
temp_df["日期"], unit="ms", utc=True
).dt.tz_convert("Asia/Shanghai")
temp_df["日期"] = pd.to_datetime(temp_df["日期"], errors="coerce").dt.date
temp_df["累计收益率"] = pd.to_numeric(temp_df["累计收益率"], errors="coerce")
return temp_df
# 同类排名走势
if indicator == "同类排名走势":
data_json = js_code.execute("Data_rateInSimilarType")
temp_df = pd.DataFrame(data_json)
temp_df["x"] = pd.to_datetime(temp_df["x"], unit="ms", utc=True).dt.tz_convert(
"Asia/Shanghai"
)
temp_df["x"] = temp_df["x"].dt.date
temp_df.columns = [
"报告日期",
"同类型排名-每日近三月排名",
"总排名-每日近三月排名",
]
temp_df = temp_df[
[
"报告日期",
"同类型排名-每日近三月排名",
"总排名-每日近三月排名",
]
]
temp_df["报告日期"] = pd.to_datetime(
temp_df["报告日期"], errors="coerce"
).dt.date
temp_df["同类型排名-每日近三月排名"] = pd.to_numeric(
temp_df["同类型排名-每日近三月排名"], errors="coerce"
)
temp_df["总排名-每日近三月排名"] = pd.to_numeric(
temp_df["总排名-每日近三月排名"], errors="coerce"
)
return temp_df
# 同类排名百分比
if indicator == "同类排名百分比":
data_json = js_code.execute("Data_rateInSimilarPersent")
temp_df = pd.DataFrame(data_json)
temp_df.columns = ["x", "y"]
temp_df["x"] = pd.to_datetime(temp_df["x"], unit="ms", utc=True).dt.tz_convert(
"Asia/Shanghai"
)
temp_df["x"] = temp_df["x"].dt.date
temp_df.columns = [
"报告日期",
"同类型排名-每日近3月收益排名百分比",
]
temp_df = temp_df[
[
"报告日期",
"同类型排名-每日近3月收益排名百分比",
]
]
temp_df["报告日期"] = pd.to_datetime(
temp_df["报告日期"], errors="coerce"
).dt.date
temp_df["同类型排名-每日近3月收益排名百分比"] = pd.to_numeric(
temp_df["同类型排名-每日近3月收益排名百分比"], errors="coerce"
)
return temp_df
# 分红送配详情
if indicator == "分红送配详情":
url = f"https://fundf10.eastmoney.com/fhsp_{symbol}.html"
r = requests.get(url, headers=headers)
table_num = len(pd.read_html(StringIO(r.text)))
if table_num == 3:
temp_df = pd.read_html(StringIO(r.text))[1]
else:
temp_df = pd.read_html(StringIO(r.text))[0]
if temp_df.iloc[0, 1] == "暂无分红信息!":
return pd.DataFrame()
else:
return temp_df
# 拆分详情
if indicator == "拆分详情":
url = f"https://fundf10.eastmoney.com/fhsp_{symbol}.html"
r = requests.get(url, headers=headers)
table_num = len(pd.read_html(StringIO(r.text)))
if table_num == 3:
temp_df = pd.read_html(StringIO(r.text))[2]
else:
temp_df = pd.read_html(StringIO(r.text))[1]
if temp_df.iloc[0, 1] == "暂无拆分信息!":
return pd.DataFrame()
else:
return temp_df
return pd.DataFrame()
def fund_money_fund_daily_em() -> pd.DataFrame:
"""
东方财富网-天天基金网-基金数据-货币型基金收益
https://fund.eastmoney.com/HBJJ_pjsyl.html
:return: 当前交易日的所有货币型基金收益数据
:rtype: pandas.DataFrame
"""
url = "https://fund.eastmoney.com/HBJJ_pjsyl.html"
r = requests.get(url, headers=headers)
r.encoding = "gb2312"
show_day = pd.read_html(StringIO(r.text))[1].iloc[0, 5:11].tolist()
temp_df = pd.read_html(StringIO(r.text))[1].iloc[1:, 2:]
temp_df_columns = temp_df.iloc[0, :].tolist()[1:]
temp_df = temp_df.iloc[1:, 1:]
temp_df.columns = temp_df_columns
temp_df["基金简称"] = temp_df["基金简称"].str.strip("基金吧档案")
temp_df.columns = [
"基金代码",
"基金简称",
f"{show_day[0]}-万份收益",
f"{show_day[1]}-7日年化%",
f"{show_day[2]}-单位净值",
f"{show_day[3]}-万份收益",
f"{show_day[4]}-7日年化%",
f"{show_day[5]}-单位净值",
"日涨幅",
"成立日期",
"基金经理",
"手续费",
"可购全部",
]
return temp_df
def fund_money_fund_info_em(symbol: str = "000009") -> pd.DataFrame:
"""
东方财富网-天天基金网-基金数据-货币型基金收益-历史净值数据
https://fundf10.eastmoney.com/jjjz_004186.html
:param symbol: 货币型基金代码, 可以通过 fund_money_fund_daily_em 来获取
:type symbol: str
:return: 东方财富网站-天天基金网-基金数据-货币型基金收益-历史净值数据
:rtype: pandas.DataFrame
"""
url = "https://api.fund.eastmoney.com/f10/lsjz"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/80.0.3987.149 Safari/537.36",
"Referer": f"https://fundf10.eastmoney.com/jjjz_{symbol}.html",
"Host": "api.fund.eastmoney.com",
}
params = {
"fundCode": symbol,
"pageIndex": "1",
"pageSize": "20",
"startDate": "",
"endDate": "",
"_": round(time.time() * 1000),
}
r = requests.get(url, params=params, headers=headers)
data_json = r.json()
total_page = math.ceil(int(data_json["TotalCount"]) / 20)
tqdm = get_tqdm()
big_list = []
for page in tqdm(range(1, total_page + 1), leave=False):
params.update({"pageIndex": page})
r = requests.get(url, params=params, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["Data"]["LSJZList"])
big_list.append(temp_df)
big_df = pd.concat(big_list, ignore_index=True)
big_df.columns = [
"净值日期",
"每万份收益",
"7日年化收益率",
"_",
"_",
"_",
"_",
"申购状态",
"赎回状态",
"_",
"_",
"_",
"_",
]
big_df.sort_values(by=["净值日期"], inplace=True, ignore_index=True)
big_df = big_df[["净值日期", "每万份收益", "7日年化收益率", "申购状态", "赎回状态"]]
big_df["净值日期"] = pd.to_datetime(big_df["净值日期"], errors="coerce").dt.date
big_df["每万份收益"] = pd.to_numeric(big_df["每万份收益"], errors="coerce")
big_df["7日年化收益率"] = pd.to_numeric(big_df["7日年化收益率"], errors="coerce")
return big_df
def fund_financial_fund_daily_em() -> pd.DataFrame:
"""
东方财富网站-天天基金网-基金数据-理财型基金收益
# 该接口暂无数据
https://fund.eastmoney.com/lcjj.html#1_1__0__ljjz,desc_1_os1
:return: 当前交易日的所有理财型基金收益
:rtype: pandas.DataFrame
"""
url = "https://api.fund.eastmoney.com/FundNetValue/GetLCJJJZ"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/80.0.3987.149 Safari/537.36",
"Referer": "https://fund.eastmoney.com/lcjj.html",
}
params = {
"letter": "",
"jjgsid": "0",
"searchtext": "",
"sort": "ljjz,desc",
"page": "1,100",
"AttentionCodes": "",
"cycle": "",
"OnlySale": "1",
}
r = requests.get(url, params=params, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["Data"]["List"])
if temp_df.empty:
return pd.DataFrame()
show_day = data_json["Data"]["showday"]
data_df = temp_df[
[
"Id",
"actualsyi",
"cycle",
"fcode",
"kfr",
"mui",
"shortname",
"syi",
"zrmui",
"zrsyi",
]
]
data_df.columns = [
"序号",
"上一期年化收益率",
"封闭期",
"基金代码",
"申购状态",
f"{show_day[0]}-万份收益",
"基金简称",
f"{show_day[0]}-7日年华",
f"{show_day[1]}-万份收益",
f"{show_day[1]}-7日年华",
]
data_df = data_df[
[
"序号",
"基金代码",
"基金简称",
"上一期年化收益率",
f"{show_day[0]}-万份收益",
f"{show_day[0]}-7日年华",
f"{show_day[1]}-万份收益",
f"{show_day[1]}-7日年华",
"封闭期",
"申购状态",
]
]
return data_df
def fund_financial_fund_info_em(symbol: str = "000134") -> pd.DataFrame:
"""
东方财富网站-天天基金网-基金数据-理财型基金收益-历史净值明细
https://fundf10.eastmoney.com/jjjz_000791.html
:param symbol: 理财型基金代码, 可以通过 ak.fund_financial_fund_daily_em() 来获取
:type symbol: str
:return: 东方财富网站-天天基金网-基金数据-理财型基金收益-历史净值明细
:rtype: pandas.DataFrame
"""
url = "https://api.fund.eastmoney.com/f10/lsjz"
params = {
"fundCode": symbol,
"pageIndex": "1",
"pageSize": "10000",
"startDate": "",
"endDate": "",
"_": round(time.time() * 1000),
}
r = requests.get(url, params=params)
data_json = r.json()
temp_df = pd.DataFrame(data_json["Data"]["LSJZList"])
temp_df.columns = [
"净值日期",
"单位净值",
"累计净值",
"_",
"_",
"_",
"日增长率",
"申购状态",
"赎回状态",
"_",
"_",
"_",
"分红送配",
]
temp_df = temp_df[
[
"净值日期",
"单位净值",
"累计净值",
"日增长率",
"申购状态",
"赎回状态",
"分红送配",
]
]
temp_df.sort_values(["净值日期"], inplace=True, ignore_index=True)
temp_df["净值日期"] = pd.to_datetime(temp_df["净值日期"], errors="coerce").dt.date
temp_df["单位净值"] = pd.to_numeric(temp_df["单位净值"], errors="coerce")
temp_df["累计净值"] = pd.to_numeric(temp_df["累计净值"], errors="coerce")
temp_df["日增长率"] = pd.to_numeric(temp_df["日增长率"], errors="coerce")
return temp_df
def fund_graded_fund_daily_em() -> pd.DataFrame:
"""
东方财富网站-天天基金网-基金数据-分级基金净值
https://fund.eastmoney.com/fjjj.html#1_1__0__zdf,desc_1
:return: 当前交易日的所有分级基金净值
:rtype: pandas.DataFrame
"""
url = "https://fund.eastmoney.com/Data/Fund_JJJZ_Data.aspx"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/80.0.3987.149 Safari/537.36",
"Referer": "https://fund.eastmoney.com/fjjj.html",
}
params = {
"t": "1",
"lx": "9",
"letter": "",
"gsid": "0",
"text": "",
"sort": "zdf,desc",
"page": "1,10000",
"dt": "1580914040623",
"atfc": "",
}
res = requests.get(url, params=params, headers=headers)
text_data = res.text
data_json = demjson.decode(text_data.strip("var db="))
temp_df = pd.DataFrame(data_json["datas"])
show_day = data_json["showday"]
temp_df.columns = [
"基金代码",
"基金简称",
"-",
f"{show_day[0]}-单位净值",
f"{show_day[0]}-累计净值",
f"{show_day[1]}--单位净值",
f"{show_day[1]}--累计净值",
"日增长值",
"日增长率",
"市价",
"折价率",
"-",
"-",
"-",
"-",
"-",
"-",
"-",
"-",
"手续费",
"-",
]
data_df = temp_df[
[
"基金代码",
"基金简称",
f"{show_day[0]}-单位净值",
f"{show_day[0]}-累计净值",
f"{show_day[1]}--单位净值",
f"{show_day[1]}--累计净值",
"日增长值",
"日增长率",
"市价",
"折价率",
"手续费",
]
]
return data_df
def fund_graded_fund_info_em(symbol: str = "150232") -> pd.DataFrame:
"""
东方财富网站-天天基金网-基金数据-分级基金净值-历史净值明细
https://fundf10.eastmoney.com/jjjz_150232.html
:param symbol: 分级基金代码, 可以通过 ak.fund_money_fund_daily_em() 来获取
:type symbol: str
:return: 东方财富网站-天天基金网-基金数据-分级基金净值-历史净值明细
:rtype: pandas.DataFrame
"""
url = "https://api.fund.eastmoney.com/f10/lsjz"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/80.0.3987.149 Safari/537.36",
"Referer": f"https://fundf10.eastmoney.com/jjjz_{symbol}.html",
}
params = {
"fundCode": symbol,
"pageIndex": "1",
"pageSize": "20",
"startDate": "",
"endDate": "",
"_": round(time.time() * 1000),
}
r = requests.get(url, params=params, headers=headers)
data_json = r.json()
total_page = math.ceil(int(data_json["TotalCount"]) / 20)
tqdm = get_tqdm()
big_list = []
for page in tqdm(range(1, total_page + 1), leave=False):
params.update({"pageIndex": page})
r = requests.get(url, params=params, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["Data"]["LSJZList"])
big_list.append(temp_df)
big_df = pd.concat(big_list, ignore_index=True)
big_df.columns = [
"净值日期",
"单位净值",
"累计净值",
"_",
"_",
"_",
"日增长率",
"申购状态",
"赎回状态",
"_",
"_",
"_",
"_",
]
big_df.sort_values(by=["净值日期"], inplace=True, ignore_index=True)
big_df = big_df[
["净值日期", "单位净值", "累计净值", "日增长率", "申购状态", "赎回状态"]
]
big_df["净值日期"] = pd.to_datetime(big_df["净值日期"], errors="coerce").dt.date
big_df["单位净值"] = pd.to_numeric(big_df["单位净值"], errors="coerce")
big_df["累计净值"] = pd.to_numeric(big_df["累计净值"], errors="coerce")
big_df["日增长率"] = pd.to_numeric(big_df["日增长率"], errors="coerce")
return big_df
def fund_etf_fund_daily_em() -> pd.DataFrame:
"""
东方财富网-天天基金网-基金数据-场内交易基金
https://fund.eastmoney.com/cnjy_dwjz.html
:return: 当前交易日的所有场内交易基金数据
:rtype: pandas.DataFrame
"""
url = "https://fund.eastmoney.com/cnjy_dwjz.html"
r = requests.get(url, headers=headers)
r.encoding = "gb2312"
show_day = pd.read_html(StringIO(r.text))[1].iloc[0, 6:10].tolist()
temp_df = pd.read_html(StringIO(r.text))[1].iloc[1:, 2:]
temp_df_columns = temp_df.iloc[0, :].tolist()[1:]
temp_df = temp_df.iloc[1:, 1:]
temp_df.columns = temp_df_columns
temp_df["基金简称"] = temp_df["基金简称"].str.replace("行情吧档案", "")
temp_df.reset_index(inplace=True, drop=True)
temp_df.columns = [
"基金代码",
"基金简称",
"类型",
f"{show_day[0]}-单位净值",
f"{show_day[0]}-累计净值",
f"{show_day[2]}-单位净值",
f"{show_day[2]}-累计净值",
"增长值",
"增长率",
"市价",
"折价率",
]
return temp_df
def fund_etf_fund_info_em(
fund: str = "511280",
start_date: str = "20000101",
end_date: str = "20500101",
) -> pd.DataFrame:
"""
东方财富网站-天天基金网-基金数据-场内交易基金-历史净值明细
https://fundf10.eastmoney.com/jjjz_511280.html
:param fund: 场内交易基金代码, 可以通过 fund_etf_fund_daily_em 来获取
:type fund: str
:param start_date: 开始统计时间
:type start_date: str
:param end_date: 结束统计时间
:type end_date: str
:return: 东方财富网站-天天基金网-基金数据-场内交易基金-历史净值明细
:rtype: pandas.DataFrame
"""
url = "https://api.fund.eastmoney.com/f10/lsjz"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/80.0.3987.149 Safari/537.36",
"Referer": f"https://fundf10.eastmoney.com/jjjz_{fund}.html",
}
params = {
"fundCode": fund,
"pageIndex": "1",
"pageSize": "20",
"startDate": "-".join([start_date[:4], start_date[4:6], start_date[6:]]),
"endDate": "-".join([end_date[:4], end_date[4:6], end_date[6:]]),
"_": round(time.time() * 1000),
}
r = requests.get(url, params=params, headers=headers)
data_json = r.json()
total_page = math.ceil(data_json["TotalCount"] / 20)
df_list = []
tqdm = get_tqdm()
for page in tqdm(range(1, total_page + 1), leave=False):
params.update({"pageIndex": page})
r = requests.get(url, params=params, headers=headers)
data_json = r.json()
temp_df = pd.DataFrame(data_json["Data"]["LSJZList"])
df_list.append(temp_df)
big_df = pd.concat(df_list)
big_df.columns = [
"净值日期",
"单位净值",
"累计净值",
"_",
"_",
"_",
"日增长率",
"申购状态",
"赎回状态",
"_",
"_",
"_",
"_",
]
big_df = big_df[
["净值日期", "单位净值", "累计净值", "日增长率", "申购状态", "赎回状态"]
]
big_df["净值日期"] = pd.to_datetime(big_df["净值日期"], errors="coerce").dt.date
big_df["单位净值"] = pd.to_numeric(big_df["单位净值"], errors="coerce")
big_df["累计净值"] = pd.to_numeric(big_df["累计净值"], errors="coerce")
big_df["日增长率"] = pd.to_numeric(big_df["日增长率"], errors="coerce")
big_df.sort_values(["净值日期"], inplace=True, ignore_index=True)
return big_df
def fund_value_estimation_em(symbol: str = "全部") -> pd.DataFrame:
"""
东方财富网-数据中心-净值估算
https://fund.eastmoney.com/fundguzhi.html
:param symbol: choice of {'全部', '股票型', '混合型', '债券型', '指数型', 'QDII', 'ETF联接', 'LOF', '场内交易基金'}
:type symbol: str
:return: 近期净值估算数据
:rtype: pandas.DataFrame
"""
symbol_map = {
"全部": 1,
"股票型": 2,
"混合型": 3,
"债券型": 4,
"指数型": 5,
"QDII": 6,
"ETF联接": 7,
"LOF": 8,
"场内交易基金": 9,
}
url = "https://api.fund.eastmoney.com/FundGuZhi/GetFundGZList"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/81.0.4044.138 Safari/537.36",
"Referer": "https://fund.eastmoney.com/",
}
params = {
"type": symbol_map[symbol],
"sort": "3",
"orderType": "desc",
"canbuy": "0",
"pageIndex": "1",
"pageSize": "20000",
"_": int(time.time() * 1000),
}
r = requests.get(url, params=params, headers=headers)
json_data = r.json()
temp_df = pd.DataFrame(json_data["Data"]["list"])
value_day = json_data["Data"]["gzrq"]
cal_day = json_data["Data"]["gxrq"]
temp_df.columns = [
"基金代码",
"-",
"-",
"-",
"-",
"-",
"基金类型",
"-",
"-",
"-",
"-",
"估算日期",
"-",
"-",
"-",
"-",
"_",
"-",
"-",
"估算偏差",
f"{cal_day}-估算数据-估算值",
f"{cal_day}-估算数据-估算增长率",
f"{cal_day}-公布数据-日增长率",
f"{value_day}-单位净值",
f"{cal_day}-公布数据-单位净值",
"-",
"基金名称",
"-",
"-",
"-",
]
temp_df = temp_df[
[
"基金代码",
"基金名称",
f"{cal_day}-估算数据-估算值",
f"{cal_day}-估算数据-估算增长率",
f"{cal_day}-公布数据-单位净值",
f"{cal_day}-公布数据-日增长率",
"估算偏差",
f"{value_day}-单位净值",
]
]
temp_df.reset_index(inplace=True)
temp_df["index"] = range(1, len(temp_df) + 1)
temp_df.rename(columns={"index": "序号"}, inplace=True)
return temp_df
def fund_hk_fund_hist_em(
code: str = "1002200683", symbol: str = "历史净值明细"
) -> pd.DataFrame:
"""
东方财富网-天天基金网-基金数据-香港基金-历史净值明细(分红送配详情)
https://overseas.1234567.com.cn/f10/FundJz/968092#FHPS
:param code: 通过 ak.fund_em_hk_rank() 获取
:type code: str
:param symbol: choice of {"历史净值明细", "分红送配详情"}
:type symbol: str
:return: 香港基金-历史净值明细(分红送配详情)
:rtype: pandas.DataFrame
"""
url = "https://overseas.1234567.com.cn/overseasapi/OpenApiHander.ashx"
if symbol == "历史净值明细":
params = {
"api": "HKFDApi",
"m": "MethodJZ",
"hkfcode": f"{code}",
"action": "2",
"pageindex": "0",
"pagesize": "1000",
"date1": "",
"date2": "",
}
r = requests.get(url, params=params, headers=headers)
data_json = r.json()
temp_one_df = pd.DataFrame(data_json["Data"])
temp_one_df.columns = [
"_",
"_",
"_",
"净值日期",
"单位净值",
"_",
"日增长值",
"日增长率",
"_",
"单位",
"_",
]
temp_one_df = temp_one_df[
[
"净值日期",
"单位净值",
"日增长值",
"日增长率",
"单位",
]
]
else:
params = {
"api": "HKFDApi",
"m": "MethodJZ",
"hkfcode": f"{code}",
"action": "3",
"pageindex": "0",
"pagesize": "1000",
"date1": "",
"date2": "",
}
r = requests.get(url, params=params, headers=headers)
data_json = r.json()
temp_one_df = pd.DataFrame(data_json["Data"])
temp_one_df.columns = [
"_",
"_",
"_",
"_",
"_",
"年份",
"分红金额",
"除息日",
"权益登记日",
"分红发放日",
"_",
"单位",
"_",
"_",
"_",
]
temp_one_df = temp_one_df[
[
"年份",
"权益登记日",
"除息日",
"分红发放日",
"分红金额",
"单位",
]
]
return temp_one_df
if __name__ == "__main__":
fund_purchase_em_df = fund_purchase_em()
print(fund_purchase_em_df)
fund_name_em_df = fund_name_em()
print(fund_name_em_df)
fund_info_index_em_df = fund_info_index_em(symbol="债券指数", indicator="全部")
print(fund_info_index_em_df)
fund_open_fund_daily_em_df = fund_open_fund_daily_em()
print(fund_open_fund_daily_em_df)
time.sleep(3)
fund_open_fund_info_em_df = fund_open_fund_info_em(
symbol="710001", indicator="单位净值走势"
)
print(fund_open_fund_info_em_df)
time.sleep(3)
fund_open_fund_info_em_df = fund_open_fund_info_em(
symbol="502010", indicator="累计净值走势", period="成立来"
)
print(fund_open_fund_info_em_df)
time.sleep(3)
fund_open_fund_info_em_df = fund_open_fund_info_em(
symbol="710001", indicator="累计收益率走势", period="成立来"
)
print(fund_open_fund_info_em_df)
time.sleep(3)
fund_open_fund_info_em_df = fund_open_fund_info_em(
symbol="710001", indicator="同类排名走势"
)
print(fund_open_fund_info_em_df)
time.sleep(3)
fund_open_fund_info_em_df = fund_open_fund_info_em(
symbol="710001", indicator="同类排名百分比"
)
print(fund_open_fund_info_em_df)
time.sleep(3)
fund_open_fund_info_em_df = fund_open_fund_info_em(
symbol="014164", indicator="分红送配详情"
)
print(fund_open_fund_info_em_df)
time.sleep(3)
fund_open_fund_info_em_df = fund_open_fund_info_em(
symbol="005561", indicator="拆分详情"
)
print(fund_open_fund_info_em_df)
fund_money_fund_daily_em_df = fund_money_fund_daily_em()
print(fund_money_fund_daily_em_df)
fund_money_fund_info_em_df = fund_money_fund_info_em(symbol="000009")
print(fund_money_fund_info_em_df)
fund_financial_fund_daily_em_df = fund_financial_fund_daily_em()
print(fund_financial_fund_daily_em_df)
fund_financial_fund_info_em_df = fund_financial_fund_info_em(symbol="000134")
print(fund_financial_fund_info_em_df)
fund_graded_fund_daily_em_df = fund_graded_fund_daily_em()
print(fund_graded_fund_daily_em_df)
fund_graded_fund_info_em_df = fund_graded_fund_info_em(symbol="150232")
print(fund_graded_fund_info_em_df)
fund_etf_fund_daily_em_df = fund_etf_fund_daily_em()
print(fund_etf_fund_daily_em_df)
fund_etf_fund_info_em_df = fund_etf_fund_info_em(
fund="511280", start_date="20000101", end_date="20500101"
)
print(fund_etf_fund_info_em_df)
fund_value_estimation_em_df = fund_value_estimation_em(symbol="混合型")
print(fund_value_estimation_em_df)
fund_hk_fund_hist_em_df = fund_hk_fund_hist_em(
code="1002200683", symbol="历史净值明细"
)
print(fund_hk_fund_hist_em_df)
fund_hk_fund_hist_em_df = fund_hk_fund_hist_em(
code="1002200683", symbol="分红送配详情"
)
print(fund_hk_fund_hist_em_df)