Qlib外部股票数据获取(下)

在上篇文章中,展示了如何将joinquant的k线数据导入Qlib。本文将介绍如何将joinquant的k线数据及基本面等因子数据导入Qlib

思路
1.将每只股票的k线数据及基本面因子数据,汇总为一个csv文件
2.使目标文件夹产生n支股票csv文件。定义股票池,如科创50,则有50支股票csv文件
3.使用自定义函数,获取将下载数据转化为Qlib数据的cmd命令。
3.在Qlib的安装路径,运行cmd命令,使下载文件,转为Qlib文件

// 导入python库
import sys 
import os
import pandas as pd
from jqdatasdk import *
auth('', '')#此处输入,joinquant的账户和密码

如果想要获取joinquant的因子值,需会员权限。也可第一次注册joinquant,获得7天的免费使用权限,在此期间内,下载足够数据。

// 定义类

class Trans_Qlib:
    def __init__(self,stocks_pool = '000016.XSHG',store_name = 'stocks_50',factors = ['roa_ttm','roe_ttm'],
                 store_path = 'H:\\onedrive\\ML\\Qlib_project\\外部数据\\',start_date ='2017-01-01',end_date='2018-01-01'):
        self.stocks_pool = stocks_pool #股票池
        self.store_name = store_name #文件名,每次实例化,需要不同的文件名
        self.store_path = store_path #文件路径,定义类,内置好即可,无需多次调用
        self.factors = factors #需要获取的因子
        self.start_date = start_date
        self.end_date = end_date
        
    def factor_merge(self,):
        '''
        获取factor值,并将其拼接为dataframe
        '''
        df = get_factor_values(securities = ['000001.XSHE'], factors = self.factors,
                           start_date = self.start_date,end_date=self.end_date)
        init = False
        for factor in df.keys():
            factor_name = factor
            factor = df[factor]
            factor = factor.reset_index()
            factor.columns=['time',factor_name]
            factor.set_index('time',inplace=True)
            if init == False:
                result = pd.DataFrame(factor)
                init = True
            else:
                result = pd.merge(result,factor,on='time')
        #细节调整,使数据顺利输入Qlib
        result = result.reset_index()
        result = result.rename(columns = {'time':'date'})
        return result

    def stock_csv(self,):
        '''
            在目标文件夹返回n个csv股票数据文件
        '''

        stocks = get_index_stocks(self.stocks_pool) #获取股票池对应股票
        os.makedirs(str(self.store_path) + str(self.store_name)) #创建文件夹
        self.store_name = str(self.store_path) + str(self.store_name) + '\\' #确定储存目标文件夹
        for stock in stocks:
            df_factor = self.factor_merge()
            df_price = get_price(stock, start_date = self.start_date, end_date = self.end_date, frequency='daily',fq='pre')
            #print(df_price)
            df_price['stock_code'] = stock#创建新列
            df_price['date'] = df_price.index#创建新列
            order = ['stock_code', 'date', 'open', 'close', 'high', 'low', 'volume', 'money']#改变列位置
            df = pd.merge(df_price[order],df_factor,on='date')
            df.to_csv(self.store_name + stock + '.csv')
        print('csv_store:',self.store_name)
        return 
    
    def data_trans(self,Qlib_store = 'H:\onedrive\ML\qlib_data\stocks_50_data'):
        '''
        输入:
            Qlib转换目标文件夹
        输出:
            在qlib对应文件夹运行的cmd命令
            注意:这里输出的是cmd命令,需要到Qlib安装文件夹cmd运行,下载文件才可转化为Qlib形式
        '''
        
        self.Qlib_store = Qlib_store
        factors_ = ",".join(self.factors)
        result = 'python scripts/dump_bin.py dump_all --csv_path ' + str(self.store_name ) + ' -qlib_dir ' + str(self.Qlib_store  ) + ' --symbol_field_name stock_code --date_field_name date --include_fields open,high,low,close,volume,money,'+ factors_
        print(result)
        return

使用范例:

// 实例化运行
#第一次请运行注意,下载数据的路径,目标文件夹,股票池,因子等参数
a = Trans_Qlib(stocks_pool = '399009.XSHE',start_date='2015-01-01', end_date='2020-01-01',
store_name = 'stocks_shenzhen_200_last5_year_my_factors',factors =[ 'eps_ttm','roe_ttm'])
#下载文件到目标文件夹
a.stock_csv()
#得到代码,在Qlib安装路径cmd运行,下载数据转化为Qlib格式。
a.data_trans(Qlib_store = 'H:\onedrive\ML\qlib_data\stocks_meitan_last5_year_my_factors')

得到cmd代码如下
Qlib外部股票数据获取(下)_第1张图片
在安装Qlib文件夹使用cmd,我的安装路径为
在这里插入图片描述
在次文件路径输入cmd,跳转后输入以上生成代码即可。
结果如下,成功将下载文件转化为Qlib文件
Qlib外部股票数据获取(下)_第2张图片

不足:字典应当可以直接转化为dataframe形式,尝试几次效果都不理想。因子拼接最后使用pd.merge()方式,效率较低。如有解决方法,欢迎分享。

你可能感兴趣的:(Qlib,python,数据挖掘,神经网络,深度学习)