The implementation of the paper "HIST: A Graph-based Framework for Stock Trend Forecasting via Mining Concept-Oriented Shared Information".

Related tags

Deep Learning HIST
Overview

The HIST framework for stock trend forecasting

The implementation of the paper "HIST: A Graph-based Framework for Stock Trend Forecasting via Mining Concept-Oriented Shared Information". image

Environment

  1. Install python3.7, 3.8 or 3.9.
  2. Install the requirements in requirements.txt.
  3. Install the Qlib and download the data:
    # install Qlib from source
    pip install --upgrade  cython
    git clone https://github.com/microsoft/qlib.git && cd qlib
    python setup.py install
    
    # Download the stock features of Alpha360
    python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn --version v2
    

Reproduce the stock trend forecasting results

image

git clone https://github.com/Wentao-Xu/HIST.git
cd HIST
mkdir output

Reproduce our HIST framework

# CSI 100
python learn.py --model_name HIST --data_set csi100 --hidden_size 128 --num_layers 2 --outdir ./output/csi100_HIST

# CSI 300
python learn.py --model_name HIST --data_set csi300 --hidden_size 128 --num_layers 2 --outdir ./output/csi300_HIST

Reproduce the baselines

  • MLP
# MLP on CSI 100
python learn.py --model_name MLP --data_set csi100 --hidden_size 512 --num_layers 3 --outdir ./output/csi100_MLP

# MLP on CSI 300
python learn.py --model_name MLP --data_set csi300 --hidden_size 512 --num_layers 3 --outdir ./output/csi300_MLP
  • LSTM
# LSTM on CSI 100
python learn.py --model_name LSTM --data_set csi100 --hidden_size 128 --num_layers 2 --outdir ./output/csi100_LSTM

# LSTM on CSI 300
python learn.py --model_name LSTM --data_set csi300 --hidden_size 128 --num_layers 2 --outdir ./output/csi300_LSTM
  • GRU
# GRU on CSI 100
python learn.py --model_name GRU --data_set csi100 --hidden_size 128 --num_layers 2 --outdir ./output/csi100_GRU

# GRU on CSI 300
python learn.py --model_name GRU --data_set csi300 --hidden_size 64 --num_layers 2 --outdir ./output/csi300_GRU
  • SFM
# SFM on CSI 100
python learn.py --model_name SFM --data_set csi100 --hidden_size 64 --num_layers 2 --outdir ./output/csi100_SFM

# SFM on CSI 300
python learn.py --model_name SFM --data_set csi300 --hidden_size 128 --num_layers 2 --outdir ./output/csi300_SFM
  • GATs
# GATs on CSI 100
python learn.py --model_name GATs --data_set csi100 --hidden_size 128 --num_layers 2 --outdir ./output/csi100_GATs

# GATs on CSI 300
python learn.py --model_name GATs --data_set csi300 --hidden_size 64 --num_layers 2 --outdir ./output/csi300_GATs
  • ALSTM
# ALSTM on CSI 100
python learn.py --model_name ALSTM --data_set csi100 --hidden_size 64 --num_layers 2 --outdir ./output/csi100_ALSTM

# ALSTM on CSI 300
python learn.py --model_name ALSTM --data_set csi300 --hidden_size 128 --num_layers 2 --outdir ./output/csi300_ALSTM
  • Transformer
# Transformer on CSI 100
python learn.py --model_name Transformer --data_set csi100 --hidden_size 32 --num_layers 3 --outdir ./output/csi100_Transformer

# Transformer on CSI 300
python learn.py --model_name Transformer --data_set csi300 --hidden_size 32 --num_layers 3 --outdir ./output/csi300_Transformer
  • ALSTM+TRA

    We reproduce the ALSTM+TRA with its source code.

