建一个信息 类网站,如果做局域网影音网站,没有网站流量怎么办,网站建设人工费本文以双均线策略为例#xff0c;描述如何在BigQuant策略平台上#xff0c;开发一个传统的趋势跟踪策略#xff0c;以更好地理解BigQuant回测机制。
双均线策略的策略思想是#xff1a;当短期均线上穿长期均线时#xff0c;形成金叉#xff0c;此时买入股票。当短期均线…本文以双均线策略为例描述如何在BigQuant策略平台上开发一个传统的趋势跟踪策略以更好地理解BigQuant回测机制。
双均线策略的策略思想是当短期均线上穿长期均线时形成金叉此时买入股票。当短期均线下穿长期均线时形成死叉此时卖出股票。研究表明双均线系统虽然简单但只要严格执行也能长期盈利。
策略的构建流程如下图所示 构建策略流程
在BigStudio环境下构建如下流程
第一步通过证券代码列表模m1块指定回测的股票和回测起止日期。
第二步通过特征输入列表模块m2定义买入和卖出信号 定义5日均线大于50日均线作为买入条件信号buy_condition 定义5日均线小于50日均线作为卖出条件信号sell_condition。
这里的等号表示将表达式重命名以免表达式过长导致不方便后续的过滤操作。
buy_conditionwhere(mean(close_0,5)mean(close_0,50),1,0)
sell_conditionwhere(mean(close_0,5)mean(close_0,50),1,0) 上述代码中使用的close_0默认是后复权价格如果想采用真实价格计算信号那么可以改写为
buy_conditionwhere(mean(close_0/adjust_factor_0,5)mean(close_0/adjust_factor_0, 50),1,0)
sell_conditionwhere(mean(close_0/adjust_factor_0,5,5)mean(close_0/adjust_factor_0, 50),1,0)
第三步通过基础特征抽取模块获取表达式中基础因子数据close_0
第四步通过衍生特征抽取m8获取buy_condition和sell_condition对应的因子表达式数据。
第五步利用缺失值处理模块m6对含有缺失值的行进行删除处理。
第六步将证券代买列表模块的输出和计算好的买卖条件信号输出给回测模块m3。
在回测模块中首先在初始化函数里通过context.set_commission设置交易手续费。
# 系统已经设置了默认的交易手续费和滑点要修改手续费可使用如下函数context.set_commission(PerOrder(buy_cost0.0003, sell_cost0.0013, min_cost5))
本例中设置股票的买入手续费按照成交额的0.0003收取卖出手续费按成交额的0.0013收取不足5元按照5元收取。
然后在数据准备函数中定义全局变量context.daily_stock_buy和context.daily_stock_sell分别获取每日符合买卖条件的股票列表。
# 回测引擎准备数据只执行一次
def bigquant_run(context):# 加载计算数据df context.options[data].read_df()# 函数求满足开仓条件的股票列表def open_pos_con(df):return list(df[df[buy_condition]0].instrument)# 函数求满足平仓条件的股票列表def close_pos_con(df):return list(df[df[sell_condition]0].instrument)# 逐日计算每日买入股票列表context.daily_stock_buy df.groupby(date).apply(open_pos_con)# 逐日计算每日卖出股票列表context.daily_stock_sell df.groupby(date).apply(close_pos_con) 最后在主函数中进行每日交易逻辑的编写。
# 回测引擎每日数据处理函数每天执行一次
def bigquant_run(context, data):# 获取今日的日期字符串today data.current_dt.strftime(%Y-%m-%d) # 通过positions对象使用列表生成式的方法获取目前持仓的股票列表stock_hold_now {e.symbol: p.amount * p.last_sale_pricefor e, p in context.portfolio.positions.items()}try:buy_stock context.daily_stock_buy[today] # 当日符合买入条件的股票except:buy_stock[] # 如果没有符合条件的股票就设置为空try:sell_stock context.daily_stock_sell[today] # 当日符合卖出条件的股票except:sell_stock[] # 如果没有符合条件的股票就设置为空# 需要卖出的股票:已有持仓中符合卖出条件的股票stock_to_sell [ i for i in stock_hold_now if i in sell_stock ]# 如果有卖出信号if len(stock_to_sell)0:for instrument in stock_to_sell:# 将标的转化为equity格式以便下单操作sid context.symbol(instrument) # 获取股票持仓cur_position context.portfolio.positions[sid].amount# 如果有股票持仓并且处于可交易状态则下单卖出if cur_position 0 and data.can_trade(sid):# 通过order_target_percent下单至指定仓位比例(通常0到1之间)context.order_target_percent(sid, 0) # 如果有买入信号/需要调整持仓if len(buy_stock )0:# 每只股票的比重为等资金比例持有weight 1/len(buy_stock )for instrument in buy_stock :# 将标的转化为equity格式以便下单操作sid context.symbol(instrument)if data.can_trade(sid):context.order_target_percent(sid, weight) # 买入
策略案例---
策略名称
双均线策略
策略思路
长期均线小于短期均线且没有持仓, 则买入;长期均线大于短期均线且持有, 则卖出.
股票池筛选
600519.SHA 这一只股票
1. 主要参数
# 股票选择
instruments [600519.SHA]
# 开始时间
start_date 2017-11-24
# 结束时间
end_date 2021-11-24
2. 策略回测主体
# 初始化账户
def initialize(context):context.set_commission(PerOrder(buy_cost0.0003, sell_cost0.0013, min_cost5)) # 设置手续费买入成本为万分之三卖出为千分之1.3context.short_period 5 # 短期均线context.long_period 50 # 长期均线 def handle_data(context, data):# 长期均线值要有意义需要在50根k线之后if context.trading_day_index context.long_period: returnk instruments[0] # 标的为字符串格式sid context.symbol(k) # 将标的转化为equity格式price data.current(sid, price) # 最新价格short_mavg data.history(sid, price,context.short_period, 1d).mean() # 短期均线值long_mavg data.history(sid, price,context.long_period, 1d).mean() # 长期均线值cash context.portfolio.cash # 现金cur_position context.portfolio.positions[sid].amount # 持仓# 交易逻辑# 如果短期均线大于长期均线形成金叉并且没有持仓并且该股票可以交易if short_mavg long_mavg and cur_position 0 and data.can_trade(sid): context.order(sid, int(cash/price/100)*100) # 买入# 如果短期均线小于长期均线形成死叉并且有持仓并且该股票可以交易elif short_mavg long_mavg and cur_position 0 and data.can_trade(sid): context.order_target_percent(sid, 0) # 全部卖出
3.回测接口
mM.trade.v3(instrumentsinstruments,start_datestart_date,end_dateend_date,initializeinitialize,handle_datahandle_data,order_price_field_buyopen, # 以开盘价买入order_price_field_sellopen, # 以开盘价卖出capital_base1000000, # 本金)详情参见 双均线可视化策略 - bigquant