0
点赞
收藏
分享

微信扫一扫

量化交易之回测篇 - 资金管理(刷新pos_result.json)

尤克乔乔 2023-03-02 阅读 22


import os

from public_module.tqz_extern.tools.file_path_operator.file_path_operator import TQZFilePathOperator
from public_module.tqz_extern.tools.position_operator.position_operator import TQZJsonOperator
from server_api.api.tqz_tianqin_api import TQZTianQinDataManager

from math import floor

class TQZFundManage:

__future_contracts_setting = TQZJsonOperator.tqz_load_jsonfile(
jsonfile=TQZFilePathOperator.grandfather_path(
source_path=__file__
) + f'/back_tester_config/future/future_contracts_setting.json'
)
__avg_tr_path = TQZFilePathOperator.father_path(source_path=__file__) + f'/result_data/avg_tr.json'
__pos_result_path = TQZFilePathOperator.father_path(source_path=__file__) + f'/result_data/pos_result.json'

@classmethod
def __csv_content(cls):
return TQZTianQinDataManager.load_main_history_bars_from_csv(
tq_m_symbols=[
"KQ.m@SHFE.cu",
"KQ.m@SHFE.rb",
"KQ.m@CFFEX.IF",
"KQ.m@CFFEX.IC",
"KQ.m@CFFEX.T",
"KQ.m@SHFE.au",
"KQ.m@DCE.i",
"KQ.m@DCE.m",
"KQ.m@CZCE.CF",
"KQ.m@DCE.y",
"KQ.m@CZCE.TA",
"KQ.m@SHFE.ag",
"KQ.m@DCE.p",
"KQ.m@SHFE.hc",
"KQ.m@SHFE.ru",
"KQ.m@DCE.j",
"KQ.m@CZCE.MA",
"KQ.m@CZCE.SR",
"KQ.m@DCE.c",
"KQ.m@SHFE.al",
"KQ.m@SHFE.ni",
"KQ.m@CZCE.OI",
"KQ.m@CZCE.FG",
"KQ.m@CZCE.SA",
"KQ.m@INE.sc",
"KQ.m@DCE.v",
"KQ.m@CZCE.AP",
"KQ.m@DCE.pp",
"KQ.m@DCE.jm",
"KQ.m@DCE.l",
"KQ.m@CZCE.RM",
"KQ.m@SHFE.bu",
"KQ.m@DCE.eg",
"KQ.m@SHFE.zn",
"KQ.m@DCE.lh",
"KQ.m@SHFE.sp",
"KQ.m@CZCE.ZC",
"KQ.m@SHFE.fu",
"KQ.m@SHFE.sn",
"KQ.m@CZCE.SF",
"KQ.m@DCE.a",
"KQ.m@DCE.jd",
"KQ.m@CZCE.SM",
"KQ.m@SHFE.ss",
"KQ.m@DCE.eb",
"KQ.m@DCE.pg",
"KQ.m@CZCE.PF",
"KQ.m@CZCE.UR",
"KQ.m@SHFE.pb",
"KQ.m@DCE.cs"
]
)

@classmethod
def refresh_avg_tr_json(cls):
avg_tr_map = {}
for tq_m_symbol, bars in cls.__csv_content().items():
trs = []
for bar in bars:
hl_diff = bar.high_price - bar.low_price
trs.append(hl_diff)

trs.sort()

begin_index = floor(len(trs) * 0.25)
end_index = len(trs) - begin_index
avg_tr = sum(trs[begin_index:end_index]) / len(trs[begin_index:end_index])

tq_sym = tq_m_symbol.split('@')[1]
min_tick_price_flow = cls.__future_contracts_setting[tq_sym]["min_tick_price_flow"]
contract_multiple = cls.__future_contracts_setting[tq_sym]["contract_multiple"]

avg_tr_map[tq_sym] = {
"avg_tr": avg_tr,
"min_tick_price_flow": min_tick_price_flow,
"contract_multiple": contract_multiple,
"avg_tr_ticks": int(avg_tr / min_tick_price_flow),
"std_avg_tr_ticks": cls.__get_std_avg_tr_ticks(avg_tr_ticks=int(avg_tr / min_tick_price_flow)),
}

TQZJsonOperator.tqz_write_jsonfile(content=avg_tr_map, target_jsonfile=cls.__avg_tr_path)