Comments
  • Accepted for Publication?

    Accepted for Publication?

    Dear Author,

    Interesting work! I wonder if this paper is already accepted by a top conference or not. Could you please reveal some information about the publication? Thanks a lot.

    Best regards, Shaun

    opened by DoThingYo 4
  • What does Precision@N mean?

    What does Precision@N mean?

    Dear author:

    Thanks for your work! I read your paper but I have some questions about the evaluation metrics. I am confused about Precision@N. According to Appendix A.2., “The Precision@N is the proportion of top N predictions on each day with the positive label.” I don't understand what that means, maybe sometimes almost all stocks have negative labels, in addition I find the recall metrics are not satisfactory.

    Looking forward to your reply!

    opened by a919480698 3
  • HIST: what's the source of stock2concept data

    HIST: what's the source of stock2concept data

    In the file, there are over 4000 concepts, it's beyond the number of stocks. What's the source of stockeconcept data? I can't find them in the tushare

    opened by tao1fan 2
  • How to change dataset from CSI300 to CSI00

    How to change dataset from CSI300 to CSI00

    Dear authors,

    I am really interested about your paper, but there are some problems when I tried to make some change to the dataset.

    The publiced data file only contains data from CSI300, but now I want to change dataset from CSI300 to CSI100. How can I get data like "csi300_market_value_07to20", "csi300_market_value_07to20", etc.

    Thank you for your help

    opened by markone1 2
  • RuntimeError: Device index must not be negative

    RuntimeError: Device index must not be negative

    Dear author @Wentao-Xu ,

    I can reproduce the Baselines without error, however RuntimeError appeared when I ran the HIST model. I have set all the package to the according version as mentioned in the requirements.txt. But error keeps appearing when it starts training.

    我可以复现Baselines的模型,但是在跑HIST的时候会出现RuntimeError报错。我已经把要求的库都降级到相应的版本,但是仍然出现如下报错。

    [2022-02-17 11:43:15] - Running 0 Epoch: 0 [2022-02-17 11:43:15] - training... 0%| [2364:MainThread](2022-02-17 11:43:15,750) ERROR - qlib.workflow - [utils.py:38] - An exception has been raised[RuntimeError: Device index must not be negative]. File "learn.py", line 450, in main(args) File "learn.py", line 288, in main train_epoch(epoch, model, optimizer, train_loader, writer, args, stock2concept_matrix) File "learn.py", line 116, in train_epoch pred = model(feature, stock2concept_matrix[stock_index], market_value) File "D:\anaconda3\envs\qlib\lib\site-packages\torch\nn\modules\module.py", line 889, in _call_impl result = self.forward(*input, **kwargs) File "D:\Codes\HIST\model.py", line 79, in forward device = torch.device(torch.get_device(x+1)) RuntimeError: Device index must not be negative

    I wonder why it is the case and how can I fix it? Thank you for your time!

    请问应该怎么解决这一问题呢?谢谢!

    opened by 1eunght 1
  • Does Predefined Concept Data provided in 'csi300_stock2concept.npy' contain future information?

    Does Predefined Concept Data provided in 'csi300_stock2concept.npy' contain future information?

    Dear authors,

    The paper mentioned that the change of stocks’ industry and businesses causes the number of predefined concepts change dynamically. However, it seems like that the same predefined concept data was used in training and testing process. if stock2concept_matrix is created using data from 01/01/2007 to 12/31/2020, with training set (from 01/01/2007 to 12/31/2014), validation set (from 01/01/2015 to 12/31/2016), and test set (from 01/01/2017 to 12/31/2020), there is a problem that the training process is influenced by future information from stock2concept_matrix. I would appreciate that you could provide the extraction process of the stock-to-predefined concept data.

    opened by xmm1016 1
  • About calculate the cos similarity

    About calculate the cos similarity

    i_shared_info, hidden in model.py line 116, are you calculate the same tensor? it seems hidden is equal to i_shared_info, even if i debug and step in cal_cos_similarity, the two paramters of cal_cos_similarity function is the same

    Hidden Concept Module

        i_shared_info = x_hidden - e_shared_back
        hidden = i_shared_info
        i_stock_to_concept = cal_cos_similarity(i_shared_info, hidden)
    
    opened by Axl-zhang 1
  • Bump numpy from 1.21.0 to 1.22.0

    Bump numpy from 1.21.0 to 1.22.0

    Bumps numpy from 1.21.0 to 1.22.0.

    Release notes

    Sourced from numpy's releases.

    v1.22.0

    NumPy 1.22.0 Release Notes

    NumPy 1.22.0 is a big release featuring the work of 153 contributors spread over 609 pull requests. There have been many improvements, highlights are:

    • Annotations of the main namespace are essentially complete. Upstream is a moving target, so there will likely be further improvements, but the major work is done. This is probably the most user visible enhancement in this release.
    • A preliminary version of the proposed Array-API is provided. This is a step in creating a standard collection of functions that can be used across application such as CuPy and JAX.
    • NumPy now has a DLPack backend. DLPack provides a common interchange format for array (tensor) data.
    • New methods for quantile, percentile, and related functions. The new methods provide a complete set of the methods commonly found in the literature.
    • A new configurable allocator for use by downstream projects.

    These are in addition to the ongoing work to provide SIMD support for commonly used functions, improvements to F2PY, and better documentation.

    The Python versions supported in this release are 3.8-3.10, Python 3.7 has been dropped. Note that 32 bit wheels are only provided for Python 3.8 and 3.9 on Windows, all other wheels are 64 bits on account of Ubuntu, Fedora, and other Linux distributions dropping 32 bit support. All 64 bit wheels are also linked with 64 bit integer OpenBLAS, which should fix the occasional problems encountered by folks using truly huge arrays.

    Expired deprecations

    Deprecated numeric style dtype strings have been removed

    Using the strings "Bytes0", "Datetime64", "Str0", "Uint32", and "Uint64" as a dtype will now raise a TypeError.

    (gh-19539)

    Expired deprecations for loads, ndfromtxt, and mafromtxt in npyio

    numpy.loads was deprecated in v1.15, with the recommendation that users use pickle.loads instead. ndfromtxt and mafromtxt were both deprecated in v1.17 - users should use numpy.genfromtxt instead with the appropriate value for the usemask parameter.

    (gh-19615)

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Update dataloader.py

    Update dataloader.py

    to solve this problem [3026:MainThread](2022-06-20 04:28:14,130) ERROR - qlib.workflow - [utils.py:41] - An exception has been raised[TabError: inconsistent use of tabs and spaces in indentation (dataloader.py, line 12)]. File "learn.py", line 30, in from dataloader import DataLoader TabError: inconsistent use of tabs and spaces in indentation (dataloader.py, line 12)

    opened by jxkd123 0
  • Bump numpy from 1.19.2 to 1.21.0

    Bump numpy from 1.19.2 to 1.21.0

    Bumps numpy from 1.19.2 to 1.21.0.

    Release notes

    Sourced from numpy's releases.

    v1.21.0

    NumPy 1.21.0 Release Notes

    The NumPy 1.21.0 release highlights are

    • continued SIMD work covering more functions and platforms,
    • initial work on the new dtype infrastructure and casting,
    • universal2 wheels for Python 3.8 and Python 3.9 on Mac,
    • improved documentation,
    • improved annotations,
    • new PCG64DXSM bitgenerator for random numbers.

    In addition there are the usual large number of bug fixes and other improvements.

    The Python versions supported for this release are 3.7-3.9. Official support for Python 3.10 will be added when it is released.

    :warning: Warning: there are unresolved problems compiling NumPy 1.21.0 with gcc-11.1 .

    • Optimization level -O3 results in many wrong warnings when running the tests.
    • On some hardware NumPy will hang in an infinite loop.

    New functions

    Add PCG64DXSM BitGenerator

    Uses of the PCG64 BitGenerator in a massively-parallel context have been shown to have statistical weaknesses that were not apparent at the first release in numpy 1.17. Most users will never observe this weakness and are safe to continue to use PCG64. We have introduced a new PCG64DXSM BitGenerator that will eventually become the new default BitGenerator implementation used by default_rng in future releases. PCG64DXSM solves the statistical weakness while preserving the performance and the features of PCG64.

    See upgrading-pcg64 for more details.

    (gh-18906)

    Expired deprecations

    • The shape argument numpy.unravel_index cannot be passed as dims keyword argument anymore. (Was deprecated in NumPy 1.16.)

    ... (truncated)

    Commits
    • b235f9e Merge pull request #19283 from charris/prepare-1.21.0-release
    • 34aebc2 MAINT: Update 1.21.0-notes.rst
    • 493b64b MAINT: Update 1.21.0-changelog.rst
    • 07d7e72 MAINT: Remove accidentally created directory.
    • 032fca5 Merge pull request #19280 from charris/backport-19277
    • 7d25b81 BUG: Fix refcount leak in ResultType
    • fa5754e BUG: Add missing DECREF in new path
    • 61127bb Merge pull request #19268 from charris/backport-19264
    • 143d45f Merge pull request #19269 from charris/backport-19228
    • d80e473 BUG: Removed typing for == and != in dtypes
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Question About Predefined Concept Module

    Question About Predefined Concept Module

    Hi, thanks for sharing this great work! I'm a little bit confusing about line 97 to line 101, why calculate hidden twice? What's the purpose of this part? Thanks!

    95  hidden = torch.t(stock_to_concept).mm(x_hidden)
    
    97  hidden = hidden[hidden.sum(1)!=0]
    98  stock_to_concept = x_hidden.mm(torch.t(hidden))
    99  # stock_to_concept = cal_cos_similarity(x_hidden, hidden)
    100 stock_to_concept = self.softmax_s2t(stock_to_concept)
    101 hidden = torch.t(stock_to_concept).mm(x_hidden)
    
    103 concept_to_stock = cal_cos_similarity(x_hidden, hidden) 
    
    opened by jionie 0
  • about alpha360 in your paper , Need help!

    about alpha360 in your paper , Need help!

    Dear athor,the data source from cndata(csi300) as you refered in paer. x is (290,360),290 is the number of node,360 is the alpha 360. I transform alpha360 (290,360) into (290,6,60) like this: src_seq = x.reshape(len(x), 6, -1) # [N, F, T] src_seq = src_seq.permute(0, 2, 1) # [N, T, F] why the day close0 column are zero?Not the closing price of the last 60 days? Why is it 0 the day(close0 ). image

    opened by 280777510 0
  • some questions,need help

    some questions,need help

    Dear authors,

    I am really interested about your paper, your idea is cool。but there are some question when I reading your paper .

    1、Are the 735 stocks in the data set due to the annual adjustment of CSI300 stocks?

    2、in the paper "For each stock on date 𝑡, Alpha360 looks back 60 days to construct a 360-dimensional historical stock data as a stock feature of this stock at date 𝑡. We use the features of stocks in CSI 100 and CSI 300 both from" . So the feature input in GRU-encorder is 360-dimensional historical stock data which looks back 60 days ?

    3、I'm Interested in your stock2concept process, can you briefly describe how it was obtained?

    I would appreciate it if you could reply as soon as possible. Thank you for your help,Best wish~

    opened by 280777510 0
  • HIST: Missing part of the code for generating stock2concept data

    HIST: Missing part of the code for generating stock2concept data

    Hello, In the HIST algorithm, part of the code is missing, for generating stock2concept data I.e., the code which generates examples/benchmarks/HIST/data/csi300_stock2concept.npy. Please add it to the repository.

    Thank you.

    opened by smarkovichgolan 0
  • Stuck when creating loader

    Stuck when creating loader

    When I was running "python learn.py --model_name MLP --data_set csi100 --hidden_size 512 --num_layers 3 --outdir ./output/csi100_MLP", it took several hours for "create loaders" but still remained unfinished. I found it stuck when executing "init_instance_by_config". Is there any solution for this? Thanks!

    opened by jingwenh 0
  • AttributeError: 'float' object has no attribute 'mean'

    AttributeError: 'float' object has no attribute 'mean'

    Hi. I have encountered an error when running the code. I wonder whether anyone else also have this kind of problems. Thanks.

    [16114:MainThread](2022-08-04 11:56:34,338) ERROR - qlib.workflow - [utils.py:41] - An exception has been raised[AttributeError: 'float' object has no attribute 'mean']. File "learn.py", line 458, in main(args) File "learn.py", line 349, in main name, ic.mean(), rank_ic.mean())) AttributeError: 'float' object has no attribute 'mean'

    opened by LarryLinyz 0
