Skip to content

Commit

Permalink
V0.9.8 更新一批代码 (#125)
Browse files Browse the repository at this point in the history
* 0.9.6 update

* 0.9.6 update

* 0.9.7 新增 tas_kdj_evc_V221201 信号

* 0.9.7 新增 tas_kdj_evc_V221201 信号

* 0.9.7 新增飞书消息发送

* 0.9.7 新增结合大盘择时或股票池的择时优化分析

* 0.9.7 update

* 0.9.7 fix update_bi

* 0.9.7 update

* 0.9.7 update

* 0.9.7 CzscTrader 新增 on_sig 模式

* 0.9.7 fix

* 0.9.7 update

* 0.9.7 增加持仓评价

* 0.9.7 支持自定义仓位集成方法

* 0.9.7 支持自定义仓位集成方法

* 0.9.7 update

* 0.9.7 update

* 0.9.7 update

* 0.9.7 update

* 0.9.7 update

* 0.9.7 update

* 0.9.7 update

* 0.9.7 update

* 0.9.7 fix test

* 0.9.7 fix test

* 0.9.7 update

* 0.9.7 deprecated

* 0.9.7 update

* 0.9.7 update

* 0.9.7 update

* 0.9.7 update

* 0.9.7 update

* 0.9.7 fix bug

* 0.9.7 update

* 0.9.7 update

* 0.9.7 新增 QmtTradeManager 用于实盘仿真

* 0.9.7 新增 QmtTradeManager 用于实盘仿真

* 0.9.7 update examples

* 0.9.7 fix test

* 0.9.8 start coding

* 0.9.8 update

* 0.9.8 update

* 0.9.8 update

* 0.9.8 新增假突破信号

* 0.9.8 新增K线重采样函数

* 0.9.8 新增K线重采样函数

* 0.9.8 fix bug

* 0.9.8 QMT支持任意 base_freq

* 0.9.8 update

* 0.9.8 clean codes

* 0.9.8 update vol signals

* 0.9.8 clean codes

* 0.9.8 update

* 0.9.8 update

* 0.9.8 update

* 0.9.8 Position 对象新增 dump 方法

* 0.9.8 优化信号

* 0.9.8 新增 base_freq

* update
  • Loading branch information
zengbin93 authored Feb 19, 2023
1 parent 596342d commit cb3e648
Show file tree
Hide file tree
Showing 347 changed files with 1,230 additions and 7,024 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/pythonpackage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [3.7, 3.8, 3.9, 3.10.9, 3.11.1]
python-version: [3.7, 3.8, 3.9, 3.10.10, 3.11.2]

steps:
- uses: actions/checkout@v2
Expand Down
8 changes: 4 additions & 4 deletions czsc/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,16 +11,16 @@
from czsc import sensors
from czsc import aphorism
from czsc.analyze import CZSC
from czsc.traders.advanced import CzscAdvancedTrader, create_advanced_trader
from czsc.utils.ta import SMA, EMA, MACD, KDJ
from czsc.objects import Freq, Operate, Direction, Signal, Factor, Event, RawBar, NewBar, Position
from czsc.utils.cache import home_path, get_dir_size, empty_cache_path
from czsc.traders import CzscTrader, CzscSignals, generate_czsc_signals
from czsc.traders import PairsPerformance, combine_holds_and_pairs, combine_dates_and_pairs


__version__ = "0.9.7"
__version__ = "0.9.8"
__author__ = "zengbin93"
__email__ = "[email protected]"
__date__ = "20230123"
__date__ = "20230210"


if envs.get_welcome():
Expand Down
16 changes: 5 additions & 11 deletions czsc/cmd.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,32 +29,26 @@ def aphorism():
@click.option('-f', '--file_strategy', type=str, required=True, help="Python择时策略文件路径")
def dummy(file_strategy):
"""使用 CzscDummyTrader 进行快速的择时策略研究"""
from czsc.traders.dummy import DummyBacktest
dbt = DummyBacktest(file_strategy)
dbt.replay()
dbt.execute()
dbt.report()
pass


@czsc.command()
@click.option('-f', '--file_strategy', type=str, required=True, help="Python择时策略文件路径")
def replay(file_strategy):
"""执行择时策略在某个品种上的交易回放"""
from czsc.traders.dummy import DummyBacktest
dbt = DummyBacktest(file_strategy)
dbt.replay()
pass


@czsc.command()
@click.option('-f', '--file_strategy', type=str, required=True, help="Python信号检查文件路径")
@click.option('-d', '--delta_days', type=int, required=False, default=1, help="两次相同信号之间的间隔天数")
def check(file_strategy, delta_days):
"""执行择时策略中使用的信号在某个品种上的校验"""
from czsc.sensors.utils import check_signals_acc
from czsc.traders import check_signals_acc
from czsc.utils import get_py_namespace

py = get_py_namespace(file_strategy)
strategy = py['trader_strategy']
get_signals = py['get_signals']
check_params = py.get('check_params', None)

if not check_params:
Expand All @@ -67,4 +61,4 @@ def check(file_strategy, delta_days):
bars = py['read_bars'](symbol, sdt, edt)
logger.info(f"信号检查参数 | {symbol} - sdt: {sdt} - edt: {edt}")

check_signals_acc(bars, strategy=strategy, delta_days=delta_days)
check_signals_acc(bars, get_signals=get_signals, delta_days=delta_days)
55 changes: 48 additions & 7 deletions czsc/connectors/qmt_connector.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from czsc.objects import Freq, RawBar
from czsc.fsa.im import IM
from czsc.traders.base import CzscTrader
from czsc.utils import resample_bars
from xtquant import xtconstant
from xtquant import xtdata
from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
Expand Down Expand Up @@ -104,6 +105,41 @@ def get_kline(symbol, period, start_time, end_time, count=-1, dividend_type='fro
return format_stock_kline(df, freq=freq_map[period])


def get_raw_bars(symbol, freq, sdt, edt, fq='前复权', **kwargs):
"""获取 CZSC 库定义的标准 RawBar 对象列表
:param symbol: 标的代码
:param freq: 周期
:param sdt: 开始时间
:param edt: 结束时间
:param fq: 除权类型
:param kwargs:
:return:
"""
freq = Freq(freq)
if freq == Freq.F1:
period = '1m'
elif freq in [Freq.F5, Freq.F15, Freq.F30, Freq.F60]:
period = '5m'
else:
period = '1d'

if fq == '前复权':
dividend_type = 'front_ratio'
elif fq == '后复权':
dividend_type = 'back_ratio'
else:
assert fq == '不复权'
dividend_type = 'none'

kline = get_kline(symbol, period, sdt, edt, dividend_type=dividend_type,
download_hist=kwargs.get("download_hist", True), df=True)
kline['dt'] = pd.to_datetime(kline['time'])
kline['vol'] = kline['volume']
bars = resample_bars(kline, freq, raw_bars=True)
return bars


def get_symbols(step):
"""获取择时策略投研不同阶段对应的标的列表
Expand Down Expand Up @@ -220,9 +256,10 @@ def __init__(self, mini_qmt_dir, account_id, **kwargs):
self.symbols = kwargs.get('symbols', []) # 交易标的列表
self.strategy = kwargs.get('strategy', []) # 交易策略
self.symbol_max_pos = kwargs.get('symbol_max_pos', 0.5) # 每个标的最大持仓比例
self.trade_sdt = kwargs.get('trade_sdt', '20220601') # 交易跟踪开始日期
self.mini_qmt_dir = mini_qmt_dir
self.account_id = account_id
self.period = kwargs.get('period', '5m')
self.base_freq = self.strategy(symbol='symbol').sorted_freqs[0]
self.delta_days = int(kwargs.get('delta_days', 1)) # 定时执行获取的K线天数

self.session = random.randint(10000, 20000)
Expand All @@ -240,12 +277,14 @@ def __create_traders(self, **kwargs):
traders = {}
for symbol in tqdm(self.symbols, desc="创建交易对象", unit="个"):
try:
bars = get_kline(symbol, self.period, '20180201', datetime.now(),
dividend_type='front_ratio', df=False, download_hist=True)
trader: CzscTrader = self.strategy(symbol=symbol, data_source='qmt').init_trader(bars, sdt='20220601')
bars = get_raw_bars(symbol, self.base_freq, '20180101', datetime.now(), fq="前复权", download_hist=True)

trader: CzscTrader = self.strategy(symbol=symbol).init_trader(bars, sdt=self.trade_sdt)
traders[symbol] = trader
pos_info = {x.name: x.pos for x in trader.positions}
logger.info(f"{symbol} trader pos:{pos_info} | ensemble_pos: {trader.get_ensemble_pos('mean')}")
except Exception as e:
logger.warning(f'创建交易对象失败,symbol={symbol}, e={e}')
logger.exception(f'创建交易对象失败,symbol={symbol}, e={e}')
return traders

def get_assets(self):
Expand Down Expand Up @@ -357,8 +396,7 @@ def update_traders(self):
for symbol in self.traders.keys():
try:
trader = self.traders[symbol]
bars = get_kline(symbol, self.period, kline_sdt, datetime.now(),
dividend_type='front_ratio', df=False, download_hist=True)
bars = get_raw_bars(symbol, self.base_freq, kline_sdt, datetime.now(), fq="前复权", download_hist=True)

news = [x for x in bars if x.dt > trader.end_dt]
if news:
Expand All @@ -382,6 +420,9 @@ def update_traders(self):
else:
logger.info(f"{symbol} 没有需要更新的K线,最新的K线时间是 {trader.end_dt}")

pos_info = {x.name: x.pos for x in trader.positions}
logger.info(f"{symbol} trader pos:{pos_info} | ensemble_pos: {trader.get_ensemble_pos('mean')}")

except Exception as e:
logger.error(f"{symbol} 更新交易策略失败,原因是 {e}")

Expand Down
Loading

0 comments on commit cb3e648

Please sign in to comment.