From 6e41c31b43c9237f8b117ca979da30b9454f84d4 Mon Sep 17 00:00:00 2001 From: zengbin93 Date: Tue, 10 Oct 2023 22:39:40 +0800 Subject: [PATCH] 0.9.31 update --- czsc/utils/bar_generator.py | 7 +++++-- examples/develop/index_composition.py | 24 +++++++++++++++------- examples/test_offline/test_resample_bar.py | 8 +++++--- test/test_bar_generator.py | 4 +--- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/czsc/utils/bar_generator.py b/czsc/utils/bar_generator.py index d3fc261a1..6fb468c42 100644 --- a/czsc/utils/bar_generator.py +++ b/czsc/utils/bar_generator.py @@ -53,6 +53,9 @@ def check_freq_and_market(time_seq: List[AnyStr], freq: Optional[AnyStr] = None) if freq in ['日线', '周线', '月线', '季线', '年线']: return freq, "默认" + if freq == '1分钟': + time_seq.extend(['14:57', '14:58', '14:59', '15:00']) + time_seq = sorted(list(set(time_seq))) assert len(time_seq) >= 2, "time_seq长度必须大于等于2" @@ -127,8 +130,8 @@ def freq_end_time(dt: datetime, freq: Union[Freq, AnyStr], market="A股") -> dat edt = dt.replace(hour=int(h), minute=int(m)) return edt - if not ("15:00" > hm > "09:00") and market == "期货": - dt = next_trading_date(dt, n=1) + # if not ("15:00" > hm > "09:00") and market == "期货": + # dt = next_trading_date(dt, n=1) return freq_end_date(dt.date(), freq) diff --git a/examples/develop/index_composition.py b/examples/develop/index_composition.py index 19b453bb3..21b5e1bd9 100644 --- a/examples/develop/index_composition.py +++ b/examples/develop/index_composition.py @@ -57,13 +57,15 @@ def index_composition_by_base_point(klines, weights=None, base_point=1000): """ klines["dt"] = pd.to_datetime(klines["dt"]) - data = [] - for _, kline in klines.groupby("symbol"): - kline = kline.sort_values("dt", ascending=True).reset_index(drop=True) - kline["returns"] = kline["close"].pct_change() - kline["returns"] = kline["returns"].fillna(0) - data.append(kline) - klines = pd.concat(data, ignore_index=True) + if 'returns' not in klines.columns.tolist(): + data = [] + for _, kline in klines.groupby("symbol"): + kline = kline.sort_values("dt", ascending=True).reset_index(drop=True) + kline["returns"] = kline["close"].pct_change() + kline["returns"] = kline["returns"].fillna(0) + data.append(kline) + klines = pd.concat(data, ignore_index=True) + returns = klines.pivot_table(index="dt", columns="symbol", values="returns") if weights is None: @@ -93,6 +95,8 @@ def test_index_composition_by_base_point(): for symbol in symbols: bars = get_raw_bars(symbol=symbol, freq="1分钟", sdt="20210104 09:31", edt="20210107 13:10") df = pd.DataFrame(bars) + df['returns'] = df['close'].pct_change() + df = df.dropna(subset=['returns']) df.drop(columns=["freq", "cache", 'id'], inplace=True) data.append(df) klines = pd.concat(data, ignore_index=True) @@ -106,6 +110,12 @@ def test_index_composition_by_base_point(): index2 = index_composition_by_base_point(klines=klines.copy(), weights=weights) assert int(index2['vol'].iloc[-1]) == 200930300 + weights = pd.DataFrame({"dt": ['2020-01-03 10:10:00', '2021-01-04 10:54:00', '2021-01-05 12:10:00']}) + for symbol in symbols: + weights[symbol] = [random.uniform(0.1, 0.3) for _ in range(3)] + index2 = index_composition_by_base_point(klines=klines.copy(), weights=weights) + assert int(index2['vol'].iloc[-1]) == 200930300 + try: weights = pd.DataFrame({"dt": ['2021-01-04 10:10:00', '2021-01-04 10:54:00', '2021-01-05 12:10:00']}) for symbol in symbols: diff --git a/examples/test_offline/test_resample_bar.py b/examples/test_offline/test_resample_bar.py index 077642882..31f2d158e 100644 --- a/examples/test_offline/test_resample_bar.py +++ b/examples/test_offline/test_resample_bar.py @@ -13,14 +13,16 @@ def test_read(): def test_check_freq_and_market(): from czsc.utils.bar_generator import check_freq_and_market - gruop_name = "期货主力" - # gruop_name = "中证500成分股" + # gruop_name = "期货主力" + gruop_name = "中证500成分股" files = Path(fr"D:\CZSC投研数据\{gruop_name}").glob("*.parquet") for file in files: df = pd.read_parquet(file) time_seq = sorted(list({x.strftime("%H:%M") for x in df['dt']})) - x_freq, market = check_freq_and_market(time_seq=time_seq) + x_freq, market = check_freq_and_market(time_seq=time_seq, freq='1分钟') print(file.stem, x_freq, market) + if market == "默认": + print(time_seq) def get_future_times(): diff --git a/test/test_bar_generator.py b/test/test_bar_generator.py index 2d38373c5..270e55563 100644 --- a/test/test_bar_generator.py +++ b/test/test_bar_generator.py @@ -15,8 +15,6 @@ def test_check_freq_and_market(): assert check_freq_and_market(time_seq) == ('120分钟', '期货') time_seq = [ - '09:25', - '09:30', '09:31', '09:32', '09:33', @@ -257,7 +255,7 @@ def test_check_freq_and_market(): '14:58', '15:00', ] - assert check_freq_and_market(time_seq) == ('1分钟', 'A股') + assert check_freq_and_market(time_seq, freq='1分钟') == ('1分钟', 'A股') for key, values in freq_market_times.items(): assert check_freq_and_market(values) == (key.split("_")[0], key.split("_")[1])