Owner
Wentao Xu
PhD Student in a Joint Program between MSRA and SYSU.
Wentao Xu
Code for paper ECCV 2020 paper: Who Left the Dogs Out? 3D Animal Reconstruction with Expectation Maximization in the Loop.

Who Left the Dogs Out? Evaluation and demo code for our ECCV 2020 paper: Who Left the Dogs Out? 3D Animal Reconstruction with Expectation Maximization

Benjamin Biggs 29 Dec 28, 2022
The project is an official implementation of our CVPR2019 paper "Deep High-Resolution Representation Learning for Human Pose Estimation"

Deep High-Resolution Representation Learning for Human Pose Estimation (CVPR 2019) News [2020/07/05] A very nice blog from Towards Data Science introd

Leo Xiao 3.9k Jan 5, 2023
Home repository for the Regularized Greedy Forest (RGF) library. It includes original implementation from the paper and multithreaded one written in C++, along with various language-specific wrappers.

Regularized Greedy Forest Regularized Greedy Forest (RGF) is a tree ensemble machine learning method described in this paper. RGF can deliver better r

RGF-team 364 Dec 28, 2022
Official implementation of AAAI-21 paper "Label Confusion Learning to Enhance Text Classification Models"

Description: This is the official implementation of our AAAI-21 accepted paper Label Confusion Learning to Enhance Text Classification Models. The str

