Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
AI4Finance-Foundation
GitHub Repository: AI4Finance-Foundation/FinRL
Path: blob/master/finrl/meta/data_processors/processor_joinquant.py
732 views
1
from __future__ import annotations
2
3
import copy
4
import os
5
6
import jqdatasdk as jq
7
import numpy as np
8
import pandas as pd
9
from func import calc_all_filenames
10
from func import date2str
11
from func import remove_all_files
12
13
14
class JoinQuantEngineer:
15
def __init__(self):
16
pass
17
18
def auth(self, username, password):
19
jq.auth(username, password)
20
21
def data_fetch(self, stock_list, num, unit, end_dt):
22
df = jq.get_bars(
23
security=stock_list,
24
count=num,
25
unit=unit,
26
fields=["date", "open", "high", "low", "close", "volume"],
27
end_dt=end_dt,
28
)
29
return df
30
31
def preprocess(df, stock_list):
32
n = len(stock_list)
33
N = df.shape[0]
34
assert N % n == 0
35
d = int(N / n)
36
stock1_ary = df.iloc[0:d, 1:].values
37
temp_ary = stock1_ary
38
for j in range(1, n):
39
stocki_ary = df.iloc[j * d : (j + 1) * d, 1:].values
40
temp_ary = np.hstack((temp_ary, stocki_ary))
41
return temp_ary
42
43
# start_day: str
44
# end_day: str
45
# output: list of str_of_trade_day, e.g., ['2021-09-01', '2021-09-02']
46
def calc_trade_days_by_joinquant(self, start_day, end_day):
47
dates = jq.get_trade_days(start_day, end_day)
48
str_dates = [date2str(dt) for dt in dates]
49
return str_dates
50
51
# start_day: str
52
# end_day: str
53
# output: list of dataframes, e.g., [df1, df2]
54
def read_data_from_csv(self, path_of_data, start_day, end_day):
55
datasets = []
56
selected_days = self.calc_trade_days_by_joinquant(start_day, end_day)
57
filenames = calc_all_filenames(path_of_data)
58
for filename in filenames:
59
dataset_orig = pd.read_csv(filename)
60
dataset = copy.deepcopy(dataset_orig)
61
days = dataset.iloc[:, 0].values.tolist()
62
indices_of_rows_to_drop = [d for d in days if d not in selected_days]
63
dataset.drop(index=indices_of_rows_to_drop, inplace=True)
64
datasets.append(dataset)
65
return datasets
66
67
# start_day: str
68
# end_day: str
69
# read_data_from_local: if it is true, read_data_from_csv, and fetch data from joinquant otherwise.
70
# output: list of dataframes, e.g., [df1, df2]
71
def data_fetch_for_stocks(
72
self, stocknames, start_day, end_day, read_data_from_local, path_of_data
73
):
74
assert read_data_from_local in [0, 1]
75
if read_data_from_local == 1:
76
remove = 0
77
else:
78
remove = 1
79
remove_all_files(remove, path_of_data)
80
dfs = []
81
if read_data_from_local == 1:
82
dfs = self.read_data_from_csv(path_of_data, start_day, end_day)
83
else:
84
if os.path.exists(path_of_data) is False:
85
os.makedirs(path_of_data)
86
for stockname in stocknames:
87
df = jq.get_price(
88
stockname,
89
start_date=start_day,
90
end_date=end_day,
91
frequency="daily",
92
fields=["open", "close", "high", "low", "volume"],
93
)
94
dfs.append(df)
95
df.to_csv(path_of_data + "/" + stockname + ".csv", float_format="%.4f")
96
return dfs
97
98
99
if __name__ == "__main__":
100
import sys
101
102
sys.path.append("..")
103
# from finrl.neo_finrl.neofinrl_config import TRADE_START_DATE
104
# from finrl.neo_finrl.neofinrl_config import TRADE_END_DATE
105
# from finrl.neo_finrl.neofinrl_config import READ_DATA_FROM_LOCAL
106
# from finrl.neo_finrl.neofinrl_config import PATH_OF_DATA
107
108
# read_data_from_local = READ_DATA_FROM_LOCAL
109
# path_of_data = '../' + PATH_OF_DATA
110
111
path_of_data = "../" + "data"
112
113
TRADE_START_DATE = "20210901"
114
TRADE_END_DATE = "20210911"
115
READ_DATA_FROM_LOCAL = 1
116
117
e = JoinQuantEngineer()
118
username = "xxx" # should input your username
119
password = "xxx" # should input your password
120
e.auth(username, password)
121
122
trade_days = e.calc_trade_days_by_joinquant(TRADE_START_DATE, TRADE_END_DATE)
123
stocknames = ["000612.XSHE", "601808.XSHG"]
124
data = e.data_fetch_for_stocks(
125
stocknames, trade_days[0], trade_days[-1], READ_DATA_FROM_LOCAL, path_of_data
126
)
127
128