量化交易之回测篇 - 期货&股票模型回测所需数据源(back_tester_source_data.py)

这个代码实现了一个Python回测框架的配置和数据加载模块,包括股票和期货部分。它定义了路径类来获取配置文件路径,如回测设置、策略模板等,并提供了加载策略模板和历史数据的方法。此外,还包含一个用于读取和操作文件路径的通用工具类。
摘要由CSDN通过智能技术生成
import os
import importlib
import traceback
from pathlib import Path

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 tqz_strategy.template import CtaTemplate

"""
stock part
"""
class TQZBackTesterStockConfigPath:
    @classmethod
    def stock_back_tester_setting_path(cls) -> str:
        return TQZFilePathOperator.grandfather_path(
            source_path=__file__
        ) + f'/back_tester_config/stock/back_tester_setting.json'

    @classmethod
    def stock_pool_setting_path(cls) -> str:
        return TQZFilePathOperator.grandfather_path(
            source_path=__file__
        ) + f'/back_tester_config/stock/if300_ic500_stock_pool.xlsx'


class TQZBackTesterStockSourceData:
    __stock_back_tester_setting = TQZJsonOperator.tqz_load_jsonfile(
        jsonfile=TQZBackTesterStockConfigPath.stock_back_tester_setting_path()
    )

    @classmethod
    def load_stock_strategy_templates(cls) -> dict:
        all_strategies_classes = TQZStrategyTemplate.get_all_strategy_classes(type_str='stock')

        stock_strategy_templates = {}
        for stock_strategy_template in cls.__stock_back_tester_setting['stock_strategy_templates']:
            assert stock_strategy_template in all_strategies_classes.keys(), f'bad stock_strategy_template: {stock_strategy_template}'

            stock_strategy_templates[stock_strategy_template] = {
                "start_date": cls.__stock_back_tester_setting['start_date'],
                "end_date": cls.__stock_back_tester_setting['end_date'],
                "interval": cls.__stock_back_tester_setting['interval'],
                "tick_value": cls.__stock_back_tester_setting['tick_value'],
                "stock_strategy_template": all_strategies_classes[stock_strategy_template]
            }

        return stock_strategy_templates


"""
future part
"""
class TQZBackTesterFutureConfigPath:

    @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=TQZBackTesterFutureConfigPath.future_back_tester_setting_path()
    )

    @classmethod
    def load_future_strategies(cls) -> dict:
        """ """
        all_strategies_classes = TQZStrategyTemplate.get_all_strategy_classes(type_str='stock')

        assert cls.__future_back_tester_setting['future_strategy_template'] in all_strategies_classes.keys(), f'bad future_strategy_template: {cls.__future_back_tester_setting["future_strategy_template"]}'

        strategies_setting = TQZJsonOperator.tqz_load_jsonfile(jsonfile=TQZBackTesterFutureConfigPath.future_strategies_setting_path())

        strategy_template = all_strategies_classes[cls.__future_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']
        )


"""
public part
"""
class TQZBackTesterResultPath:
    @classmethod
    def future_fold(cls) -> str:
        return TQZFilePathOperator.grandfather_path(
            source_path=__file__
        ) + f'/back_tester_result/future'

    @classmethod
    def stock_fold(cls) -> str:
        return TQZFilePathOperator.grandfather_path(
            source_path=__file__
        ) + f'/back_tester_result/stock'

    @classmethod
    def stock_ic500_fold(cls) -> str:
        return TQZFilePathOperator.grandfather_path(
            source_path=__file__
        ) + f'/back_tester_result/stock/ic500'

    @classmethod
    def stock_if300_fold(cls) -> str:
        return TQZFilePathOperator.grandfather_path(
            source_path=__file__
        ) + f'/back_tester_result/stock/if300'


class TQZStrategyTemplate:

    @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 part
    _strategies = TQZBackTesterFutureSourceData.load_future_strategies()
    for _strategy_name, _data in _strategies.items():
        print("strategy_name: " + str(_strategy_name))
        print("strategy: " + str(_data['strategy']))
        print("bars[:10]: " + str(_data['bars'][:10]))

        exit()
    """

    TQZBackTesterStockSourceData.load_stock_strategy_templates()

期货全品种行情下载工具和行情重播回测API 期货市场全品种行情tick数据收集工具3.1 支持盘中实时行情和历史行情连续回播,开盘时间申请到当前行情时间段也不会缺行情, 当数据服务器将文件历史行情回播完成后,开始接着播放实时行情,直到通过python api 调用方法,通知服务器停止回播实时行情。 目前不支持并发,对同一个品种多次调用回播api,会导致回播行情数据顺序错乱。 对不同品种多次调用回播api,可能因为cpu占用过大,会导致服务器UI没有响应。后面升级版本会 完整的并发解决方案。 期货市场全品种行情tick数据收集工具3.0 (1)TCP网络连接由同步模式改为异步模式,解决某些网络状况无法连接数据采集服务器的问题 未来升级版本将优化性能 期货市场全品种行情tick数据收集工具2.9b 清理了不要的.lib,不会再提示缺少ctp的dll文件,删除了不要的方法 支持任意IP地址的连接,可以实现连接云主机运行的行情收集服务器,或局域网里的行情收集服务器。 期货市场全品种行情tick数据收集工具2.9 修复了多个API进程之间回调数据时互相影响 当前合约数约323个合约,最大范围1200个合约,视合约产品而定。 本例正式发布版本2.7 可以自由设置行情服务器 模拟simnow24小时行情服务器在交易日上午没有数据,要在下午4点之后才有数据。 模拟simnow实盘同步时间服务器,和实盘同步。 可改为期货公司的服务器IP,见“快期”软件设置“测试和代理”中的行情IP地址 双击合约文件列表可打开分时图 TestPythonApi可以调用DataCollectServer收集的行情数据(给定合约和时间段) 2017.3.11
### 回答1: 在这个代码中出现的syntax error是指语法错误。具体地,在__tester__.java文件的第62行出现了一个语法错误。错误的具体描述是:“cannot find symbol”,表示找不到符号。而这个符号是“resize”。所以,代码在这个地方无法识别和找到resize这个方法或变量。 要解决这个问题,我们要查看代码并确定是什么缺少了resize这个符号。首先,我们要验证resize是否是一个方法还是一个变量。如果resize是一个方法,我们要查找resize的定义部分,并确保它正确地被声明和实现。如果resize是一个变量,我们要检查是否有一个与之对应的变量声明和初始化。 另外,我们还要考虑resize这个符号是否属于当前作用域。在Java中,每个变量和方法都有其作用域,表示可以访问和使用这些变量和方法的代码块。如果resize的定义不在当前作用域内,那么我们要引入并初始化resize所属的对象。 总之,syntax error: cannot find symbol错误通常是由于无法找到符号(变量或方法)的定义而引起的。我们要检查代码,找出缺少resize符号的原因,并采取正确的措施来解决这个问题。 ### 回答2: 在给出的代码中,出现了语法错误。错误的位置发生在__tester__.java文件的第62行。 错误消息"cannot find symbol"表示找不到符号。具体来说,在第62行中使用了一个resize方法,但是该方法没有定义或声明过。因此,编译器无法找到resize方法所属的符号。 要解决这个错误,您要确认resize方法是否存在,并且确保在使用之前已经正确定义和实现了该方法。如果resize方法是在其他文件中定义的,您要确保正确地导入该文件。另外,也要检查resize方法的参数和返回类型,以确保它们与调用处的期望一致。 总之,根据给出的错误信息来看,首先应当检查resize方法的存在性、定义性和导入性。如果这个方法确实不存在或者定义有误,要进行相应的修复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值