import os
import importlib
import traceback
from pathlib import Path
from public_module.tqz_extern.tools.position_operator.position_operator import TQZJsonOperator
from public_module.tqz_extern.tools.file_path_operator.file_path_operator import TQZFilePathOperator
from server_api.api.tqz_tianqin_api import TQZTianQinDataManager
from tqz_strategy.template import CtaTemplate
class BackTesterFutureConfigPath:
@classmethod
def future_back_tester_setting_path(cls) -> str:
return TQZFilePathOperator.grandfather_path(
source_path=__file__
) + f'/back_tester_config/future/back_tester_setting.json'
@classmethod
def future_strategies_setting_path(cls) -> str:
return TQZFilePathOperator.grandfather_path(
source_path=__file__
) + f'/back_tester_config/future/strategies_setting.json'
@classmethod
def future_contracts_setting_path(cls) -> str:
return TQZFilePathOperator.grandfather_path(
source_path=__file__
) + f'/back_tester_config/future/future_contracts_setting.json'
@classmethod
def future_pos_result_path(cls) -> str:
return TQZFilePathOperator.grandfather_path(
source_path=__file__
) + f'/back_tester_config/future/pos_result.json'
class TQZBackTesterFutureSourceData:
__future_back_tester_setting = TQZJsonOperator.tqz_load_jsonfile(
jsonfile=BackTesterFutureConfigPath.future_back_tester_setting_path()
)
@classmethod
def load_future_strategies(cls) -> dict:
""" """
all_strategies_classes = cls.__get_all_strategy_classes(type_str='future')
back_tester_setting = TQZJsonOperator.tqz_load_jsonfile(
jsonfile=BackTesterFutureConfigPath.future_back_tester_setting_path()
)
assert back_tester_setting['future_strategy_template'] in all_strategies_classes.keys(), f'bad future_strategy_template: {back_tester_setting["future_strategy_template"]}'
strategies_setting = TQZJsonOperator.tqz_load_jsonfile(jsonfile=BackTesterFutureConfigPath.future_strategies_setting_path())
strategy_template = all_strategies_classes[back_tester_setting['future_strategy_template']]
strategies = {}
for strategy_name, data in strategies_setting.items():
for tq_m_symbol in cls.__load_future_history_bars_map().keys():
if tq_m_symbol.split('@')[1] == data['vt_symbol']:
strategies[strategy_name] = {
"strategy": strategy_template(None, strategy_name, data['vt_symbol'], data['setting']),
"bars": cls.__load_future_history_bars_map()[tq_m_symbol]
}
return strategies
# --- private part ---
@classmethod
def __load_future_history_bars_map(cls):
return TQZTianQinDataManager.load_main_history_bars_from_csv(
tq_m_symbols=cls.__future_back_tester_setting['tq_main_contracts']
)
@classmethod
def __get_all_strategy_classes(cls, type_str: str) -> dict:
""" """
root = Path(__file__).parent.parent
stock_strategies_path = root.joinpath("tqz_strategy", type_str, "strategies")
module_name = f'tqz_strategy.{type_str}.strategies'
strategies_classes = {}
for dirpath, dirnames, filenames in os.walk(stock_strategies_path):
for filename in filenames:
if filename.endswith(".py"):
strategy_module_name = ".".join(
[module_name, filename.replace(".py", "")])
try:
module = importlib.import_module(strategy_module_name)
importlib.reload(module)
for name in dir(module):
value = getattr(module, name)
if isinstance(value, type) and issubclass(value, CtaTemplate) and value is not CtaTemplate:
strategies_classes[value.__name__] = value
except: # noqa
assert False, f"策略文件{module_name}加载失败,触发异常:\n{traceback.format_exc()}"
return strategies_classes
if __name__ == '__main__':
# future_history_bars_map = TQZBackTesterFutureSourceData.load_future_history_bars_map()
# print("future_history_bars_map.keys(): " + str(future_history_bars_map.keys()))
_strategies = TQZBackTesterFutureSourceData.load_future_strategies()
print("_strategies: " + str(_strategies))
量化交易之回测篇 - 期货回测数据源初步定版(back_tester_source_data.py)
于 2022-04-18 17:15:33 首次发布