null 101 Nov 25, 2022
Official PyTorch implementation for paper Context Matters: Graph-based Self-supervised Representation Learning for Medical Images

Context Matters: Graph-based Self-supervised Representation Learning for Medical Images Official PyTorch implementation for paper Context Matters: Gra

null 49 Nov 23, 2022
A PyTorch re-implementation of the paper 'Exploring Simple Siamese Representation Learning'. Reproduced the 67.8% Top1 Acc on ImageNet.

Exploring simple siamese representation learning This is a PyTorch re-implementation of the SimSiam paper on ImageNet dataset. The results match that

Taojiannan Yang 72 Nov 9, 2022
Implementation of the paper NAST: Non-Autoregressive Spatial-Temporal Transformer for Time Series Forecasting.

Non-AR Spatial-Temporal Transformer Introduction Implementation of the paper NAST: Non-Autoregressive Spatial-Temporal Transformer for Time Series For

Chen Kai 66 Nov 28, 2022
This is a Pytorch implementation of the paper: Self-Supervised Graph Transformer on Large-Scale Molecular Data.

This is a Pytorch implementation of the paper: Self-Supervised Graph Transformer on Large-Scale Molecular Data.

null 212 Dec 25, 2022
Official implementation of the ICLR 2021 paper

You Only Need Adversarial Supervision for Semantic Image Synthesis Official PyTorch implementation of the ICLR 2021 paper "You Only Need Adversarial S

