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 个自定义函数:
- get_component_codes(symbol):通过 akshare 库获取中证指数成份股代码,用于获取沪深 300 成分股,函数参数为中证指数的代码。
- get_score(element_pj):根据评级赋予相应的分数,进行量化,函数参数是对评级文字进行判断。
- get_valuation_ratios(code):获取价值大师的价值线,函数参数为代码
- get_all_valuation_ratios(index_code):用中证指数成份股获取价值大师价格,参数为中证指数代码
- get_all_valuation_ratios_xslx(file_index_code, sheet_name):通过读取 excel 中的列“代码”,从而获取价值大师价格。函数参数有 2,分别是 excel 所在的路径,以及 excel 表的名称。
- my_function(file_path, sheet_name):获取场内基金的价值估值数据,并保存到数据库。函数参数有 2,分别是 excel 所在的路径,以及 excel 表的名称。
- save_data(function, filename):将数据保存为 sql,函数参数有 2,分别是获取的数据,以及保存为数据库的表的名称。
需要修改的代码
根据自己的需要修改修改的代码主要有下面三方面:
- conn = sqlite3.connect(r'D:\wenjian\python\smart\data\my_data.db') :修改保 sqlite3数据保存路径。
- save_data(get_all_valuation_ratios('000300'), "沪深300成分价值"):需要获取数据成分股的中证指数代码。
- save_data(get_all_valuation_ratios_xslx(r"D:\wenjian\python\smart\data\my_picks.xlsx", '纳指100'), '纳指100价值'):修改成分股对象的存储路径。
python量化交易,获取量化模型之一的价值估值 - 西瓜视频 (ixigua.com)
吸引人的中文标题:
- 获取价值大师评级代码:简单高效获取股票评级数据
- 中证指数成份股代码:快速获取沪深300成分股代码
- 价值大师的价值线:揭秘投资大师的估值方法
- 场内基金的价值估值数据:挖掘基金投资机会的利器
- 用Excel获取价值大师价格:轻松获得个股估值信息
标签:
#金融 #投资 #股票 #数据分析 #基金 #python量化
版权声明:
作者:余汉波
链接:https://www.sanrenjz.com/2023/06/25/python-%e9%87%8f%e5%8c%96%e4%ba%a4%e6%98%93%ef%bc%8c%e8%8e%b7%e5%8f%96%e9%87%8f%e5%8c%96%e6%a8%a1%e5%9e%8b%e4%b9%8b%e4%b8%80%e7%9a%84%e4%bb%b7%e5%80%bc%e4%bc%b0%e5%80%bc-%e9%87%8f/
文章版权归作者所有,未经允许请勿转载。
THE END