def test_cobra_backtest(): bars = read_1min() signals = bt.generate_signals(bars, len(bars) - 10000, bt.get_default_signals) long_open_event = Event( name="开多", operate=Operate.LO, factors=[ Factor(name="5分钟三买", signals_all=[Signal("5分钟_倒1笔_类买卖点_类三买_任意_任意_0")]), ]) long_exit_event = Event( name="平多", operate=Operate.LE, factors=[ Factor(name="1分钟一卖", signals_all=[Signal("1分钟_倒1笔_类买卖点_类一卖_任意_任意_0")]), Factor(name="5分钟一卖", signals_all=[Signal("5分钟_倒1笔_类买卖点_类一卖_任意_任意_0")]), Factor(name="5分钟二卖", signals_all=[Signal("5分钟_倒1笔_类买卖点_类二卖_任意_任意_0")]), Factor(name="5分钟三卖", signals_all=[Signal("5分钟_倒1笔_类买卖点_类三卖_任意_任意_0")]) ]) pairs, pf = bt.long_trade_simulator(signals, long_open_event, long_exit_event, T0=True, verbose=True) assert len(pairs) == 65 assert pf['累计收益(%)'] > pf['基准收益(%)'] event = Event(name="多头过滤", operate=Operate.LO, factors=[ Factor(name="多头过滤", signals_all=[ Signal("30分钟_倒1K_DIF多空_多头_任意_任意_0"), ]), ]) pairs, pf = bt.one_event_estimator(signals, event) assert len(pairs) == 8 assert pf['累计收益(%)'] > pf['基准收益(%)']
def run_advanced_trader(T0=True): bars = read_1min() kg = BarGenerator(base_freq='1分钟', freqs=['5分钟', '15分钟', '30分钟', '60分钟', '日线'], max_count=3000) for row in tqdm(bars[:150000], desc='init kg'): kg.update(row) long_events = [ Event(name="开多", operate=Operate.LO, factors=[ Factor(name="5分钟一买", signals_all=[Signal("5分钟_倒1笔_类买卖点_类一买_任意_任意_0")]), Factor(name="1分钟一买", signals_all=[Signal("1分钟_倒1笔_类买卖点_类一买_任意_任意_0")]), ]), Event(name="加多1", operate=Operate.LA1, factors=[ Factor(name="5分钟二买", signals_all=[Signal("5分钟_倒1笔_类买卖点_类二买_任意_任意_0")]), Factor(name="1分钟二买", signals_all=[Signal("1分钟_倒1笔_类买卖点_类二买_任意_任意_0")]), ]), Event(name="加多2", operate=Operate.LA1, factors=[ Factor(name="5分钟三买", signals_all=[Signal("5分钟_倒1笔_类买卖点_类三买_任意_任意_0")]), Factor(name="1分钟三买", signals_all=[Signal("1分钟_倒1笔_类买卖点_类三买_任意_任意_0")]), ]), Event(name="平多", operate=Operate.LE, factors=[ Factor(name="5分钟二卖", signals_all=[Signal("5分钟_倒1笔_类买卖点_类二卖_任意_任意_0")]), Factor(name="5分钟三卖", signals_all=[Signal("5分钟_倒1笔_类买卖点_类三卖_任意_任意_0")]) ]), ] long_pos = PositionLong(symbol='000001.SH', hold_long_a=0.5, hold_long_b=0.8, hold_long_c=1, T0=T0) short_events = [ Event(name="开空", operate=Operate.SO, factors=[ Factor(name="5分钟一买", signals_all=[Signal("5分钟_倒1笔_类买卖点_类一买_任意_任意_0")]), Factor(name="1分钟一买", signals_all=[Signal("1分钟_倒1笔_类买卖点_类一买_任意_任意_0")]), ]), Event(name="加空1", operate=Operate.SA1, factors=[ Factor(name="5分钟二买", signals_all=[Signal("5分钟_倒1笔_类买卖点_类二买_任意_任意_0")]), Factor(name="1分钟二买", signals_all=[Signal("1分钟_倒1笔_类买卖点_类二买_任意_任意_0")]), ]), Event(name="加空2", operate=Operate.SA1, factors=[ Factor(name="5分钟三买", signals_all=[Signal("5分钟_倒1笔_类买卖点_类三买_任意_任意_0")]), Factor(name="1分钟三买", signals_all=[Signal("1分钟_倒1笔_类买卖点_类三买_任意_任意_0")]), ]), Event(name="平空", operate=Operate.SE, factors=[ Factor(name="5分钟二卖", signals_all=[Signal("5分钟_倒1笔_类买卖点_类二卖_任意_任意_0")]), Factor(name="5分钟三卖", signals_all=[Signal("5分钟_倒1笔_类买卖点_类三卖_任意_任意_0")]) ]), ] short_pos = PositionShort(symbol='000001.SH', hold_short_a=0.5, hold_short_b=0.8, hold_short_c=1, T0=T0) ct = CzscAdvancedTrader( bg=kg, get_signals=get_default_signals, long_events=long_events, long_pos=long_pos, short_events=short_events, short_pos=short_pos, ) assert len(ct.s) == 28 for row in tqdm(bars[150000:], desc="trade"): ct.update(row) # if long_pos.pos_changed: # print(" : long op : ", long_pos.operates[-1]) # if short_pos.pos_changed: # print(" : short op : ", short_pos.operates[-1]) if ct.long_pos.pos > 0: assert ct.long_pos.long_high > 0 assert ct.long_pos.long_cost > 0 assert ct.long_pos.long_bid > 0 if ct.short_pos.pos > 0: assert ct.short_pos.short_low > 0 assert ct.short_pos.short_cost > 0 assert ct.short_pos.short_bid > 0 long_yk = pd.DataFrame(ct.long_pos.pairs)['盈亏比例'].sum() short_yk = pd.DataFrame(ct.short_pos.pairs)['盈亏比例'].sum() assert abs(long_yk) == abs(short_yk) print(f"\nT0={T0}: 多头累计盈亏比例:{long_yk};空头累计盈亏比例:{short_yk}") if not T0: assert ct.s['多头_最大_盈利'] == '超过800BP_任意_任意_0' assert ct.s['多头_累计_盈亏'] == '盈利_超过800BP_任意_0' assert ct.s['空头_最大_回撤'] == '超过800BP_任意_任意_0' assert ct.s['空头_累计_盈亏'] == '亏损_超过800BP_任意_0'
# coding: utf-8 import os import pandas as pd from tqdm import tqdm from czsc.objects import RawBar, Freq from czsc.utils.bar_generator import BarGenerator, freq_end_time from test.test_analyze import read_1min cur_path = os.path.split(os.path.realpath(__file__))[0] kline = read_1min() def test_freq_end_time(): assert freq_end_time(pd.to_datetime("2021-11-11 09:43"), Freq.F1) == pd.to_datetime("2021-11-11 09:43") assert freq_end_time(pd.to_datetime("2021-11-11 09:43"), Freq.F5) == pd.to_datetime("2021-11-11 09:45") assert freq_end_time(pd.to_datetime("2021-11-11 09:43"), Freq.F15) == pd.to_datetime("2021-11-11 09:45") assert freq_end_time(pd.to_datetime("2021-11-11 09:45"), Freq.F15) == pd.to_datetime("2021-11-11 09:45") assert freq_end_time(pd.to_datetime("2021-11-11 14:56"), Freq.F15) == pd.to_datetime("2021-11-11 15:00") assert freq_end_time(pd.to_datetime("2021-11-11 09:43"), Freq.F30) == pd.to_datetime("2021-11-11 10:00") assert freq_end_time(pd.to_datetime("2021-11-11 09:43"), Freq.F60) == pd.to_datetime("2021-11-11 10:30") assert freq_end_time(pd.to_datetime("2021-11-11 09:43"),
def test_advanced_trader_with_t0(): bars = read_1min() kg = KlineGenerator(max_count=3000, freqs=['1分钟', '5分钟', '15分钟', '30分钟', '60分钟', '日线']) for row in tqdm(bars[:150000], desc='init kg'): kg.update(row) events = [ Event(name="开多", operate=Operate.LO, factors=[ Factor(name="5分钟一买", signals_all=[Signal("5分钟_倒1笔_类买卖点_类一买_任意_任意_0")]), Factor(name="1分钟一买", signals_all=[Signal("1分钟_倒1笔_类买卖点_类一买_任意_任意_0")]), ]), Event(name="加多1", operate=Operate.LA1, factors=[ Factor(name="5分钟二买", signals_all=[Signal("5分钟_倒1笔_类买卖点_类二买_任意_任意_0")]), Factor(name="1分钟二买", signals_all=[Signal("1分钟_倒1笔_类买卖点_类二买_任意_任意_0")]), ]), Event(name="加多2", operate=Operate.LA1, factors=[ Factor(name="5分钟三买", signals_all=[Signal("5分钟_倒1笔_类买卖点_类三买_任意_任意_0")]), Factor(name="1分钟三买", signals_all=[Signal("1分钟_倒1笔_类买卖点_类三买_任意_任意_0")]), ]), Event(name="平多", operate=Operate.LE, factors=[ Factor(name="5分钟二卖", signals_all=[Signal("5分钟_倒1笔_类买卖点_类二卖_任意_任意_0")]), Factor(name="5分钟三卖", signals_all=[Signal("5分钟_倒1笔_类买卖点_类三卖_任意_任意_0")]) ]), ] long_pos = PositionLong(symbol='000001.SH', hold_long_a=0.5, hold_long_b=0.8, hold_long_c=1, T0=True) ct = CzscAdvancedTrader(kg=kg, get_signals=get_default_signals, long_events=events, long_pos=long_pos) assert len(ct.s) == 16 for row in tqdm(bars[150000:], desc="trade"): ct.update(row) if long_pos.pos_changed: print(" : op : ", long_pos.operates[-1]) if ct.long_pos.pos > 0: assert ct.long_pos.long_high > 0 assert ct.long_pos.long_cost > 0 assert ct.long_pos.long_bid > 0 print(pd.DataFrame(ct.long_pos.evaluate_operates())['盈亏比例'].sum())