qlib实践3-测试用例-测试基础思路

本文档介绍了使用QLib进行回测分析的步骤,包括数据加载、模型设定、学习与预测、回测分析。通过workflow_by_code用例,详细展示了如何建立LGB模型,进行预测并应用TopkDropout策略进行回测。同时,讨论了图表分析中的关键指标,如累计收益、策略换手率等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

获取数据
from qlib.data import D

从D中筛选出数据和指标

>> from qlib.data import D
>> from qlib.data.filter import NameDFilter, ExpressionDFilter
>> nameDFilter = NameDFilter(name_rule_re='SH[0-9]{4}55')
>> expressionDFilter = ExpressionDFilter(rule_expression='$close>Ref($close,1)')
>> instruments = D.instruments(market='csi300', filter_pipe=[nameDFilter, expressionDFilter])
>> fields = ['$close', '$volume', 'Ref($close, 1)', 'Mean($close, 3)', '$high-$low']
>> D.features(instruments, fields, start_time='2010-01-01', end_time='2017-12-31', freq='day').head().to_string()
'                              $close        $volume  Ref($close, 1)  Mean($close, 3)  $high-$low
... instrument  datetime
... SH600655    2010-01-04  2699.567383  158193.328125     2619.070312      2626.097738  124.580566
...             2010-01-08  2612.359619   77501.406250     2584.567627      2623.220133   83.373047
...             2010-01-11  2712.982422  160852.390625     2612.359619      2636.636556  146.621582
...             2010-01-12  2788.688232  164587.937500     2712.982422      2704.676758  128.413818
...             2010-01-13  2790.604004  145460.453125     2788.688232      2764.091553  128.413818'
>> from qlib.data import D
>> data = D.features(["sh600519"], ["(($high / $close) + ($open / $close)) * (($high / $close) + ($open / $close)) / (($high / $close) + ($open / $close))"], start_time="20200101")
>> from qlib.data.ops import *
>> f1 = Feature("high") / Feature("close")
>> f2 = Feature("open") / Feature("close")
>> f3 = f1 + f2
>> f4 = f3 * f3 / f3

>> data = D.features(["sh600519"], [f4], start_time="20200101")
>> data.head()

参考文档:Data Retrieval — QLib 0.8.6.99 documentation

================================================================

workflow_by_code用例

1. 加载数据

qlib.init(provider_uri=provider_uri, region=REG_CN)

2. 设置模型数据范围和学习时间范围

market = "csi300"

data_handler_config = {
    "start_time": "2021-01-01",
    "end_time": "2022-12-31",
    "fit_start_time": "2021-01-01",
    "fit_end_time": "2021-12-31",
    "instruments": market,
}

3. 设置模型及参数

