CcD0B 2023-01-22 18:00 采纳率: 100%
浏览 13
已结题

量化均线策略 设置初始函数报错

请问各位量化均线策略为什么这个一直显示benchmark not defined
import re
import talib
import pandas as pd
import numpy as np
import quartz_futures as qf
from quartz_futures.api import *
def initialize(context):
    set_benchmark('000300.XSHG')
    set_option('use_real_price',True)
    log.info('初始函数开始运行且全局只运行一次')
    set_order_cost(OrderCost(close_tax=0.001,open_commission=0.0003,close_commission=0.0003,min_commission=5),type='stock')
    run_daily(before_market_open,time='before_open',reference_security='000300.XSHG')
    run_daily(market_open,time='open',reference_security='000300.XSHG')
    run_daily(after_market_close,time='after_close',reference_security='000300.XSHG')
def before_market_open(context):
    log.info('函数运行时间(before_market_open):'+str(context.current_dt.time()))
    g.security='000333.XSHE'
def market_open(context):
    log.info('函数运行时间(market_open):'+str(context.current_dt.time()))
    security=g.security
    close_data=get_bars(security,count=5,unit='1d',fields=['close'])
    MA5=close_data['close'].mean()
    current_price=close_data['close'][-1]
    cash=context.portfolio.available_cash
    #如果上一时间点价格高出5日平均价1%,则全仓买入
    if current_price > 1.01*MA5 and cash>0:
        log.info("价格高于均价1%,买入%s"%(security))
        print("当前可用资金为{0},position_value={0}".format(cash,context.portfolio.positions_value))
        order_value(security,cash)
    elif current_price < MA5 and context.portfolio.positions[security].closeable_amount>0:
        log.info("价格低于均价,卖出%s"%(security))
        order_target(security,0)
def after_market_close(context):
    log.info(str('函数运行时间(after_market_close):'+str(context.current_dt.time())))
    trades=get_trades()
    for _trade in trades.values():
        log.info('成交记录:'+str(_trade))
    log.info('一天结束')

报错:
Exception Traceback (most recent call last)
in ()
77 accounts=accounts, preload_data=_QUARTZ_PRELOAD_DATA,
78 display=True, return_quartz_data=True,
---> 79 threaded=quartz_createVar.get('threaded', True), need_tracking=True)
80 _QUARTZ_CACHE['start'] = start
81 _QUARTZ_CACHE['end'] = end

/home/ipython/anaconda/lib/python2.7/site-packages/mercuryq-quartz-3.61.0-1619.egg/quartz/utils/tracking_utils.pyc in _decorator(*args, **kwargs)

/home/ipython/anaconda/lib/python2.7/site-packages/mercuryq-quartz-3.61.0-1619.egg/quartz/backtest.pyc in backtest(start, end, benchmark, universe, capital_base, initialize, handle_data, post_trading_day, commission, slippage, refresh_rate, freq, security_base, security_cost, max_history_window, accounts, threaded, display, preload_data, *args, **kwargs)

/home/ipython/anaconda/lib/python2.7/site-packages/mercuryq-quartz-3.61.0-1619.egg/quartz/trading_agent.pyc in from_config(cls, clock, sim_params, data_portal, strategy, account_manager, pms_lite, broker_client, report_client, market_roller, trading_scheduler, display, context)

/home/ipython/anaconda/lib/python2.7/site-packages/mercuryq-quartz-3.61.0-1619.egg/quartz/context/context.pyc in init(self, clock, sim_params, strategy, market_service, universe_service, asset_service, calendar_service, market_roller, account_manager)

Exception: Exception in "Context.init": global name 'set_benchmark' is not defined!



  • 写回答

1条回答 默认 最新

  • 社区专家-Monster-XH 2023-01-22 18:14
    关注

    错误是因为set_benchmark函数未被调用或者参数不正确。

    在代码的initialize函数中,set_benchmark('000300.XSHG') 应该在set_option('use_real_price',True)之前调用,这样才能正确的设置benchmark.

    另外,如果你使用的是回测引擎是基于期货的,可能会因为不支持股票基准而导致错误。在这种情况下,可以尝试使用期货基准,或者更改回测引擎。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月30日
  • 已采纳回答 1月22日
  • 创建了问题 1月22日

悬赏问题

  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?