python 量化交易,获取量化模型之一的价值估值——量化04

获取价值大师评级代码

import akshare as ak
import requests
import re
from bs4 import BeautifulSoup
import pandas as pd
import sqlite3
import os
import time
import numpy as np

# 获取中证指数成份股代码
def get_component_codes(symbol):
    index_stock_cons_csindex = ak.index_stock_cons_csindex(symbol=symbol)
    codes = index_stock_cons_csindex['成分券代码']
    return codes

# 定义函数,根据element_pj的值返回对应的得分
def get_score(element_pj):
    if element_pj == "股价被严重高估":
        score = -2
    elif element_pj == "股价被高估":
        score = -1
    elif element_pj == "股价被低估":
        score = 1
    elif element_pj == "股价被严重低估":
        score = 2
    else:
        score = 0
    return score

# 通过代码,获取价值大师的价值线
def get_valuation_ratios(code):
    url = f'https://www.gurufocus.cn/stock/{code}/term/gf_value'
    response = requests.get(url)
    soup = BeautifulSoup(response.content, 'html.parser')

    # 获取大师价值线
    element_jzx = soup.select_one('#term-page-title').text.strip()
    element_jzx = re.findall("\d+\.\d+", element_jzx)[0]

    # 获取大师价值估值评价
    element_pj = soup.select_one('#q-app > div > div > main > div:nth-child(3) > div > div.column.term-container.col > div.content-section.q-pa-md.q-mt-sm.q-card.q-card--bordered.q-card--flat.no-shadow > div > div:nth-child(9) > span').text.strip()

    # 调取函数get_score,对大师价值估值评价进行得分估值
    Fraction_pj = get_score(element_pj)

    # 获取名称
    element_mc = soup.select_one('html body div div main div:nth-child(1) div:nth-child(2) div:nth-child(1) div:nth-child(1) div:nth-child(2) div:nth-child(1) h1 span:nth-child(1)').text.strip()

    # 获取现价
    element_xj = soup.select_one('html body div div main div:nth-child(1) div:nth-child(2) div:nth-child(1) div:nth-child(1) div:nth-child(2) div:nth-child(2)')
    element_xj.span.decompose()  # 去掉span标签
    element_xj = re.findall(r'\d+\.\d+', element_xj.text.strip())[0]  # 只保留数字和小数点

    # 获取市净率、市盈率、股息率和总市值的基本数据
    element_data = soup.select_one('#q-app > div > div > main > div.q-pt-sm.bg-white.shadow-1 > div.row.page-width-1440.paywall-trigger.login-trigger > div.col-12.col-md.q-mb-xs.q-mx-xs.q-card.q-card--flat.no-shadow.q-px-md > div:nth-child(2) > div').text.strip()
    
    # 拼接链接
    # link = f'https://www.gurufocus.cn/stock/{code}/summary'


    # 创建一个pandas DataFrame来保存比率
    ratios = pd.DataFrame({
        '代码': [code],
        '名称': [element_mc],
        '现价': [element_xj],
        '大师价值': [element_jzx],
        '评价': [element_pj],
        '价值估值': [Fraction_pj],
        '基本数据': [element_data],
    })

    # 将“代码”列设置为索引
    # ratios = ratios.set_index('代码')
    time.sleep(1)
    return ratios
# print(get_valuation_ratios('000001'))
# get_valuation_ratios('000001').to_csv('测试.csv', index=False)

# 用中证指数成份股获取价值大师价格
def get_all_valuation_ratios(index_code):   # 参数为中证指数代码
    codes = get_component_codes(index_code)     # 调取自定义函数——获取中证指数的代码列
    all_ratios = pd.DataFrame()      # 创建一个pandas DataFrame来保存所有的比率数据
    for code in codes:      # 遍历所有代码并获取比率数据
        try:
            ratios = get_valuation_ratios(code)     # 调取自定义函数——获取价值大师的方法
            all_ratios = pd.concat([all_ratios, ratios])    # 将遍历的数据进行拼接
        except Exception as e:
            print(f"Error occurred for code {code}: {e}")
            pass
    return all_ratios

