Path: blob/master/finrl/meta/data_processors/processor_joinquant.py
732 views
from __future__ import annotations12import copy3import os45import jqdatasdk as jq6import numpy as np7import pandas as pd8from func import calc_all_filenames9from func import date2str10from func import remove_all_files111213class JoinQuantEngineer:14def __init__(self):15pass1617def auth(self, username, password):18jq.auth(username, password)1920def data_fetch(self, stock_list, num, unit, end_dt):21df = jq.get_bars(22security=stock_list,23count=num,24unit=unit,25fields=["date", "open", "high", "low", "close", "volume"],26end_dt=end_dt,27)28return df2930def preprocess(df, stock_list):31n = len(stock_list)32N = df.shape[0]33assert N % n == 034d = int(N / n)35stock1_ary = df.iloc[0:d, 1:].values36temp_ary = stock1_ary37for j in range(1, n):38stocki_ary = df.iloc[j * d : (j + 1) * d, 1:].values39temp_ary = np.hstack((temp_ary, stocki_ary))40return temp_ary4142# start_day: str43# end_day: str44# output: list of str_of_trade_day, e.g., ['2021-09-01', '2021-09-02']45def calc_trade_days_by_joinquant(self, start_day, end_day):46dates = jq.get_trade_days(start_day, end_day)47str_dates = [date2str(dt) for dt in dates]48return str_dates4950# start_day: str51# end_day: str52# output: list of dataframes, e.g., [df1, df2]53def read_data_from_csv(self, path_of_data, start_day, end_day):54datasets = []55selected_days = self.calc_trade_days_by_joinquant(start_day, end_day)56filenames = calc_all_filenames(path_of_data)57for filename in filenames:58dataset_orig = pd.read_csv(filename)59dataset = copy.deepcopy(dataset_orig)60days = dataset.iloc[:, 0].values.tolist()61indices_of_rows_to_drop = [d for d in days if d not in selected_days]62dataset.drop(index=indices_of_rows_to_drop, inplace=True)63datasets.append(dataset)64return datasets6566# start_day: str67# end_day: str68# read_data_from_local: if it is true, read_data_from_csv, and fetch data from joinquant otherwise.69# output: list of dataframes, e.g., [df1, df2]70def data_fetch_for_stocks(71self, stocknames, start_day, end_day, read_data_from_local, path_of_data72):73assert read_data_from_local in [0, 1]74if read_data_from_local == 1:75remove = 076else:77remove = 178remove_all_files(remove, path_of_data)79dfs = []80if read_data_from_local == 1:81dfs = self.read_data_from_csv(path_of_data, start_day, end_day)82else:83if os.path.exists(path_of_data) is False:84os.makedirs(path_of_data)85for stockname in stocknames:86df = jq.get_price(87stockname,88start_date=start_day,89end_date=end_day,90frequency="daily",91fields=["open", "close", "high", "low", "volume"],92)93dfs.append(df)94df.to_csv(path_of_data + "/" + stockname + ".csv", float_format="%.4f")95return dfs969798if __name__ == "__main__":99import sys100101sys.path.append("..")102# from finrl.neo_finrl.neofinrl_config import TRADE_START_DATE103# from finrl.neo_finrl.neofinrl_config import TRADE_END_DATE104# from finrl.neo_finrl.neofinrl_config import READ_DATA_FROM_LOCAL105# from finrl.neo_finrl.neofinrl_config import PATH_OF_DATA106107# read_data_from_local = READ_DATA_FROM_LOCAL108# path_of_data = '../' + PATH_OF_DATA109110path_of_data = "../" + "data"111112TRADE_START_DATE = "20210901"113TRADE_END_DATE = "20210911"114READ_DATA_FROM_LOCAL = 1115116e = JoinQuantEngineer()117username = "xxx" # should input your username118password = "xxx" # should input your password119e.auth(username, password)120121trade_days = e.calc_trade_days_by_joinquant(TRADE_START_DATE, TRADE_END_DATE)122stocknames = ["000612.XSHE", "601808.XSHG"]123data = e.data_fetch_for_stocks(124stocknames, trade_days[0], trade_days[-1], READ_DATA_FROM_LOCAL, path_of_data125)126127128