量化人必看|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

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

相关推荐
汪子熙19 分钟前
如何使用 Node.js 代码下载 Github issue 到本地
javascript·后端
冒泡的肥皂20 分钟前
2PL-事务并发(二
数据库·后端·mysql
xiaok27 分钟前
nginx反向代理中server块中的配置信息详解
后端
LH_R32 分钟前
OneTerm 开源堡垒机 | 历时三个月重构大更新
运维·后端·安全
久下不停雨33 分钟前
单例模式代码实现
后端
用户849137175471634 分钟前
JDK 17 实战系列(第2期):核心语言特性深度解析
java·后端
自由的疯36 分钟前
Java 8 新特性之 Lambda 表达式
java·后端·架构
meiguiyulu37 分钟前
深入理解线程生命周期:从创建到终止的全状态解析
后端
自由的疯38 分钟前
Java 17 新特性之 Text Blocks(文本块)
java·后端·架构
用户849137175471638 分钟前
JustAuth实战系列(第2期):架构设计精髓 - 分层架构与设计原则
java·后端·架构