量化人必看|miniQMT踩坑记:如何通过Python获取股票列表、行业、概念

最近这两天。我整个人泡在 miniQMT 里。整得头晕眼花。 不过也有点小成果,嘿嘿。趁着还没忘干净,赶紧来和你们唠一唠。

我打算把一些在量化会用到的,常用的方法整理成一个Python量化公共类 ,底层数据是通过xtquant+miniQMT获取的。整体还没写完,目前打算是写多少就先公开分享给大家,大家有什么需求但是我这里还没实现的也可以在评论区告诉花姐。

开始之前先说一个这几天调用xtquant遇到的问题:

我的量化环境用的是Python3.12、xtquant 250516版本

我们在获取行业、板块信息的时候,需要先通过download_sector_data下载板块分类信息,不然获取到的结果就为空,但是直接调用xtdata.download_sector_data()发现会卡死,等半天也没反映,粉丝群里好多小伙伴都遇到了这个问题,有人说回退到xtquant_241014 就可以了,于是我翻看了24版本的源码发现在download_sector_data时24 和25用的方法不一样!!!

于是我把下载板块分类信息的方法改成了下面这个,没想到卡顿现象就消失了。

python 复制代码
def down_load_sector():
    '''
    下载行业板块数据
    '''
    # 用这个方法代替xtdata.download_sector_data(),解决xtdata.download_sector_data()卡死的问题
    client = xtdata.get_client()
    client.down_all_sector_data()

遇到问题有时候翻看下源码,也是很好的解决方案啊!

说了好多废话,开始步入正题:

上代码

今天主要分享的是获取股票列表,股票对应的申万1、2、3级行业还有股票对应的概念。 代码怎么用?

这些数据都是不经常变动的,做量化的小伙伴推荐每周更新一次即可,我这里是直接导出生成了csv文件,后期需要获取对应数据的时候直接读csv文件即可。有能力的小伙伴可以在这个基础上把数据存放到数据库,这才是最优解!

python 复制代码
from xtquant import xtdata
import pandas as pd

def down_load_sector():
    '''
    下载行业板块数据
    '''
    # 用这个方法代替xtdata.download_sector_data(),解决xtdata.download_sector_data()卡死的问题
    client = xtdata.get_client()
    client.down_all_sector_data()

def get_stock_pool():
    '''
    获取股票池,返回全部A股的代码和对应的股票名称(没有北京的)
    '''
    
    stocks = xtdata.get_stock_list_in_sector("沪深A股")

    info_list = xtdata.get_instrument_detail_list(stocks)
    ret =[]
    for stock in stocks:
        name = info_list[stock]['InstrumentName']
        ret.append({"stock":stock,"name":name})
        
    df = pd.DataFrame(ret)
    df = df.sort_values(by="stock")
    df.to_csv("沪深A股股票池.csv",index=False)
    return df

def get_sw1_industry():
    '''
    获取股票对应的申万一级行业
    '''
    down_load_sector()
    sector_list = xtdata.get_sector_list()
    sw1_list = [s for s in sector_list if s[:3].lower()=='sw1' and '加权' not in s] #获取申万一级行业

    stocks = xtdata.get_stock_list_in_sector("沪深A股")
    ret =[]
    for sw1 in sw1_list:
        s_list = xtdata.get_stock_list_in_sector(sw1)
        for stock in stocks:
            if stock in s_list:
                ret.append({'stock':stock,'industry_sw1':sw1[3:]})
    
    df = pd.DataFrame(ret)
    df = df.sort_values(by="stock")
    df.to_csv("沪深A股申万一级行业.csv",index=False)
    return df

def get_sw2_industry():
    '''
    获取股票对应的申万二级行业
    '''
    down_load_sector()
    sector_list = xtdata.get_sector_list()
    sw2_list = [s for s in sector_list if s[:3].lower()=='sw2' and '加权' not in s] #获取申万二级行业

    stocks = xtdata.get_stock_list_in_sector("沪深A股")
    ret =[]
    for sw2 in sw2_list:
        s_list = xtdata.get_stock_list_in_sector(sw2)
        for stock in stocks:
            if stock in s_list:
                ret.append({'stock':stock,'industry_sw2':sw2[3:]})
    
    df = pd.DataFrame(ret)
    df = df.sort_values(by="stock")
    df.to_csv("沪深A股申万二级行业.csv",index=False)
    return df

def get_sw3_industry():
    '''
    获取股票对应的申万三级行业
    '''
    down_load_sector()
    sector_list = xtdata.get_sector_list()
    sw3_list = [s for s in sector_list if s[:3].lower()=='sw3' and '加权' not in s] #获取申万三级行业

    stocks = xtdata.get_stock_list_in_sector("沪深A股")
    ret =[]
    for sw3 in sw3_list:
        s_list = xtdata.get_stock_list_in_sector(sw3)
        for stock in stocks:
            if stock in s_list:
                ret.append({'stock':stock,'industry_sw3':sw3[3:]})
    
    df = pd.DataFrame(ret)
    df = df.sort_values(by="stock")
    df.to_csv("沪深A股申万三级行业.csv",index=False)
    return df
    

def get_gainian():
    '''
    获取股票对应的概念
    '''
    down_load_sector()
    sector_list = xtdata.get_sector_list()
    gn_list = [s for s in sector_list if s[:2].lower()=='gn'] #所有概念

    stocks = xtdata.get_stock_list_in_sector("沪深A股")
    ret =[]
    for gn in gn_list:
        s_list = xtdata.get_stock_list_in_sector(gn)
        for stock in stocks:
            if stock in s_list:
                ret.append({'stock':stock,'gainian':gn[2:]})
    
    df = pd.DataFrame(ret)
    df = df.sort_values(by="stock")
    df.to_csv("沪深A股所属概念.csv",index=False)
    return df

今天的文章就到这里了,我们明天见。

相关推荐
豌豆花下猫1 小时前
Python 潮流周刊#118:Python 异步为何不够流行?(摘要)
后端·python·ai
秋难降2 小时前
SQL 索引突然 “罢工”?快来看看为什么
数据库·后端·sql
Access开发易登软件3 小时前
Access开发导出PDF的N种姿势,你get了吗?
后端·低代码·pdf·excel·vba·access·access开发
中国胖子风清扬4 小时前
Rust 序列化技术全解析:从基础到实战
开发语言·c++·spring boot·vscode·后端·中间件·rust
bobz9654 小时前
分析 docker.service 和 docker.socket 这两个服务各自的作用
后端
野犬寒鸦4 小时前
力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)
java·数据结构·后端·算法·leetcode
phiilo5 小时前
golang 设置进程退出时kill所有子进程
后端
花花无缺5 小时前
python自动化-pytest-用例发现规则和要求
后端·python
程序员小假5 小时前
我们来说一说 Cglib 与 JDK 动态代理
后端
摆烂工程师7 小时前
教你如何认证 Gemini 教育优惠的二次验证,薅个 1年的 Gemini Pro 会员
后端·程序员·gemini