task = {
    "model": {
        "class": "LGBModel",
        "module_path": "qlib.contrib.model.gbdt",
        "kwargs": {
            "loss": "mse",
            "colsample_bytree": 0.8879,
            "learning_rate": 0.0421,
            "subsample": 0.8789,
            "lambda_l1": 205.6999,
            "lambda_l2": 580.9768,
            "max_depth": 8,
            "num_leaves": 210,
            "num_threads": 20,
        },
    },

4. 设置数据集和数据集处理范围

"dataset": {
        "class": "DatasetH",
        "module_path": "qlib.data.dataset",
        "kwargs": {
            "handler": {
                "class": "Alpha158",
                "module_path": "qlib.contrib.data.handler",
                "kwargs": data_handler_config, #步骤1中的时间范围和股票集合
            },
            "segments": {
                "train": ("2021-01-01", "2021-12-31"),
                "valid": ("2021-07-01", "2021-12-31"),
                "test": ("2022-01-01", "2022-12-01"),
            },
        },
    },

5. 模型初始化

model = init_instance_by_config(task["model"])
dataset = init_instance_by_config(task["dataset"])

6. 模型学习

# start exp to train model
with R.start(experiment_name="train_model"):
    R.log_params(**flatten_dict(task))

    model.fit(dataset)

    R.save_objects(trained_model=model)
    rid = R.get_recorder().id

7. 预测、回测、分析

# backtest and analysis
with R.start(experiment_name="backtest_analysis"):
    recorder = R.get_recorder(recorder_id=rid, experiment_name="train_model")
    model = recorder.load_object("trained_model")

    # prediction
    recorder = R.get_recorder()
    ba_rid = recorder.id
    sr = SignalRecord(model, dataset, recorder)
    sr.generate()

    # backtest & analysis
    par = PortAnaRecord(recorder, port_analysis_config, "day")
    par.generate()

7.1.其中PortAnaRecord做回测和分析,用到了一组新参数

port_analysis_config = {
    "executor": {
        #交易执行agent
        "class": "SimulatorExecutor",
        "module_path": "qlib.backtest.executor",
        "kwargs": {
            "time_per_step": "day",# 回测频率
            "generate_portfolio_metrics": True,
        },
    },
    "strategy": {
        "class": "TopkDropoutStrategy",
        "module_path": "qlib.contrib.strategy.signal_strategy",
        "kwargs": {
            "model": model,
            "dataset": dataset,
            "topk": 50,
            "n_drop": 5,
        },
    },
    "backtest": {
        "start_time": "2022-01-01",
        "end_time": "2022-12-01",
        "account": 100000000,
        "benchmark": benchmark, #基准收益,默认是沪深300, SH000300
        "exchange_kwargs": {
            "freq": "day",
            "limit_threshold": 0.095, #涨跌停设定 
            "deal_price": "close",
            "open_cost": 0.0005, #手续费设置
            "close_cost": 0.0015,
            "min_cost": 5,
        },
    },
}

可以这么理解,先对数据进行建立LGB模型,然后对数据进行预测,对预测的结果使用TopkDropout策略进行回测执行。

8. 图表分析

其中该模型的图表分析直接加载了磁盘中的pkl文件,后续将自行再测试一下

from qlib.contrib.report import analysis_model, analysis_position
from qlib.data import D
#模型加载,从experiment中加载
recorder = R.get_recorder(recorder_id=ba_rid, experiment_name="backtest_analysis")
pred_df = recorder.load_object("pred.pkl")

#从磁盘中加载3个不同的pkl,与回测分析进行对比?
report_normal_df = recorder.load_object("portfolio_analysis/report_normal_1day.pkl")
positions = recorder.load_object("portfolio_analysis/positions_normal_1day.pkl")
analysis_df = recorder.load_object("portfolio_analysis/port_analysis_1day.pkl")


#绘图
analysis_position.report_graph(report_normal_df)

图表指标,

cum bench: 基准指数的累计收益

cum return wo cost: 不计交易成本的策略累计收益

cum return w cost: 计入交易成本的策略累计收益

return w cost mdd: 计入交易成本的收益最大回撤

cum ex return wo cost: 不计交易成本的策略累计超额收益

turnover:策略换手率

<think>好的,我现在需要帮助用户解决如何正确使用qlib的update命令,特别是关于--csv_path参数的配置以及其他相关参数的设置。首先,我需要回忆一下用户提供的引用内容,看看是否有相关的信息。 用户提供了两个引用。引用[^1]提到了一个命令的格式:`python <script path> update_data_to_bin --qlib_data_1d_dir <user data dir>`。这可能是一个更新数据到二进制格式的命令,但具体参数如--csv_path并没有直接出现,需要进一步分析。引用[^2]则包含了下载数据的示例命令,其中使用了`scripts/get_data.py`和不同的参数,比如--target_dir、--region、--interval等。这可能与数据导入或更新有关,但同样没有直接提到--csv_path。 接下来,我需要确定用户的问题核心:他们想了解如何运行qlib的update命令,并指定CSV路径、符号字段名、日期字段名以及包含的列。通常,在命令行工具中,参数如--csv_path后面需要接文件路径,其他参数可能需要指定字段名称和列名。 根据常见的qlib用法,数据导入或更新通常涉及将CSV数据转换为qlib的二进制格式。例如,用户可能需要使用某个脚本,比如`scripts/dump_bin.py`或者类似的工具,将CSV数据导入到qlib的数据目录中。这时候,参数可能包括--csv_path指定CSV文件或目录,--symbol_field指定股票代码的列名,--date_field指定日期列名,--include_fields指定需要包含的字段。 但用户提到的update命令可能与数据更新有关,而不仅仅是初始导入。可能需要参考qlib的文档或示例命令来确认正确的参数。例如,用户提供的引用中的命令是`update_data_to_bin`,可能对应的参数包括--qlib_data_1d_dir来指定qlib的数据目录,而--csv_path可能用于指定新的CSV数据的位置。 另外,符号字段名(symbol_field)可能默认是“symbol”,日期字段名(date_field)默认是“date”,但用户可能需要自定义这些,特别是当CSV中的列名不同时。例如,如果CSV中使用“stock_code”作为股票代码列,就需要指定--symbol_field=stock_code。 需要确保用户正确指定所有必要的参数,并且路径正确。可能的示例命令可能是: python scripts/update_data.py update_data_to_bin --csv_path ./new_data --qlib_data_1d_dir ~/.qlib/qlib_data/cn_data --symbol_field symbol --date_field date --include_fields open,close,high,low,volume 但具体的脚本名称和参数可能需要查阅qlib的文档或源代码确认。此外,用户可能需要确保CSV文件的格式符合要求,比如按股票代码分目录存放,或者文件名符合特定格式。 在生成回答时,需要结合用户提供的引用中的命令结构,假设update命令的参数类似,并提供示例。同时提醒用户注意路径的正确性和字段名称的对应关系。如果有不确定的地方,建议用户查阅官方文档或GitHub仓库中的示例。</think>根据引用内容,qlib的update命令主要用于将用户自定义的CSV数据更新到二进制格式。以下是配置`--csv_path`及相关参数的详细说明和示例: ### 标准命令格式 ```bash python <script_path> update_data_to_bin \ --csv_path <CSV数据目录> \ --qlib_data_1d_dir <qlib数据存储目录> \ --symbol_field <股票代码字段名> \ --date_field <日期字段名> \ --include_fields <需包含的列> ``` ### 参数说明 1. **--csv_path** 指定包含CSV文件的目录路径,要求目录结构为: `目录/股票代码.csv`(例如`./data/000001.csv`) 2. **--qlib_data_1d_dir** 指定qlib的1D频段数据存储路径,默认位置为`~/.qlib/qlib_data/cn_data` 3. **--symbol_field** CSV中表示股票代码的列名(默认列名`symbol`) 4. **--date_field** CSV中表示日期的列名(默认列名`date`) 5. **--include_fields** 指定需导入的字段,例如`open,close,high,low,volume` ### 完整示例 ```bash # 将本地CSV数据更新到qlib python scripts/data_collector/yahoo/update_data_to_bin.py \ --csv_path ./user_data/csv_data \ --qlib_data_1d_dir ~/.qlib/qlib_data/cn_data \ --symbol_field instrument \ --date_field datetime \ --include_fields open,close,volume ``` ### 注意事项 - CSV文件需按`股票代码.csv`命名,且日期格式应为`YYYY-MM-DD` - 若字段名与默认值不同(如日期列名为`time`),需显式声明`--date_field time` - 首次导入建议先执行`get_data.py`下载基准数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值