跳到主要内容

小鲸基金择时

收藏0

用场外基金历史净值做核心+卫星策略,每天给出买什么、卖什么、买多少。

让 AI 安装

lrt最新版本 0.1.1更新于 2026-11-09下载 0 次2 个版本

scripts/nav.py

3.3 KB
1# -*- coding: utf-8 -*-
2"""场外基金净值工具:拉历史净值、算区间收益/回撤/60日线状态。
3
4用法:python fund/nav.py 007466 006965 110020
5"""
6import sys, os, json
7import requests
8import numpy as np
9
10sys.stdout.reconfigure(encoding="utf-8", errors="replace")
11S = requests.Session()
12S.trust_env = False
13H = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/131.0",
14 "Referer": "https://fundf10.eastmoney.com/"}
15
16
17def history(code, need=1400, max_pages=90):
18 """该接口 pageSize 最多只给 20 条,只能翻页。"""
19 out = []
20 for i in range(1, max_pages + 1):
21 u = "https://api.fund.eastmoney.com/f10/lsjz?fundCode=%s&pageIndex=%d&pageSize=20" % (code, i)
22 try:
23 r = S.get(u, headers=H, timeout=20)
24 lst = ((r.json() or {}).get("Data") or {}).get("LSJZList") or []
25 except Exception:
26 break
27 if not lst:
28 break
29 out += lst
30 if len(out) >= need:
31 break
32 rows = [(x["FSRQ"], float(x["DWJZ"])) for x in out if x.get("DWJZ")]
33 rows.sort(key=lambda x: x[0])
34 # 去重
35 seen, clean = set(), []
36 for d, v in rows:
37 if d not in seen:
38 seen.add(d)
39 clean.append((d, v))
40 return clean
41
42
43def ma(v, n):
44 o = np.full(len(v), np.nan)
45 if len(v) >= n:
46 c = np.cumsum(np.insert(v, 0, 0))
47 o[n - 1:] = (c[n:] - c[:-n]) / n
48 return o
49
50
51def report(code):
52 h = history(code)
53 if len(h) < 30:
54 print(code, "没拿到净值")
55 return None
56 d = [x[0] for x in h]
57 v = np.array([x[1] for x in h], dtype=float)
58 m60 = ma(v, 60)
59
60 def ret(days):
61 if len(v) <= days:
62 return None
63 return v[-1] / v[-1 - days] - 1
64
65 peak = np.maximum.accumulate(v)
66 mdd = ((v - peak) / peak).min()
67 years = len(v) / 244
68 ann = (v[-1] / v[0]) ** (1 / years) - 1 if years > 0 else 0
69 above = v[-1] > m60[-1]
70 side = v > m60
71 streak = 0
72 for i in range(len(v) - 1, -1, -1):
73 if np.isnan(m60[i]):
74 break
75 if side[i] == above:
76 streak += 1
77 else:
78 break
79 r = {"code": code, "from": d[0], "to": d[-1], "n": len(v), "nav": v[-1],
80 "r1y": ret(244), "r3y": ret(244 * 3), "ann": ann, "mdd": mdd,
81 "above": bool(above), "streak": streak,
82 "gap": (v[-1] / m60[-1] - 1) * 100 if not np.isnan(m60[-1]) else None}
83 f = lambda x: "%+.1f%%" % (x * 100) if x is not None else "-"
84 print("%s | 净值 %s (%s) | 区间 %s~%s | 近1年 %s | 近3年 %s | 年化 %s | 最大回撤 %.1f%% | 60日线 %s 第%d天 | 偏离 %s" % (
85 code, "%.4f" % r["nav"], r["to"], r["from"], r["to"], f(r["r1y"]), f(r["r3y"]),
86 f(r["ann"]), r["mdd"] * 100, "上方" if above else "下方", streak,
87 "%+.1f%%" % r["gap"] if r["gap"] is not None else "-"))
88 return r
89
90
91if __name__ == "__main__":
92 codes = sys.argv[1:] or ["007466", "006965", "110020"]
93 res = [report(c) for c in codes]
94 os.makedirs(os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "out"), exist_ok=True)
95 with open(os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "out", "基金净值核对.json"), "w", encoding="utf-8") as f:
96 json.dump(res, f, ensure_ascii=False, indent=2)

文件内容是平台检查时读出的文本,只供查看。平台不会运行包里的任何脚本或程序。