# 通过读取excel中的列“代码”,从而获取价值大师价格
def get_all_valuation_ratios_xslx(file_index_code, sheet_name):
    codes = pd.read_excel(file_index_code, sheet_name=sheet_name, engine='openpyxl')['代码'].astype(str).tolist() # 读取csv文件,选择“代码”列,并将其转换为列表。
    all_ratios = pd.DataFrame()      # 创建一个pandas DataFrame来保存所有的比率数据
    for code in codes:      # 遍历所有代码并获取比率数据
        try:
            ratios = get_valuation_ratios(code)     # 调取自定义函数——获取价值大师的方法
            all_ratios = pd.concat([all_ratios, ratios])    # 将遍历的数据进行拼接
        except Exception as e:
            print(f"Error occurred for code {code}: {e}")
            pass
    return all_ratios

# 获取场内基金的价值估值数据,并保存到数据库
def my_function(file_path, sheet_name):
    # 读取Excel表格数据
    df = pd.read_excel(file_path, sheet_name=sheet_name)

    # 获取"指数代码"列的所有值
    index_codes = df["指数代码"].unique()

    # 创建一个新的DataFrame用于存储查询结果
    result = pd.DataFrame()

    # 遍历"指数代码"列中的所有值,查询exp_valuation中对应的行,并将结果添加到result中
    for index_code in index_codes:
        temp = ak.index_value_name_funddb().query(f'指数代码 == "{index_code}"')
        result = pd.concat([result, temp])

    # 将df与result进行横向合并
    merged_df = pd.merge(df, result, on="指数代码")

    # 使用numpy.select()函数根据条件判断,增加新列"绝对估值"
    conditions1 = [
        (merged_df["绝对依据"] == "PE") & (merged_df["最新PE"] > merged_df["绝对高"]),
        (merged_df["绝对依据"] == "PB") & (merged_df["最新PB"] > merged_df["绝对高"]),
        (merged_df["绝对依据"] == "PE") & (merged_df["最新PE"] < merged_df["绝对低"]),
        (merged_df["绝对依据"] == "PB") & (merged_df["最新PB"] < merged_df["绝对低"])
    ]
    choices1 = [-1, -1, 1, 1]
    merged_df["绝对估值"] = np.select(conditions1, choices1, default=0)
    merged_df["PE/ROE"] = merged_df.apply(lambda row: row["最新PE"] * row["最新PE"] / row["最新PB"] / 100, axis=1)

    # 增加新列"PE/ROE估值"
    conditions2 = [
        (merged_df["绝对依据"] == "PE") & (merged_df["PE/ROE"] > 2.7),
        (merged_df["绝对依据"] == "PB") & (merged_df["PE/ROE"] > 2.1),
        (merged_df["绝对依据"] == "PE") & (merged_df["PE/ROE"] < 0.9),
        (merged_df["绝对依据"] == "PB") & (merged_df["PE/ROE"] < 0.7)
    ]
    choices2 = [-1, -1, 1, 1]
    merged_df["PE/ROE估值"] = np.select(conditions2, choices2, default=0)

    # 增加新列"PE/ROE估值"
    conditions3 = [
        (merged_df["PE分位"] > 70) & (merged_df["PB分位"] > 70),
        (merged_df["PE分位"] < 30) & (merged_df["PB分位"] < 30)
    ]
    choices3 = [-1, 1]
    merged_df["百分位估值"] = np.select(conditions3, choices3, default=0)

    # 使用numpy.select()函数根据条件判断,增加新列"价值估值"
    conditions = [
        (merged_df["绝对估值"] + merged_df["PE/ROE估值"] + merged_df["百分位估值"] <= -2),
        (merged_df["绝对估值"] + merged_df["PE/ROE估值"] + merged_df["百分位估值"] == -1),
        (merged_df["绝对估值"] + merged_df["PE/ROE估值"] + merged_df["百分位估值"] == 1),
        (merged_df["绝对估值"] + merged_df["PE/ROE估值"] + merged_df["百分位估值"] >= 2)
    ]
    choices = [-2, -1, 1, 2]
    merged_df["价值估值"] = np.select(conditions, choices, default=0)

    # 读取数据库中的表“场内基金网格”的“close”列数据
    conn = sqlite3.connect(r'D:\wenjian\python\smart\data\my_data.db')
    query = "SELECT close FROM 场内基金网格"
    close_data = pd.read_sql_query(query, conn)

    # 将读取的close数据添加到merged_df作为新列“价格”
    merged_df["价格"] = close_data["close"]

    # 关闭数据库连接
    conn.close()
    
    return merged_df

