当前位置:首页>python>Python之小试牛刀(二)-抓取公开的指数基金估值

Python之小试牛刀(二)-抓取公开的指数基金估值

  • 2026-10-11 08:41:03
Python之小试牛刀(二)-抓取公开的指数基金估值

     对于前几天的心血来潮的估值图说实在,心理是不怎么满意的,纯粹是Python练手而已,既然想学,就给自己今天开始上点小难度,拿取某球网站上的估值数据试试。

     一脸认真打开某球网站的估值数据,抱着学习的态度,准备直接拷贝估值数据下来,结果发现拷贝快捷键被禁止了(一脸的姨母笑),而且鼠标无法选取。查看网页源码一看,竟然没有任何数据,冒汗!看来超出我以前做网站的知识了!一看网页源码都是后台的.JS代码,在网上一查,明白了,这种情况网页通常采用node.js或一种虚拟的DOM形式呢。管它呢,通过抓包浏览器的请求数据包分析看看,不查不知道,一查嚇了我一跳,原来网页在后台一直读取某一专门的网址,打开一看全是基金的JSON数据,哈哈哈~~~(头有点晕)至此,数据问题搞定!(后边有Python源码)

       接着就是怎么把数据抓下来了,决定模仿浏览器的方式,让网站认为是网页浏览器客户端在访问,C#源码如下:(Python版本等我找到再放上来)

        private void InitHttpClient()

        {

            _httpClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36");

            _httpClient.Timeout = TimeSpan.FromSeconds(15);

        }

     然后就是做个任务把数据抓下来后解析并存入CSV文件数据库:

        private async Task<List<IndexEvaModel>> FetchDataAsync()

        {

            var response = await _httpClient.GetAsync(ApiUrl);

            response.EnsureSuccessStatusCode();

            string json = await response.Content.ReadAsStringAsync();

            dynamic jsonObj = JsonConvert.DeserializeObject(json);

            var items = jsonObj.data.items;

            var result = new List<IndexEvaModel>();

            // 获取今年的年份,用于补全日期

            int currentYear = DateTime.Now.Year;

            foreach (var item in items)

            {

                // 【关键修改 1】获取 API 中的 date 字段并处理年份

                string apiDate = item.date?.ToString() ?? "";

                if (!string.IsNullOrEmpty(apiDate))

                {

                    // 如果是 MM-dd 格式(长度为5),补全今年年份

                    if (apiDate.Length == 5 && apiDate.Contains("-"))

                    {

                        fullDate = $"{currentYear}-{apiDate}";

                    }

                    else

                    {

                        // 如果 API 未来返回了完整日期,直接使用

                        fullDate = apiDate;

                    }

                }

                else

                {

                    // 兜底:如果 API 没返回日期,用今天

                    fullDate = DateTime.Now.ToString("yyyy-MM-dd");

                }

                var model = new IndexEvaModel

                {

                    GuCode = item.index_code?.ToString() ?? "",

                    GuName = item.name?.ToString() ?? "",

                    CategoryName = _tTypeMap.TryGetValue(item.ttype?.ToString() ?? "", out int t) ? t : 0,

                    GuPe = item.pe != null ? Math.Round(Convert.ToDouble(item.pe), 4).ToString() : "",

                    PePercent = item.pe_percentile != null ? Math.Round(Convert.ToDouble(item.pe_percentile) * 100, 2) + "%" : "",

                    GuPb = item.pb != null ? Math.Round(Convert.ToDouble(item.pb), 4).ToString() : "",

                    PbPercent = item.pb_percentile != null ? Math.Round(Convert.ToDouble(item.pb_percentile) * 100, 2) + "%" : "",

                    Xilv = item.yeild != null ? Math.Round(Convert.ToDouble(item.yeild) * 100, 2) + "%" : "",

                    Roe = item.roe != null ? Math.Round(Convert.ToDouble(item.roe) * 100, 2) + "%" : "0",

                    Valuation = _evaTypeMap.TryGetValue(item.eva_type?.ToString() ?? "", out int v) ? v : -1,

                    PrePeg = item.peg != null ? Math.Round(Convert.ToDouble(item.peg), 4).ToString() : "",

                    // 【关键修改 2】使用处理后的完整日期

                    Vdate = fullDate

                };

                result.Add(model);

            }

            return result;

        }

三下五除二搞定,存为csv文件。

接下来是Python重头戏了,开工,读取csv数据,利用Python的PLOT做分析数据估值对比,估值分布和总结图表与HTML估值分类报告。此处我就不在详述。有兴趣的可以参考下边分享的Python源码。见下边分析结果:

1.指数估值对比图

2.估值分布图
3.估值分析总结
4.指数估值报告(按行业分了宽基,策略,行业等,点击可以排序)

关注我,分享更多好东西,Python源码实现报告见下边内容:

https://www.xtuwz.com/forum.php?mod=viewthread&tid=3701&extra=page%3D1

最新文章

随机文章