@classmethod
def refresh_pos_json(cls, origin_balance: float, tq_syms: list, per_loss_percent: float = 0.01):
assert os.path.exists(cls.__avg_tr_path) is True, f'{cls.__avg_tr_path} not exist'
if len(tq_syms) is 0:
print("no items in tq_syms.")
return

avg_tr_content = TQZJsonOperator.tqz_load_jsonfile(jsonfile=cls.__avg_tr_path)
per_fund = origin_balance / len(tq_syms)

pos_map = TQZJsonOperator.tqz_load_jsonfile(jsonfile=cls.__pos_result_path)
for tq_sym in tq_syms:
renko_size = avg_tr_content[tq_sym]['std_avg_tr_ticks'] * 0.5
pos = (per_fund * per_loss_percent) / (4 * renko_size * avg_tr_content[tq_sym]["min_tick_price_flow"] * avg_tr_content[tq_sym]["contract_multiple"])
pos_map[tq_sym] = {
"pos": pos,
"std_pos": cls.__get_std_pos(pos),
"renko_size": renko_size
}

TQZJsonOperator.tqz_write_jsonfile(content=pos_map, target_jsonfile=cls.__pos_result_path)


# --- private part ---
@classmethod
def __get_std_pos(cls, pos: float) -> int:

result_std_pos = floor(pos)
if result_std_pos is 0: # set pos is 1 at least
result_std_pos = 1

return result_std_pos

@classmethod
def __get_std_avg_tr_ticks(cls, avg_tr_ticks: int, base_value: int = 10) -> int:
assert avg_tr_ticks >= 0, f'avg_tr_ticks value is error.({avg_tr_ticks})'

count = floor(avg_tr_ticks / base_value)
if avg_tr_ticks % base_value is 0: # 以 10 为 基准单位
return count * base_value
else:
return (count + 1) * base_value


if __name__ == '__main__':
# TQZFundManage.refresh_avg_tr_json()

""" 1. 非活跃品种不做 (mean_sed_fund < 8亿);
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['CFFEX.IF', 'CFFEX.T'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.rb', 'SHFE.au'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.cu', 'DCE.i'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['DCE.m', 'CZCE.CF'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['DCE.y', 'CZCE.TA'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.ag', 'DCE.p'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.hc', 'SHFE.ru'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['DCE.j', 'CZCE.MA'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['CZCE.SR', 'DCE.c'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.al', 'SHFE.ni'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['CZCE.OI', 'CZCE.FG'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['CZCE.SA', 'INE.sc'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['DCE.v', 'CZCE.AP'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['DCE.pp', 'DCE.jm'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['DCE.l', 'CZCE.RM'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.bu', 'DCE.eg'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.zn', 'DCE.lh'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.sp', 'CZCE.ZC'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.fu', 'SHFE.sn'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['CZCE.SF', 'DCE.a'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['DCE.jd', 'CZCE.SM'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.ss', 'DCE.eb'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['DCE.pg', 'CZCE.PF'], per_loss_percent=0.02)
"""

""" 2. 理论仓位太小的品种不做 (pos < 0.5);
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['CFFEX.T'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.rb', 'SHFE.au'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.cu', 'DCE.i'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['DCE.m', 'CZCE.CF'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['DCE.y', 'CZCE.TA'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.ag', 'DCE.p'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.hc', 'SHFE.ru'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['CZCE.MA', 'CZCE.SR'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['DCE.c', 'SHFE.al'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.ni', 'CZCE.OI'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['CZCE.FG', 'CZCE.SA'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['DCE.v', 'CZCE.AP'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['DCE.pp', 'DCE.jm'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['DCE.l', 'CZCE.RM'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.bu', 'DCE.eg'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.zn', 'SHFE.sp'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['CZCE.ZC', 'SHFE.fu'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['SHFE.sn', 'CZCE.SF'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['DCE.a', 'DCE.jd'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['CZCE.SM', 'SHFE.ss'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['DCE.eb', 'DCE.pg'], per_loss_percent=0.02)
TQZFundManage.refresh_pos_json(origin_balance=100000, tq_syms=['CZCE.PF'], per_loss_percent=0.02)
"""

pass

举报

相关推荐

0 条评论