# 将数据保存为sql
def save_data(function, filename):  # 第1个参数是自定义函数,第2个参数是存储名称
    conn = sqlite3.connect(r'D:\wenjian\python\smart\data\my_data.db') # sqlite3数据保存路径
    df = function   # 将要获取的自定义函数赋予新的函数
    df.to_sql(f'{filename}', conn, if_exists='replace', index=False)    # 导出sql
    conn.close()    # 关闭连接


if __name__ == '__main__':
    # save_data(get_all_valuation_ratios('000300'), "沪深300成分价值")

    # save_data(get_all_valuation_ratios_xslx(r"D:\wenjian\python\smart\data\my_picks.xlsx", '港股'), '港股价值')
    # save_data(get_all_valuation_ratios_xslx(r"D:\wenjian\python\smart\data\my_picks.xlsx", '美股中国企业'), "美股中国企业价值")
    save_data(get_all_valuation_ratios_xslx(r"D:\wenjian\python\smart\data\my_picks.xlsx", '纳指100'), '纳指100价值')
    # save_data(my_function(r"D:\wenjian\python\smart\data\my_picks.xlsx", "场内基金"), "场内基金价值")
    # print(get_valuation_ratios('00001'))
    

代码说明

代码共有 7 个自定义函数:

  1. get_component_codes(symbol):通过 akshare 库获取中证指数成份股代码,用于获取沪深 300 成分股,函数参数为中证指数的代码。
  2. get_score(element_pj):根据评级赋予相应的分数,进行量化,函数参数是对评级文字进行判断。
  3. get_valuation_ratios(code):获取价值大师的价值线,函数参数为代码
  4. get_all_valuation_ratios(index_code):用中证指数成份股获取价值大师价格,参数为中证指数代码
  5. get_all_valuation_ratios_xslx(file_index_code, sheet_name):通过读取 excel 中的列“代码”,从而获取价值大师价格。函数参数有 2,分别是 excel 所在的路径,以及 excel 表的名称。
  6. my_function(file_path, sheet_name):获取场内基金的价值估值数据,并保存到数据库。函数参数有 2,分别是 excel 所在的路径,以及 excel 表的名称。
  7. save_data(function, filename):将数据保存为 sql,函数参数有 2,分别是获取的数据,以及保存为数据库的表的名称。

需要修改的代码

根据自己的需要修改修改的代码主要有下面三方面:

  1. conn = sqlite3.connect(r'D:\wenjian\python\smart\data\my_data.db') :修改保 sqlite3数据保存路径。
  2. save_data(get_all_valuation_ratios('000300'), "沪深300成分价值"):需要获取数据成分股的中证指数代码。
  3. save_data(get_all_valuation_ratios_xslx(r"D:\wenjian\python\smart\data\my_picks.xlsx", '纳指100'), '纳指100价值'):修改成分股对象的存储路径。

python量化交易,获取量化模型之一的价值估值 - 西瓜视频 (ixigua.com)

吸引人的中文标题:

  1. 获取价值大师评级代码:简单高效获取股票评级数据
  2. 中证指数成份股代码:快速获取沪深300成分股代码
  3. 价值大师的价值线:揭秘投资大师的估值方法
  4. 场内基金的价值估值数据:挖掘基金投资机会的利器
  5. 用Excel获取价值大师价格:轻松获得个股估值信息

标签:

#金融 #投资 #股票 #数据分析 #基金 #python量化

THE END