Bosch Research 272 Dec 28, 2022
Implementation of Nyström Self-attention, from the paper Nyströmformer

Nyström Attention Implementation of Nyström Self-attention, from the paper Nyströmformer. Yannic Kilcher video Install $ pip install nystrom-attention

Phil Wang 95 Jan 2, 2023
Implementation of SETR model, Original paper: Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers.

SETR - Pytorch Since the original paper (Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers.) has no official

zhaohu xing 112 Dec 16, 2022
Official implementation of the paper Image Generators with Conditionally-Independent Pixel Synthesis https://arxiv.org/abs/2011.13775

CIPS -- Official Pytorch Implementation of the paper Image Generators with Conditionally-Independent Pixel Synthesis Requirements pip install -r requi

Multimodal Lab @ Samsung AI Center Moscow 201 Dec 21, 2022
Official pytorch implementation of paper "Image-to-image Translation via Hierarchical Style Disentanglement".

HiSD: Image-to-image Translation via Hierarchical Style Disentanglement Official pytorch implementation of paper "Image-to-image Translation

null 364 Dec 14, 2022
PyTorch implementation of paper "Neural Scene Flow Fields for Space-Time View Synthesis of Dynamic Scenes", CVPR 2021

Neural Scene Flow Fields PyTorch implementation of paper "Neural Scene Flow Fields for Space-Time View Synthesis of Dynamic Scenes", CVPR 20

Zhengqi Li 585 Jan 4, 2023
Implementation of Barlow Twins paper

barlowtwins PyTorch Implementation of Barlow Twins paper: Barlow Twins: Self-Supervised Learning via Redundancy Reduction This is currently a work in

IgorSusmelj 86 Dec 20, 2022
Official pytorch implementation of paper "Inception Convolution with Efficient Dilation Search" (CVPR 2021 Oral).

IC-Conv This repository is an official implementation of the paper Inception Convolution with Efficient Dilation Search. Getting Started Download Imag

Jie Liu 111 Dec 31, 2022
Official implementation of our paper "LLA: Loss-aware Label Assignment for Dense Pedestrian Detection" in Pytorch.

LLA: Loss-aware Label Assignment for Dense Pedestrian Detection This project provides an implementation for "LLA: Loss-aware Label Assignment for Dens

null 35 Dec 6, 2022
Functional TensorFlow Implementation of Singular Value Decomposition for paper Fast Graph Learning

tf-fsvd TensorFlow Implementation of Functional Singular Value Decomposition for paper Fast Graph Learning with Unique Optimal Solutions Cite If you f

Sami Abu-El-Haija 14 Nov 25, 2021
This project is the official implementation of our accepted ICLR 2021 paper BiPointNet: Binary Neural Network for Point Clouds.

BiPointNet: Binary Neural Network for Point Clouds Created by Haotong Qin, Zhongang Cai, Mingyuan Zhang, Yifu Ding, Haiyu Zhao, Shuai Yi, Xianglong Li

Haotong Qin 59 Dec 17, 2022