import copy import datetime import os from typing import List import jqdatasdk as jq import numpy as np from meta.data_processors._base import _Base class Joinquant(_Base): def __init__( self, data_source: str, start_date: str, end_date: str, time_interval: str, **kwargs, ): super().__init__(data_source, start_date, end_date, time_interval, **kwargs) if "username" in kwargs.keys() and "password" in kwargs.keys(): jq.auth(kwargs["username"], kwargs["password"]) def download_data( self, ticker_list: List[str], save_path: str = "./data/dataset.csv" ): # joinquant supports: '1m', '5m', '15m', '30m', '60m', '120m', '1d', '1w', '1M'。'1w' denotes one week,‘1M' denotes one month。 count = len(self.get_trading_days(self.start_date, self.end_date)) df = jq.get_bars( security=ticker_list, count=count, unit=self.time_interval, fields=["date", "open", "high", "low", "close", "volume"], end_dt=self.end_date, ) df = df.reset_index().rename(columns={"level_0": "tic"}) self.dataframe = df self.save_data(save_path) print( f"Download complete! Dataset saved to {save_path}. \nShape of DataFrame: {self.dataframe.shape}" ) def preprocess(df, stock_list): n = len(stock_list) N = df.shape[0] assert N % n == 0 d = int(N / n) stock1_ary = df.iloc[0:d, 1:].values temp_ary = stock1_ary for j in range(1, n): stocki_ary = df.iloc[j * d : (j + 1) * d, 1:].values temp_ary = np.hstack((temp_ary, stocki_ary)) return temp_ary # start_day: str # end_day: str # output: list of str_of_trade_day, e.g., ['2021-09-01', '2021-09-02'] def get_trading_days(self, start_day: str, end_day: str) -> List[str]: dates = jq.get_trade_days(start_day, end_day) str_dates = [] for d in dates: tmp = datetime.date.strftime(d, "%Y-%m-%d") str_dates.append(tmp) # str_dates = [date2str(dt) for dt in dates] return str_dates