量化交易之回测篇 - 期货回测数据源初步定版(back_tester_source_data.py)

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))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值