def initialize(context): # context: UserContext对象, 存放有当前的账户/股票持仓信息 # portfolio Portfolio对象 # current_dt 当前单位时间的开始时间, datetime.datetime对象 # universe 此策略操作的股票池 # 定义一个全局变量, 保存要操作的股票 # 000001(股票:平安银行) g.security = '000001.XSHE' # 初始化此策略 # 设置我们要操作的股票池, 这里我们只操作一支股票 # 当前持仓的股票仍然会在股票池里, 所以最终的股票池包括security_list和持仓股票 set_universe([g.security]) print(context.universe) # # get_industry_stocks 获取一个行业的所有股票 stocks = get_industry_stocks('I64') print(stocks) # 获取一个指数给定日期在平台可交易的成分股列表 stocks = get_index_stocks('000300.XSHG') print(stocks) # 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次 def handle_data(context, data): print('---------------------handle_data---------------') # data # {'000001.XSHE': SecurityUnitData({'volume': 62658355, 'high_limit': 7.03, 'money': 402708864.0, 'price': 6.43, 'low_limit': 5.75, 'high': 6.51, 'paused': 0.0, 'pre_close': 6.39, 'low': 6.39, 'factor': 0.41732241429013761, 'close': 6.51, 'security': '000001.XSHE', 'open': 6.41})} security = g.security # 取得过去五天的平均价格 # data[security] SecurityUnitData # 一个单位时间内的股票的数据 average_price = data[security].mavg(5) # 取得上一时间点价格 current_price = data[security].price # 取得当前的现金 # Portfolio 当前的资金,股票信息 # cash 当前持有的现金 cash = context.portfolio.cash # 如果上一时间点价格高出五天平均价1%, 则全仓买入 if current_price > 1.01*average_price: # 计算可以买多少只股票 number_of_shares = int(cash/current_price) # 购买量大于0时,下单 if number_of_shares > 0: # 买入股票 # order(security, amount, style=None) # order('000001.XSHE', 100) # 下一个市价单 # order('000001.XSHE', 100, MarketOrderStyle()) # 下一个市价单, 功能同上 # order('000001.XSHE', 100, LimitOrderStyle(10.0)) # 以10块价格下一个限价单 order(security, +number_of_shares) # order_target(security, amount, style=None) # 买卖股票, 使最终股票的数量达到指定的amount # order_value(security, value, style=None) # 买卖价值为value的股票 # order_target_value(security, value, style=None) # 调整股票仓位到value价值 # 记录这次买入 log.info("Buying %s" % (security)) # 如果上一时间点价格低于五天平均价, 则空仓卖出 # Portfolio positions 当前持有的可卖出的股票, 一个dict, key是股票代码, value是Position对象 # Position 持有的某个股票的信息 amount 数量 elif current_price < average_price and context.portfolio.positions[security].amount > 0: # 卖出所有股票,使这只股票的最终持有量为0 order_target(security, 0) # 记录这次卖出 log.info("Selling %s" % (security)) # 画出上一时间点的价格 # 我们会帮您在图表上画出收益曲线和基准的收益曲线,您也可以调用record函数来描画额外的曲线 # 因为我们是按天展现的,如果您使用按分钟回测,我们画出的点是您最后一次调用record的值 record(stock_price=data[security].price) # 该函数会在每天开始交易前被调用一次, 您可以在这里添加一些每天都要初始化的东西 def before_trading_start(context): print('----------before_trading_start---------------') # 该函数会在每天结束交易后被调用一次, 您可以在这里添加一些每天收盘后要执行的内容. 这个时候所有未完成的订单已经取消 def after_trading_end(context): print('----------after_trading_end------------------') # 获取当天的所有订单 print(get_orders()) #得到当前未完成订单 orders = get_open_orders() #循环,撤销订单 for _order in orders.values(): cancel_order(_order) #cancel_order(_order.order_id)