
最近星球同学问我, 虽然问财可以通过query语句获取 个股的概念、行业,但里面的概念实在太多,很多概念其实并没那么重要。 能否提取里面的核心概念。
这里说下我的简单处理思路。 我们做一个核心概念映射, 把相关的概念的 映射到一个自定义的概念,比如你关心的,这样看着相对清晰。 比如我写了一个下面的字典类, 写的并不全, 只是做一下抛砖引玉的效果。
另外像一些国企改革、深股通、沪股通这类的 概念, 其实大部分用不上,我们可以写一个过滤程序把这类概念过滤掉。
# 核心概念映射字典
core_concept_mapping = {
'白酒': [r'白酒'],
'银行': [r'银行', r'商业银行', r'城商行', r'农商行'],
'黄金': [r'黄金', r'贵金属', r'金矿'],
'电力': [r'电力', r'电网', r'输配电', r'智能电网'],
'创新药': [r'创新药', r'生物制药', r'抗体药物', r'基因治疗', r'ADC药物'],
'汽车': [r'汽车整车', r'汽车制造', r'乘用车', r'商用车'],
'电池': [r'锂电池', r'动力电池', r'固态电池', r'钠离子电池'],
'CPO': [r'CPO', r'共封装光学', r'光电共封装'],
'液冷': [r'液冷', r'液冷散热', r'液冷技术', r'冷却技术'],
'食品': [r'食品饮料', r'休闲食品', r'乳制品', r'调味品'],
'芯片': [r'芯片', r'半导体', r'集成电路', r'光刻机', r'EDA', r'封测', r'晶圆'],
'旅游': [r'旅游', r'文旅', r'景区', r'酒店', r'免税', r'旅行社', r'在线旅游'],
'券商': [r'券商', r'证券公司', r'证券经纪', r'投行业务', r'财富管理'],
'保险': [r'保险', r'寿险', r'财险', r'再保险', r'保险代理', r'保险科技'],
'机器人': [r'机器人', r'工业机器人', r'服务机器人', r'人形机器人', r'自动化设备', r'机器视觉'],
'化工': [r'化工', r'化学制品', r'新材料', r'精细化工', r'特种化学品', r'聚氨酯', r'氟化工'],
'基建': [r'基建', r'工程建设', r'路桥建设', r'水利工程', r'轨道交通', r'城市管网'],
'房地产': [r'房地产', r'房地产开发', r'商业地产', r'物业管理', r'保障房', r'REITs'],
'军工': [r'军工', r'航空航天', r'武器装备', r'国防军工', r'军民融合', r'卫星导航']
}
exclude_concepts = ['融资融券', '国企改革', '深股通', '沪股通', '同花顺出海50', '同花顺漂亮100', '同花顺新质50',
'高股息精选', '超级品牌', '证金持股', '同花顺果指数', '同花顺中特估100']代码形如这样处理
def map_to_core_concepts(concept_str):
"""将原始概念映射到核心概念"""
if not isinstance(concept_str, str):
return ""
matched_concepts = set()
for concept in concept_str.split(';'):
for core_concept, patterns in core_concept_mapping.items():
if any(re.search(pattern, concept) for pattern in patterns):
matched_concepts.add(core_concept)
return ";".join(sorted(matched_concepts))
另外一些同学喜欢用开盘啦的概念数据, 认识我的同学都知道,我之前写过 开盘啦概念个股分析文章, 一个概念下有多只个股, 一只个股也属于多个概念, 我们可以通过获取的数据,进行一下处理得到自己想要的数据。

上述原数据是 一个概念板块对应具体个股, 我们可以pandas技术处理变成1个个股对应的多个概念。处理结果类似下面的截图

这里写一个例子,假设你已经拥有一个csv文件,
import pandas as pd
from io import StringIO
def merge_stock_concepts(csv_file_path, output_file_path=None):
"""
读取概念CSV文件,合并同一股票的所有概念信息
Parameters:
csv_file_path (str): 输入的CSV文件路径
output_file_path (str, optional): 输出文件路径,如果不提供则只返回DataFrame
Returns:
pandas.DataFrame: 包含合并后概念信息的DataFrame
"""
try:
# 读取CSV文件
df = pd.read_csv(csv_file_path)
df['股票代码'] = df['股票代码'].str.zfill(6)
# 打印原始数据信息
print(f"原始数据形状: {df.shape}")
print(f"原始数据列名: {list(df.columns)}")
print("\n前5行数据:")
print(df.head())
# 检查必要的列是否存在
required_columns = ['股票代码', '股票名称', '概念名称']
for col in required_columns:
if col not in df.columns:
raise ValueError(f"CSV文件中缺少必要的列: {col}")
# 按照股票代码和股票名称分组,合并概念信息
# 使用agg函数将同一股票的概念名称合并为列表,其他列取第一个值
grouped_df = df.groupby(['股票代码', '股票名称']).agg({
'概念名称': lambda x: ', '.join(sorted(set(x))), # 去重并排序
'分类名称': 'first',
}).reset_index()
# 打印处理后的信息
print(f"\n处理后的数据形状: {grouped_df.shape}")
print(f"共处理了 {len(grouped_df)} 只股票的概念信息")
# 如果提供了输出文件路径,则保存结果
if output_file_path:
grouped_df.to_csv(output_file_path, index=False, encoding='utf-8-sig')
print(f"\n结果已保存到: {output_file_path}")
return grouped_df
except FileNotFoundError:
print(f"错误: 找不到文件 {csv_file_path}")
return None
except Exception as e:
print(f"处理过程中发生错误: {str(e)}")
return None
# 示例使用
if __name__ == "__main__":
# 替换为你的CSV文件路径
input_csv = "concept.csv"
output_csv = "merged_concepts.csv"
# 执行合并操作
result_df = merge_stock_concepts(input_csv, output_csv)
# 显示处理结果
if result_df is not None:
print("\n===== 合并后的概念信息示例 =====")
print(result_df[['股票代码', '股票名称', '概念名称']].head(10))
# 显示有哪些股票有多个概念
multi_concept_stocks = result_df[result_df['概念名称'].str.contains(',')]
if not multi_concept_stocks.empty:
print(f"\n===== 拥有多个概念的股票 (共{len(multi_concept_stocks)}只) =====")
for _, row in multi_concept_stocks.iterrows():
print(f"{row['股票代码']} {row['股票名称']}: {row['概念名称']}")分析技术思路为主,希望对你有所帮助。 其实做量化你只要有 稳定的数据源, 学习pandas等数据分析库, 你想怎么玩就怎么玩。
如果我的分享对你投资有所帮助,不吝啬给个点赞关注呗。