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

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

相关推荐
栈与堆20 小时前
LeetCode-1-两数之和
java·数据结构·后端·python·算法·leetcode·rust
superman超哥20 小时前
双端迭代器(DoubleEndedIterator):Rust双向遍历的优雅实现
开发语言·后端·rust·双端迭代器·rust双向遍历
1二山似20 小时前
crmeb多商户启动swoole时报‘加密文件丢失’
后端·swoole
马卡巴卡20 小时前
Java CompletableFuture 接口与原理详解
后端
神奇小汤圆21 小时前
Java线程协作工具:CountDownLatch 、CyclicBarrier、Phaser、Semaphore 、Exchanger
后端
gelald21 小时前
ReentrantLock 学习笔记
java·后端
计算机学姐21 小时前
基于SpringBoot的校园资源共享系统【个性化推荐算法+数据可视化统计】
java·vue.js·spring boot·后端·mysql·spring·信息可视化
J_liaty21 小时前
RabbitMQ面试题终极指南
开发语言·后端·面试·rabbitmq
BD_Marathon1 天前
SpringBoot程序快速启动
java·spring boot·后端
行百里er1 天前
代码跑得慢?让Spring的StopWatch告诉你真相!
java·后端·github