mirror of
https://github.com/microsoft/qlib.git
synced 2026-07-14 00:06:58 +08:00
Compare commits
26 Commits
fix_docs
...
download_o
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
304f586f45 | ||
|
|
467b352553 | ||
|
|
e85580600c | ||
|
|
fd0863b0bb | ||
|
|
0c14952136 | ||
|
|
e979590083 | ||
|
|
4023277874 | ||
|
|
f206f0a6da | ||
|
|
cac66e9c9d | ||
|
|
cb0712a953 | ||
|
|
1dc5e7308d | ||
|
|
240cdff0f3 | ||
|
|
25a6ff0812 | ||
|
|
f568c2f126 | ||
|
|
1f390feafd | ||
|
|
f095792231 | ||
|
|
835ef12c20 | ||
|
|
77b6fcb92a | ||
|
|
66fad0a92e | ||
|
|
5af52c2472 | ||
|
|
3f41787dea | ||
|
|
e71ee221f9 | ||
|
|
9f1808378d | ||
|
|
8cf7bb3aaf | ||
|
|
6ea921bd84 | ||
|
|
fbe5695eda |
8
.github/workflows/python-publish.yml
vendored
8
.github/workflows/python-publish.yml
vendored
@@ -51,8 +51,8 @@ jobs:
|
|||||||
python setup.py bdist_wheel
|
python setup.py bdist_wheel
|
||||||
- name: Build and publish
|
- name: Build and publish
|
||||||
env:
|
env:
|
||||||
TWINE_USERNAME: __token__
|
TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
|
||||||
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
|
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
|
||||||
run: |
|
run: |
|
||||||
twine upload dist/*
|
twine upload dist/*
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ jobs:
|
|||||||
pip install twine
|
pip install twine
|
||||||
- name: Build and publish
|
- name: Build and publish
|
||||||
env:
|
env:
|
||||||
TWINE_USERNAME: __token__
|
TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
|
||||||
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
|
TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
|
||||||
run: |
|
run: |
|
||||||
twine upload dist/pyqlib-*-manylinux*.whl
|
twine upload dist/pyqlib-*-manylinux*.whl
|
||||||
|
|||||||
6
.github/workflows/release-drafter.yml
vendored
6
.github/workflows/release-drafter.yml
vendored
@@ -6,14 +6,8 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
update_release_draft:
|
update_release_draft:
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: read
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
# Drafts your next Release notes as Pull Requests are merged into "master"
|
# Drafts your next Release notes as Pull Requests are merged into "master"
|
||||||
|
|||||||
5
.github/workflows/test_qlib_from_pip.yml
vendored
5
.github/workflows/test_qlib_from_pip.yml
vendored
@@ -13,10 +13,7 @@ jobs:
|
|||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
# Since macos-latest changed from 12.7.4 to 14.4.1,
|
os: [windows-latest, ubuntu-20.04, ubuntu-22.04, macos-11, macos-latest]
|
||||||
# the minimum python version that matches a 14.4.1 version of macos is 3.10,
|
|
||||||
# so we limit the macos version to macos-12.
|
|
||||||
os: [windows-latest, ubuntu-20.04, ubuntu-22.04, macos-11, macos-12]
|
|
||||||
# not supporting 3.6 due to annotations is not supported https://stackoverflow.com/a/52890129
|
# not supporting 3.6 due to annotations is not supported https://stackoverflow.com/a/52890129
|
||||||
python-version: [3.7, 3.8]
|
python-version: [3.7, 3.8]
|
||||||
|
|
||||||
|
|||||||
5
.github/workflows/test_qlib_from_source.yml
vendored
5
.github/workflows/test_qlib_from_source.yml
vendored
@@ -14,10 +14,7 @@ jobs:
|
|||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
# Since macos-latest changed from 12.7.4 to 14.4.1,
|
os: [windows-latest, ubuntu-20.04, ubuntu-22.04, macos-11, macos-latest]
|
||||||
# the minimum python version that matches a 14.4.1 version of macos is 3.10,
|
|
||||||
# so we limit the macos version to macos-12.
|
|
||||||
os: [windows-latest, ubuntu-20.04, ubuntu-22.04, macos-11, macos-12]
|
|
||||||
# not supporting 3.6 due to annotations is not supported https://stackoverflow.com/a/52890129
|
# not supporting 3.6 due to annotations is not supported https://stackoverflow.com/a/52890129
|
||||||
python-version: [3.7, 3.8]
|
python-version: [3.7, 3.8]
|
||||||
|
|
||||||
|
|||||||
@@ -14,10 +14,7 @@ jobs:
|
|||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
# Since macos-latest changed from 12.7.4 to 14.4.1,
|
os: [windows-latest, ubuntu-20.04, ubuntu-22.04, macos-11, macos-latest]
|
||||||
# the minimum python version that matches a 14.4.1 version of macos is 3.10,
|
|
||||||
# so we limit the macos version to macos-12.
|
|
||||||
os: [windows-latest, ubuntu-20.04, ubuntu-22.04, macos-11, macos-12]
|
|
||||||
# not supporting 3.6 due to annotations is not supported https://stackoverflow.com/a/52890129
|
# not supporting 3.6 due to annotations is not supported https://stackoverflow.com/a/52890129
|
||||||
python-version: [3.7, 3.8]
|
python-version: [3.7, 3.8]
|
||||||
|
|
||||||
|
|||||||
@@ -5,12 +5,6 @@
|
|||||||
# Required
|
# Required
|
||||||
version: 2
|
version: 2
|
||||||
|
|
||||||
# Set the version of Python and other tools you might need
|
|
||||||
build:
|
|
||||||
os: ubuntu-22.04
|
|
||||||
tools:
|
|
||||||
python: "3.7"
|
|
||||||
|
|
||||||
# Build documentation in the docs/ directory with Sphinx
|
# Build documentation in the docs/ directory with Sphinx
|
||||||
sphinx:
|
sphinx:
|
||||||
configuration: docs/conf.py
|
configuration: docs/conf.py
|
||||||
@@ -20,6 +14,7 @@ formats: all
|
|||||||
|
|
||||||
# Optionally set the version of Python and requirements required to build your docs
|
# Optionally set the version of Python and requirements required to build your docs
|
||||||
python:
|
python:
|
||||||
|
version: 3.7
|
||||||
install:
|
install:
|
||||||
- requirements: docs/requirements.txt
|
- requirements: docs/requirements.txt
|
||||||
- method: pip
|
- method: pip
|
||||||
@@ -172,8 +172,6 @@ Also, users can install the latest dev version ``Qlib`` by the source code accor
|
|||||||
|
|
||||||
**Tips**: If you fail to install `Qlib` or run the examples in your environment, comparing your steps and the [CI workflow](.github/workflows/test_qlib_from_source.yml) may help you find the problem.
|
**Tips**: If you fail to install `Qlib` or run the examples in your environment, comparing your steps and the [CI workflow](.github/workflows/test_qlib_from_source.yml) may help you find the problem.
|
||||||
|
|
||||||
**Tips for Mac**: If you are using Mac with M1, you might encounter issues in building the wheel for LightGBM, which is due to missing dependencies from OpenMP. To solve the problem, install openmp first with ``brew install libomp`` and then run ``pip install .`` to build it successfully.
|
|
||||||
|
|
||||||
## Data Preparation
|
## Data Preparation
|
||||||
Load and prepare data by running the following code:
|
Load and prepare data by running the following code:
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
# Licensed under the MIT License.
|
# Licensed under the MIT License.
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
__version__ = "0.9.4.99"
|
__version__ = "0.9.3.99"
|
||||||
__version__bak = __version__ # This version is backup for QlibConfig.reset_qlib_version
|
__version__bak = __version__ # This version is backup for QlibConfig.reset_qlib_version
|
||||||
import os
|
import os
|
||||||
from typing import Union
|
from typing import Union
|
||||||
|
|||||||
@@ -25,12 +25,7 @@ import pandas as pd
|
|||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import List, Union, Optional, Callable
|
from typing import List, Union, Optional, Callable
|
||||||
from packaging import version
|
from packaging import version
|
||||||
from .file import (
|
from .file import get_or_create_path, save_multiple_parts_file, unpack_archive_with_buffer, get_tmp_file_with_buffer
|
||||||
get_or_create_path,
|
|
||||||
save_multiple_parts_file,
|
|
||||||
unpack_archive_with_buffer,
|
|
||||||
get_tmp_file_with_buffer,
|
|
||||||
)
|
|
||||||
from ..config import C
|
from ..config import C
|
||||||
from ..log import get_module_logger, set_log_with_config
|
from ..log import get_module_logger, set_log_with_config
|
||||||
|
|
||||||
@@ -42,12 +37,7 @@ is_deprecated_lexsorted_pandas = version.parse(pd.__version__) > version.parse("
|
|||||||
#################### Server ####################
|
#################### Server ####################
|
||||||
def get_redis_connection():
|
def get_redis_connection():
|
||||||
"""get redis connection instance."""
|
"""get redis connection instance."""
|
||||||
return redis.StrictRedis(
|
return redis.StrictRedis(host=C.redis_host, port=C.redis_port, db=C.redis_task_db, password=C.redis_password)
|
||||||
host=C.redis_host,
|
|
||||||
port=C.redis_port,
|
|
||||||
db=C.redis_task_db,
|
|
||||||
password=C.redis_password,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
#################### Data ####################
|
#################### Data ####################
|
||||||
@@ -106,14 +96,7 @@ def get_period_offset(first_year, period, quarterly):
|
|||||||
return offset
|
return offset
|
||||||
|
|
||||||
|
|
||||||
def read_period_data(
|
def read_period_data(index_path, data_path, period, cur_date_int: int, quarterly, last_period_index: int = None):
|
||||||
index_path,
|
|
||||||
data_path,
|
|
||||||
period,
|
|
||||||
cur_date_int: int,
|
|
||||||
quarterly,
|
|
||||||
last_period_index: int = None,
|
|
||||||
):
|
|
||||||
"""
|
"""
|
||||||
At `cur_date`(e.g. 20190102), read the information at `period`(e.g. 201803).
|
At `cur_date`(e.g. 20190102), read the information at `period`(e.g. 201803).
|
||||||
Only the updating info before cur_date or at cur_date will be used.
|
Only the updating info before cur_date or at cur_date will be used.
|
||||||
@@ -290,10 +273,7 @@ def parse_field(field):
|
|||||||
# \uff09 -> )
|
# \uff09 -> )
|
||||||
chinese_punctuation_regex = r"\u3001\uff1a\uff08\uff09"
|
chinese_punctuation_regex = r"\u3001\uff1a\uff08\uff09"
|
||||||
for pattern, new in [
|
for pattern, new in [
|
||||||
(
|
(rf"\$\$([\w{chinese_punctuation_regex}]+)", r'PFeature("\1")'), # $$ must be before $
|
||||||
rf"\$\$([\w{chinese_punctuation_regex}]+)",
|
|
||||||
r'PFeature("\1")',
|
|
||||||
), # $$ must be before $
|
|
||||||
(rf"\$([\w{chinese_punctuation_regex}]+)", r'Feature("\1")'),
|
(rf"\$([\w{chinese_punctuation_regex}]+)", r'Feature("\1")'),
|
||||||
(r"(\w+\s*)\(", r"Operators.\1("),
|
(r"(\w+\s*)\(", r"Operators.\1("),
|
||||||
]: # Features # Operators
|
]: # Features # Operators
|
||||||
@@ -403,14 +383,7 @@ def get_date_range(trading_date, left_shift=0, right_shift=0, future=False):
|
|||||||
return calendar
|
return calendar
|
||||||
|
|
||||||
|
|
||||||
def get_date_by_shift(
|
def get_date_by_shift(trading_date, shift, future=False, clip_shift=True, freq="day", align: Optional[str] = None):
|
||||||
trading_date,
|
|
||||||
shift,
|
|
||||||
future=False,
|
|
||||||
clip_shift=True,
|
|
||||||
freq="day",
|
|
||||||
align: Optional[str] = None,
|
|
||||||
):
|
|
||||||
"""get trading date with shift bias will cur_date
|
"""get trading date with shift bias will cur_date
|
||||||
e.g. : shift == 1, return next trading date
|
e.g. : shift == 1, return next trading date
|
||||||
shift == -1, return previous trading date
|
shift == -1, return previous trading date
|
||||||
@@ -596,38 +569,7 @@ def exists_qlib_data(qlib_dir):
|
|||||||
# check instruments
|
# check instruments
|
||||||
code_names = set(map(lambda x: fname_to_code(x.name.lower()), features_dir.iterdir()))
|
code_names = set(map(lambda x: fname_to_code(x.name.lower()), features_dir.iterdir()))
|
||||||
_instrument = instruments_dir.joinpath("all.txt")
|
_instrument = instruments_dir.joinpath("all.txt")
|
||||||
# Removed two possible ticker names "NA" and "NULL" from the default na_values list for column 0
|
miss_code = set(pd.read_csv(_instrument, sep="\t", header=None).loc[:, 0].apply(str.lower)) - set(code_names)
|
||||||
miss_code = set(
|
|
||||||
pd.read_csv(
|
|
||||||
_instrument,
|
|
||||||
sep="\t",
|
|
||||||
header=None,
|
|
||||||
keep_default_na=False,
|
|
||||||
na_values={
|
|
||||||
0: [
|
|
||||||
" ",
|
|
||||||
"#N/A",
|
|
||||||
"#N/A N/A",
|
|
||||||
"#NA",
|
|
||||||
"-1.#IND",
|
|
||||||
"-1.#QNAN",
|
|
||||||
"-NaN",
|
|
||||||
"-nan",
|
|
||||||
"1.#IND",
|
|
||||||
"1.#QNAN",
|
|
||||||
"<NA>",
|
|
||||||
"N/A",
|
|
||||||
"NaN",
|
|
||||||
"None",
|
|
||||||
"n/a",
|
|
||||||
"nan",
|
|
||||||
"null ",
|
|
||||||
]
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.loc[:, 0]
|
|
||||||
.apply(str.lower)
|
|
||||||
) - set(code_names)
|
|
||||||
if miss_code and any(map(lambda x: "sht" not in x, miss_code)):
|
if miss_code and any(map(lambda x: "sht" not in x, miss_code)):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|||||||
@@ -396,7 +396,14 @@ class CSI500Index(CSIIndex):
|
|||||||
today = pd.Timestamp.now()
|
today = pd.Timestamp.now()
|
||||||
date_range = pd.DataFrame(pd.date_range(start="2007-01-15", end=today, freq="7D"))[0].dt.date
|
date_range = pd.DataFrame(pd.date_range(start="2007-01-15", end=today, freq="7D"))[0].dt.date
|
||||||
ret_list = []
|
ret_list = []
|
||||||
|
col = ["date", "symbol", "code_name"]
|
||||||
for date in tqdm(date_range, desc="Download CSI500"):
|
for date in tqdm(date_range, desc="Download CSI500"):
|
||||||
|
rs = bs.query_zz500_stocks(date=str(date))
|
||||||
|
zz500_stocks = []
|
||||||
|
while (rs.error_code == "0") & rs.next():
|
||||||
|
zz500_stocks.append(rs.get_row_data())
|
||||||
|
result = pd.DataFrame(zz500_stocks, columns=col)
|
||||||
|
result["symbol"] = result["symbol"].apply(lambda x: x.replace(".", "").upper())
|
||||||
result = self.get_data_from_baostock(date)
|
result = self.get_data_from_baostock(date)
|
||||||
ret_list.append(result[["date", "symbol"]])
|
ret_list.append(result[["date", "symbol"]])
|
||||||
bs.logout()
|
bs.logout()
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
"""
|
"""
|
||||||
TODO:
|
TODO:
|
||||||
- A more well-designed PIT database is required.
|
- A more well-designed PIT database is required.
|
||||||
- separated insert, delete, update, query operations are required.
|
- seperated insert, delete, update, query operations are required.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import shutil
|
import shutil
|
||||||
|
|||||||
Reference in New Issue
Block a user