获取基金净值,标记买卖点

写在开头

想对买了的基金多上点儿心,又不想再各个 app 去查(耗时费力,且提供的功能也有限),就自己实现一些功能:
1)拿到某只基金的净值;
2)标记买卖点;

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import pandas as pd
import requests,re,ast
from bs4 import BeautifulSoup
from datetime import datetime
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['SimHei'] # 支持中文
plt.rcParams['axes.unicode_minus']=False

# 根据天天基金获取每日的净值
def get_data(code, n):
dt = pd.DataFrame(columns=['代码', '日期', '单位净值', '累计净值'])
for n in range(1,n):
res = requests.get('http://fund.eastmoney.com/f10/F10DataApi.aspx?type=lsjz&code=' + code + '&page=' + str(n) + '&per=20&sdate=&edate=&rt=0.7823397557719116')
soup = BeautifulSoup(res.content, "html.parser")
value_list = soup.get_text().split('%')
for x in range(0, len(value_list)-1):
match = re.search('(\d{4}-\d{2}-\d{2})(\d+\.\d{4})(\d+\.\d{4})' ,value_list[x])
dt = dt.append({'代码': code, '日期': match.group(1), '单位净值': float(match.group(2)), '累计净值': float(match.group(3))}, ignore_index=True)
dt.日期 = pd.to_datetime(dt['日期'])
dt.index = pd.to_datetime(dt['日期'])
return dt

# 标记买入卖出日期
def label(df, buy_data, sell_data, title): # date is a list
fig = plt.figure(figsize=(15,6))#设置画布大小
ax1 = fig.add_subplot(111)
sns.lineplot(ax=ax1, x="日期", y="单位净值", data=df, color = 'gray')
# 画散点图的时候会报错,加个 values 就行
plt.scatter(buy_data.日期.values, buy_data.单位净值, s=40, color='red',zorder=1)
plt.scatter(sell_data.日期.values, sell_data.单位净值, s=40, color='green',zorder=1)

plt.xlabel(u"日期",fontsize=15)#设置横坐标,以及字体大小
plt.ylabel(u"单位净值",fontsize=15)#设置纵坐标,以及字体大小
# 设置xy轴刻度文字大小
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)
plt.title(title, fontdict = {'fontsize' : 20})
#plt.legend(fontsize=13)

# 以 002708 为例
df_002708 = get_data('002708', 100)
# 买入日期和卖出日期
buy_date = ['2020-11-30']
sell_date = ['2022-02-11']
sell_data = df_002708[[True if x.strftime('%Y-%m-%d') in sell_date else False for x in list(df_002708.index)]]
buy_data = df_002708[[True if x.strftime('%Y-%m-%d') in buy_date else False for x in list(df_002708.index)]]

label(df_002708, buy_data, sell_data, '大摩健康产业-002708')

出来的图大概是这样的,谁说我没坐过过山车🎢(🐶)
见文末链接

写在后边

你必须有浓厚的兴趣去弄明白正在发生的事情背后的原因。如果你能够长期保持这种心态,你关注现实的能力将会逐渐得到提高。如果你没有这种心态,那么即使你有很高的智商,也注定会失败。

你若想在任何领域拥有竞争力,就必须熟练地掌握该领域的方方面面,不管你是否喜欢这么做,这是人类大脑的深层结构决定的。

路过:我也不认为随随便便就能做好事情…

链接

获取基金净值,标记买卖点

(✪ω✪)