Skip to content

Commit

Permalink
V0.9.51 更新一批代码 (#198)
Browse files Browse the repository at this point in the history
* 0.9.51 start coding

* 0.9.51 show_sectional_ic 中新增累计IC绘制

* 0.9.51 update

* 0.9.51 update

* 0.9.51 update README.md

* 0.9.51 新增第二类买卖点信号函数

* 0.9.51 update

* 0.9.51 update

* 0.9.51 update

* 0.9.51 remove format kline

* 0.9.51 优化日收益绩效评估

* 0.9.51 fix test_daily_performance

* 0.9.51 update

* 0.9.51 update
  • Loading branch information
zengbin93 authored May 26, 2024
1 parent 0ad3899 commit 5488445
Show file tree
Hide file tree
Showing 16 changed files with 939 additions and 474 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/pythonpackage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ name: Python package

on:
push:
branches: [ master, V0.9.50 ]
branches: [ master, V0.9.51 ]
pull_request:
branches: [ master ]

Expand Down
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,11 @@
* 已经开始用czsc库进行量化研究的朋友,欢迎[加入飞书群](https://applink.feishu.cn/client/chat/chatter/add_by_link?link_token=0bak668e-7617-452c-b935-94d2c209e6cf),快点击加入吧!
* [B站视频教程合集(持续更新...)](https://space.bilibili.com/243682308/channel/series)
* [CZSC代码库QA](https://zbczsc.streamlit.app/)

> 最近在考虑使用 vue + rust + tauri 为 CZSC 开发一个桌面应用,欢迎有兴趣的朋友一起参与。
> 如果你碰巧熟悉 vue、tauri、rust 的使用,欢迎加入我们的开发组,一起为 CZSC 开发一个更好的桌面应用。
> 有意愿的朋友请联系我,微信号:**zengbin93**,备注:**桌面应用开发**
> 我们将为你提供一个更好的量化交易学习和交流平台。
## 知识星球

Expand Down
5 changes: 3 additions & 2 deletions czsc/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@
show_psi,
show_strategies_symbol,
show_strategies_dailys,
show_holds_backtest,
)

from czsc.utils.bi_info import (
Expand Down Expand Up @@ -176,10 +177,10 @@
)


__version__ = "0.9.50"
__version__ = "0.9.51"
__author__ = "zengbin93"
__email__ = "[email protected]"
__date__ = "20240504"
__date__ = "20240512"


def welcome():
Expand Down
57 changes: 16 additions & 41 deletions czsc/connectors/cooperation.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
create_dt: 2023/11/15 20:45
describe: CZSC开源协作团队内部使用数据接口
接口说明:https://s0cqcxuy3p.feishu.cn/wiki/F3HGw9vDPisWtSkJr1ac5DEcnNh
接口说明:https://s0cqcxuy3p.feishu.cn/wiki/StQbwOrWdiJPpikET9EcrRVEnrd
"""
import os
import czsc
Expand All @@ -22,45 +22,18 @@
dc = czsc.DataClient(token=os.getenv("CZSC_TOKEN"), url="http://zbczsc.com:9106", cache_path=cache_path)


def format_kline(kline: pd.DataFrame, freq: Freq):
"""格式化K线数据
def get_groups():
"""获取投研共享数据的分组信息
:param kline: K线数据,格式如下:
========== ========= ====== ======= ====== ===== =========== ===========
dt code open close high low vol amount
========== ========= ====== ======= ====== ===== =========== ===========
2022-01-04 600520.SH 20.54 21.12 21.17 20.33 2.1724e+06 1.94007e+07
2022-01-05 600520.SH 21.17 20.73 21.29 20.52 1.8835e+06 1.67258e+07
2022-01-06 600520.SH 20.56 21.17 21.57 18.69 3.4227e+06 3.11461e+07
2022-01-07 600520.SH 21.5 20.61 21.5 20.61 2.51741e+06 2.24819e+07
2022-01-10 600520.SH 20.4 21.69 21.69 20.4 4.80894e+06 4.39598e+07
========== ========= ====== ======= ====== ===== =========== ===========
:return: 格式化后的K线数据
:return: 分组信息
"""
bars = []
for i, row in kline.iterrows():
bar = RawBar(
symbol=row["code"],
id=i,
freq=freq,
dt=row["dt"],
open=row["open"],
close=row["close"],
high=row["high"],
low=row["low"],
vol=row["vol"],
amount=row["amount"],
)
bars.append(bar)
return bars
return ["A股指数", "ETF", "股票", "期货主力", "南华指数"]


def get_symbols(name, **kwargs):
"""获取指定分组下的所有标的代码
:param name: 分组名称,可选值:'A股指数', 'ETF', '股票', '期货主力'
:param name: 分组名称,可选值:'A股指数', 'ETF', '股票', '期货主力', '南华指数'
:param kwargs:
:return:
"""
Expand Down Expand Up @@ -111,6 +84,9 @@ def get_min_future_klines(code, sdt, edt, freq="1m", **kwargs):

rows = []
for sdt_, edt_ in tqdm(zip(dates[:-1], dates[1:]), total=len(dates) - 1):
if edt_ < sdt:
continue

if pd.to_datetime(sdt_).date() >= datetime.now().date():
break

Expand All @@ -137,6 +113,8 @@ def get_min_future_klines(code, sdt, edt, freq="1m", **kwargs):
c2 = (df["dt"].dt.time >= dt3.time()) & (df["dt"].dt.time <= dt4.time())

df = df[c1 | c2].copy().reset_index(drop=True)

df = df[(df["dt"] >= pd.to_datetime(sdt)) & (df["dt"] <= pd.to_datetime(edt))].copy().reset_index(drop=True)
return df


Expand Down Expand Up @@ -228,6 +206,8 @@ def stocks_daily_klines(sdt="20170101", edt="20240101", **kwargs):
for year in years:
ttl = 3600 * 6 if year == str(datetime.now().year) else -1
kline = dc.pro_bar(trade_year=year, adj=adj, v=2, ttl=ttl)
kline["price"] = kline["open"].shift(-1)
kline["price"] = kline["price"].fillna(kline["close"])
res.append(kline)

dfk = pd.concat(res, ignore_index=True)
Expand All @@ -236,13 +216,8 @@ def stocks_daily_klines(sdt="20170101", edt="20240101", **kwargs):
if kwargs.get("exclude_bj", True):
dfk = dfk[~dfk["code"].str.endswith(".BJ")].reset_index(drop=True)

nxb = kwargs.get("nxb", [1, 2, 5])
if nxb:
rows = []
for _, dfg in tqdm(dfk.groupby("code"), desc="计算NXB收益率", ncols=80, colour="green"):
czsc.update_nbars(dfg, numbers=nxb, move=1, price_col="open")
rows.append(dfg)
dfk = pd.concat(rows, ignore_index=True)

dfk = dfk.rename(columns={"code": "symbol"})
nxb = kwargs.get("nxb", [1, 2, 5, 10, 20, 30, 60])
if nxb:
dfk = czsc.update_nxb(dfk, nseq=nxb)
return dfk
34 changes: 22 additions & 12 deletions czsc/connectors/research.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,20 @@
import pandas as pd

# 投研共享数据的本地缓存路径,需要根据实际情况修改
cache_path = os.environ.get('czsc_research_cache', r"D:\CZSC投研数据")
cache_path = os.environ.get("czsc_research_cache", r"D:\CZSC投研数据")
if not os.path.exists(cache_path):
raise ValueError(f"请设置环境变量 czsc_research_cache 为投研共享数据的本地缓存路径,当前路径不存在:{cache_path}\n\n"
f"投研数据共享说明(含下载地址):https://s0cqcxuy3p.feishu.cn/wiki/wikcnzuPawXtBB7Cj7mqlYZxpDh")
raise ValueError(
f"请设置环境变量 czsc_research_cache 为投研共享数据的本地缓存路径,当前路径不存在:{cache_path}\n\n"
f"投研数据共享说明(含下载地址):https://s0cqcxuy3p.feishu.cn/wiki/wikcnzuPawXtBB7Cj7mqlYZxpDh"
)


def get_groups():
"""获取投研共享数据的分组信息
:return: 分组信息
"""
return ["A股主要指数", "A股场内基金", "中证500成分股", "期货主力"]


def get_symbols(name, **kwargs):
Expand All @@ -26,14 +36,14 @@ def get_symbols(name, **kwargs):
:param kwargs:
:return:
"""
if name.upper() == 'ALL':
if name.upper() == "ALL":
files = glob.glob(os.path.join(cache_path, "*", "*.parquet"))
else:
files = glob.glob(os.path.join(cache_path, name, "*.parquet"))
return [os.path.basename(x).replace('.parquet', '') for x in files]
return [os.path.basename(x).replace(".parquet", "") for x in files]


def get_raw_bars(symbol, freq, sdt, edt, fq='前复权', **kwargs):
def get_raw_bars(symbol, freq, sdt, edt, fq="前复权", **kwargs):
"""获取 CZSC 库定义的标准 RawBar 对象列表
:param symbol: 标的代码
Expand All @@ -45,15 +55,15 @@ def get_raw_bars(symbol, freq, sdt, edt, fq='前复权', **kwargs):
:param kwargs:
:return:
"""
raw_bars = kwargs.get('raw_bars', True)
kwargs['fq'] = fq
raw_bars = kwargs.get("raw_bars", True)
kwargs["fq"] = fq
file = glob.glob(os.path.join(cache_path, "*", f"{symbol}.parquet"))[0]
freq = czsc.Freq(freq)
kline = pd.read_parquet(file)
if 'dt' not in kline.columns:
kline['dt'] = pd.to_datetime(kline['datetime'])
kline = kline[(kline['dt'] >= pd.to_datetime(sdt)) & (kline['dt'] <= pd.to_datetime(edt))]
if "dt" not in kline.columns:
kline["dt"] = pd.to_datetime(kline["datetime"])
kline = kline[(kline["dt"] >= pd.to_datetime(sdt)) & (kline["dt"] <= pd.to_datetime(edt))]
if kline.empty:
return []
_bars = czsc.resample_bars(kline, freq, raw_bars=raw_bars, base_freq='1分钟')
_bars = czsc.resample_bars(kline, freq, raw_bars=raw_bars, base_freq="1分钟")
return _bars
Loading

0 comments on commit 5488445

Please sign in to comment.