教你用 Python 快速获取相关概念股,辅助价值投资!

AirPython

共 4161字,需浏览 9分钟

 ·

2022-01-10 19:05


大家好,我是安果!
股票交易中,价格、成交量、委比、换手率、市盈率等都是比较重要的数据,它们能为我们购买股票、基金等提供一定的参考性
比如,我们看到一条关于「 猪 」的利好实时新闻,我们可以利用其中的一个参数或多个参数,借助算法筛选出最优的猪相关概念的股票、基金,提前进行布局,赚取一波信息红利

下面以「 市盈率 为例,讲解使用 Python 获取相关概念股的完整流程

1. 市盈率 PE

股票市盈率,简称 PE,是股票价格除以每股盈利的值,是价值投资中一个非常重要的财务指标

一般来说,市盈率越低,投资风险越小,投资价值越高

市盈率也分为 3 种

  • 市盈利 - 静

  • 市盈率 - 动

  • 市盈率 - 滚动 TTM

其中

市盈率(静)的值为总市值除以去年一年的总净利润

市盈率(动)的值为总市值除以预估今年全年的总净利润

市盈率(滚动)TTM 的值为总市值除以最近 4 个季度的总净利润

总体来说,市盈率 TTM 相比前两者,数据值更具体参考性

2. 爬取相关概念列表

目标对象:

aHR0cDovL3N0b2NrLmpyai5jb20uY24vY29uY2VwdC9jb25jZXB0cGFnZS5zaHRtbD90bz1wYw==

首先,利用 requests + lxml 获取网页元素进行解析

接着,利用正则过滤出关键数据,包含:相关概念名称、链接地址、相关概念 ID

import requests
from lxml import etree
import re

...
 def __get_concept_stocks_info(self):
        """
        获取概念股信息
        :return:
        """

        html_element = etree.HTML(self.session.get(self.home_url).text)
        a_elements = html_element.xpath('//p[@class="jrj-clear"]//a')

        result = []

        for a_element in a_elements:
            a_element_text = a_element.xpath('./text()')[0].replace('概念股''')
            a_element_href = a_element.xpath('./@href')[0]

            if self.keyword in a_element_text:
                a_element_tag = re.findall(r'^.*_(.*).shtml$', a_element_href)[-1]
                result.append({
                    "cs": a_element_text,
                    "href": a_element_href,
                    "tag": a_element_tag
                })
        return result
...

3. 爬取概念个股

分析个股列表页面后,发现列表数据来源于 JS 文件,URL 中的变量为上面的概念 ID

遍历相关概念列表,就可以获取到所有个股数据

PS:这里仅获取股票名称及编号

...
    def __get_concept_stocks(self, concept_stocks_info):
        """
        获取相关概念股列表
        :param concept_stocks_info:
        :return:
        """

        url = f'http://**/concept/conceptdetail/conceptStock_{concept_stocks_info.get("tag")}.js'
        headers = {'User-Agent': UserAgent().random}
        # 去掉换行符,转为中文
        resp = self.session.get(url, headers=headers).text.replace('\n''').encode('utf-8').decode(
            'unicode_escape')
        # 正则匹配,获取对应股票
        stocks_list = json.loads(re.findall(r'^.*"stockData":(.*)};$', resp, re.IGNORECASE)[0].replace("\'""\""))

        return [(item[1], item[0]) for item in stocks_list]
...
        # 2、获取相关概念列表
        for concept_stocks_info in concept_stocks_infos:
            concept_stocks = self.__get_concept_stocks(concept_stocks_info)
            # print('概念个股列表如下:')
            # print(concept_stocks)
...

# 4. 个股详情及排序

分析个股详情页面后,发现 URL 由时间戳及股票 ID 组成

我们只需要请求接口,利用正则进行匹配获取个股中需要的数据参数即可

...
        def __get_stock_info(self, concept_stock):
        """
        获取个股的基本信息
        :return:
        """

        stock_name = concept_stock[0]  # 股票名称
        stock_tag = concept_stock[1]  # 股票编号
        url = self.stock_home.format(stock_tag)

        # 编码问题
        headers = {'User-Agent': UserAgent().random}
        resp = self.session.get(self.stock_url.format(stock_tag, self.__get_time()),
                                headers=headers).text.replace('\n''')
        # 解析关键数据
        resp_data = json.loads(re.findall(r'^.*HqData:(.*)};$', resp, re.IGNORECASE)[0])[0]
        # print(resp_data)
        # 获取股票关键信息
        stock_price = resp_data[11]  # 实时价格
        # print(stock_price)
        # 获取涨跌
        stock_up_or_down = str(resp_data[19]) + "%"  # 涨跌幅
        # print("涨跌幅:", stock_up_or_down)
        stock_num_ratio = resp_data[22]  # 量比
        # print(stock_num_ratio)
        stock_change_ratio = str(resp_data[24]) + "%"  # 换手率
        # print(stock_change_ratio)
        stock_pe = resp_data[-1]  # 市盈率
        # print(stock_pe)

        return {
            "name": stock_name,
            "no": stock_tag,
            "url": url,
            "price": stock_price,
            "up_or_down": stock_up_or_down,
            "num_ratio": stock_num_ratio,
            "change_ratio": stock_change_ratio,
            "pe": stock_pe
        }
...

最后,我们按照市盈率进行升序排列

...
  # 4、按照市盈利排序(升序)
  stocks.sort(key=lambda x: x["pe"])

  # 5、打印
  print(json.dumps(stocks))
...

# 5. 总结一下

在使用的时候,我们只需要传入「 相关概念关键字参数 」,就可以按市盈率升序排列后,返回相关概念股列表

当然,你也可以利用个股中的其他数据参数进行组合排序,获取适合自己的投资策略

我已将文中所有源码上传到下方公众号后台,关注公众号「 煎蛋搞钱 后回复关键字220110 」即可以获取

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!


浏览 40
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报