{"id":19966683,"url":"https://github.com/truthhun/parameter-optimization","last_synced_at":"2025-05-04T00:31:27.584Z","repository":{"id":39374303,"uuid":"119642825","full_name":"TruthHun/Parameter-optimization","owner":"TruthHun","description":"参数优化(股票+期货)，基于循环遍历回测的参数优化方法","archived":false,"fork":false,"pushed_at":"2018-01-31T06:11:16.000Z","size":2,"stargazers_count":11,"open_issues_count":0,"forks_count":7,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-07T23:39:22.989Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://www.myquant.cn/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/TruthHun.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-01-31T06:08:13.000Z","updated_at":"2023-08-06T17:20:35.000Z","dependencies_parsed_at":"2022-09-20T01:42:33.503Z","dependency_job_id":null,"html_url":"https://github.com/TruthHun/Parameter-optimization","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TruthHun%2FParameter-optimization","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TruthHun%2FParameter-optimization/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TruthHun%2FParameter-optimization/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/TruthHun%2FParameter-optimization/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/TruthHun","download_url":"https://codeload.github.com/TruthHun/Parameter-optimization/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252272944,"owners_count":21721831,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-13T02:37:40.991Z","updated_at":"2025-05-04T00:31:27.246Z","avatar_url":"https://github.com/TruthHun.png","language":"Python","readme":"# 参数优化(股票+期货)\n基于循环遍历回测的参数优化方法\n\n## 源码\n```python\n# coding=utf-8\nfrom __future__ import print_function, absolute_import, unicode_literals\n\nimport multiprocessing\n\nimport numpy as np\nimport pandas as pd\nimport talib\nfrom gm.api import *\n\n'''\n基本思想：设定所需优化的参数数值范围及步长，将参数数值循环输入进策略，进行遍历回测，\n        记录每次回测结果和参数，根据某种规则将回测结果排序，找到最好的参数。\n1、定义策略函数\n2、多进程循环输入参数数值\n3、获取回测报告，生成DataFrame格式\n4、排序\n本程序以双均线策略为例，优化两均线长短周期参数。\n'''\n\n\n# 原策略中的参数定义语句需要删除！\ndef init(context):\n    context.sec_id = 'SHSE.600000'\n    subscribe(symbols=context.sec_id, frequency='1d', count=31, wait_group=True)\n\n\ndef on_bar(context, bars):\n    close = context.data(symbol=context.sec_id, frequency='1d', count=31, fields='close')['close'].values\n    MA_short = talib.MA(close, timeperiod=context.short)\n    MA_long = talib.MA(close, timeperiod=context.long)\n    position = context.account().position(symbol=context.sec_id, side=PositionSide_Long)\n    if not position and not position:\n        if MA_short[-1] \u003e MA_long[-1] and MA_short[-2] \u003c MA_long[-2]:\n            order_target_percent(symbol=context.sec_id, percent=0.8, order_type=OrderType_Market,\n                                 position_side=PositionSide_Long)\n    elif position:\n        if MA_short[-1] \u003c MA_long[-1] and MA_short[-2] \u003e MA_long[-2]:\n            order_target_percent(symbol=context.sec_id, percent=0, order_type=OrderType_Market,\n                                 position_side=PositionSide_Long)\n\n\n# 获取每次回测的报告数据\ndef on_backtest_finished(context, indicator):\n    data = [indicator['pnl_ratio'], indicator['pnl_ratio_annual'], indicator['sharp_ratio'], indicator['max_drawdown'],\n            context.short, context.long]\n    # 将回测报告加入全局list，以便记录\n    context.list.append(data)\n\n\ndef run_strategy(short, long, a_list):\n    from gm.model.storage import context\n    # 用context传入参数\n    context.short = short\n    context.long = long\n    # a_list一定要传入\n    context.list = a_list\n    '''\n        strategy_id策略ID,由系统生成\n        filename文件名,请与本文件名保持一致\n        mode实时模式:MODE_LIVE回测模式:MODE_BACKTEST\n        token绑定计算机的ID,可在系统设置-密钥管理中生成\n        backtest_start_time回测开始时间\n        backtest_end_time回测结束时间\n        backtest_adjust股票复权方式不复权:ADJUST_NONE前复权:ADJUST_PREV后复权:ADJUST_POST\n        backtest_initial_cash回测初始资金\n        backtest_commission_ratio回测佣金比例\n        backtest_slippage_ratio回测滑点比例\n    '''\n    run(strategy_id='strategy_id',\n        filename='main.py',\n        mode=MODE_BACKTEST,\n        token='token_id',\n        backtest_start_time='2017-05-01 08:00:00',\n        backtest_end_time='2017-10-01 16:00:00',\n        backtest_adjust=ADJUST_PREV,\n        backtest_initial_cash=50000,\n        backtest_commission_ratio=0.0001,\n        backtest_slippage_ratio=0.0001)\n\n\nif __name__ == '__main__':\n    # 生成全局list\n    manager = multiprocessing.Manager()\n    a_list = manager.list()\n    # 循环输入参数数值回测\n    for short in range(5, 10, 2):\n        for long in range(10, 21, 5):\n            process = multiprocessing.Process(target=run_strategy, args=(short, long, a_list))\n            process.start()\n            process.join()\n    # 回测报告转化成DataFrame格式\n    a_list = np.array(a_list)\n    final = pd.DataFrame(a_list,\n                         columns=['pnl_ratio', 'pnl_ratio_annual', 'sharp_ratio', 'max_drawdown', 'short', 'long'])\n    # 回测报告排序\n    final = final.sort_values(axis=0, ascending=False, by='pnl_ratio')\n    print(final)\n```","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftruthhun%2Fparameter-optimization","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftruthhun%2Fparameter-optimization","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftruthhun%2Fparameter-optimization/lists"}