主动量化选股策略(Python版)_第1页
主动量化选股策略(Python版)_第2页
主动量化选股策略(Python版)_第3页
主动量化选股策略(Python版)_第4页
主动量化选股策略(Python版)_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主动量化选股策略(Python版)该策略基于交易活跃度、长短期回报比、排名变化以及波动性变化,训练StockRanker模型,并选择排名前十的股票进行日频调仓。策略介绍交易活跃度:通常是指个股的成交量、成交金额等指标,可以反映市场投资者对该股票的关注度和交易意愿。长短期回报比:衡量股票一段时间内的收益表现,可作为股票未来走势的预期指标。排名变化:基于各类指标对股票进行排名,并观察排名的变化情况,这可以帮助我们捕捉到市场情绪的转变和个股的表现差异。波动性变化:波动性常用于衡量股票价格变动的剧烈程度,可以在一定程度上反映市场的风险情况。策略背景股票市场中不同行情、不同时间段股票的表现不尽相同。基于不同因子的量化策略可以帮助投资者在不同的市场环境中寻找表现较好的股票,并通过定期调仓来优化持仓组合,从而提高投资收益并控制风险。运用MachineLearning技术如StockRanker,可以更加精准地评估和筛选股票。该策略应属于主动量化选股策略,通过多因子模型结合机器学习技术,根据股票的短期表现进行频繁调仓。持仓市值大小:倾向选取活跃度高的股票(市值可能偏大,但也有小市值股票活跃度高)。净利润增速:可能会选取盈利情况较好的股票,但重点在于短期表现,净利润增速不是决定性因素。市盈率、市净率水平:不作为主要因子。ROA或ROE表现:这些财务指标可能会作为模型的次要考量指标,但主要依赖短期波动性和交易情况。策略风险由于本策略频繁调仓,高度依赖市场短期表现,一旦市场整体波动较大或发生黑天鹅事件,策略表现可能会受到显著影响。由于持仓集中在排名前十的股票,个别股票的负面事件(如业绩爆雷、重大诉讼等)可能会对策略的表现产生较大影响。频繁调仓可能导致较高的交易成本(手续费及滑点),对收益有一定的侵蚀作用。机器学习模型的有效性依赖于训练数据,如果历史数据不能很好地反映未来市场变化,模型的表现可能会不如预期。策略优势选股精度高:通过多因子分析并结合机器学习模型,可以更精准地评估和筛选表现较好的股票。灵活应对市场变化:由于策略采用日频调仓,可以更及时地应对市场的波动与变化,优化持仓组合。数据驱动决策:通过交易活跃度、回报比、排名变化及波动性变化,依据实时数据驱动决策,减少主观判断的偏差。策略代码示例:importpandasaspdfrombigmoduleimportM#<aistudiograph>#@param(id="m4",name="initialize")#交易引擎:初始化函数,只执行一次defm4_initialize_bigquant_run(context):importmathfrommissionimportPerOrderimportnumpyasnp#系统已经设置了默认的交易手续费和滑点,要修改手续费可使用如下函数context.set_commission(PerOrder(buy_cost=0.0003,sell_cost=0.0013,min_cost=5))#设置买入的股票数量,这里买入预测股票列表排名靠前的5只stock_count=5#每只的股票的权重,如下的权重分配会使得靠前的股票分配多一点的资金,[0.339160,0.213986,0.169580,..]context.stock_weights=np.array([1/np.log(i+2)foriinrange(stock_count)])context.stock_weights=context.stock_weights/np.sum(context.stock_weights)#设置每只股票占用的最大资金比例context.max_cash_per_instrument=0.2context.options['hold_days']=5#@param(id="m4",name="before_trading_start")#交易引擎:每个单位时间开盘前调用一次。defm4_before_trading_start_bigquant_run(context,data):#盘前处理,订阅行情等pass#@param(id="m4",name="handle_tick")#交易引擎:tick数据处理函数,每个tick执行一次defm4_handle_tick_bigquant_run(context,tick):pass#@param(id="m4",name="handle_data")defm4_handle_data_bigquant_run(context,data):#按日期过滤得到今日的预测数据ranker_prediction=context.data[context.data.date==data.current_dt.strftime('%Y-%m-%d')]#按照position排序ranker_prediction.sort_values(["date","position"],inplace=True)ranker_prediction.reset_index(drop=True,inplace=True)#1.资金分配#平均持仓时间是hold_days,每日都将买入股票,每日预期使用1/hold_days的资金#实际操作中,会存在一定的买入误差,所以在前hold_days天,等量使用资金;之后,尽量使用剩余资金(这里设置最多用等量的1.5倍)is_staging=context.trading_day_index<context.options['hold_days']#是否在建仓期间(前hold_days天)cash_avg=context.portfolio.portfolio_value/context.options['hold_days']cash_for_buy=min(context.portfolio.cash,(1ifis_stagingelse1.5)*cash_avg)cash_for_sell=cash_avg-(context.portfolio.cash-cash_for_buy)positions={e:p.amount*p.last_sale_pricefore,pincontext.portfolio.positions.items()}#2.生成卖出订单:hold_days天之后才开始卖出;对持仓的股票,按机器学习算法预测的排序末位淘汰ifnotis_stagingandcash_for_sell>0:equities={e:efore,pincontext.portfolio.positions.items()}instruments=list(reversed(list(ranker_prediction.instrument[ranker_prediction.instrument.apply(lambdax:xinequities)])))forinstrumentininstruments:context.order_target(instrument,0)cash_for_sell-=positions[instrument]ifcash_for_sell<=0:break#3.生成买入订单:按机器学习算法预测的排序,买入前面的stock_count只股票buy_cash_weights=context.stock_weightsbuy_instruments=list(ranker_prediction.instrument[:len(buy_cash_weights)])max_cash_per_instrument=context.portfolio.portfolio_value*context.max_cash_per_instrumentfori,instrumentinenumerate(buy_instruments):cash=cash_for_buy*buy_cash_weights[i]ifcash>max_cash_per_instrument-positions.get(instrument,0):#确保股票持仓量不会超过每次股票最大的占用资金量cash=max_cash_per_instrument-positions.get(instrument,0)ifcash>0:context.order_value(instrument,cash)#@param(id="m4",name="handle_trade")#交易引擎:成交回报处理函数,每个成交发生时执行一次defm4_handle_trade_bigquant_run(context,trade):pass#@param(id="m4",name="handle_order")#交易引擎:委托回报处理函数,每个委托变化时执行一次defm4_handle_order_bigquant_run(context,order):pass#@param(id="m4",name="after_trading")#交易引擎:盘后处理函数,每日盘后执行一次defm4_after_trading_bigquant_run(context,data):pass#@module(position="-386,-139",comment='通过SQL调用数据、因子和表达式等构建策略逻辑',comment_collapsed=False)m1=M.input_features_dai.v6(sql="""SELECT*FROMdata_753797bef8b911eebefa86aa0837f492ORDERBYdate,position""")#@module(position="-341,-3",comment='抽取数据,设置数据开始时间和结束时间,并绑定模拟交易',comment_collapsed=False)m2=M.extract_data_dai.v7(sql=m1.data,start_date='2022-08-01',start_date_bound_to_trading_date=True,end_date='2024-04-10',end_date_bound_to_trading_date=True,before_start_days=90,debug=False)#@module(position="-254,139",comment='交易,日线,设置初始化函数和K线处理函数,以及初始资金、基准等',comment_collapsed=False)m4=M.bigtrader.v14(data=m2.data,start_date='',end_date='',initialize=m4_initialize_bigquant_run,before_trading_start=m4_before_trading_start_bigquant_run,handle_tick=m4_handle_tick_bigquant_run,handle_data=m4_handle_data_bigquant_run,handle_trade=m4_handle_trade_bigquant_run,handle_order=m4_handle_order_bigquant_run,after_trading=m4_after_trading_bigquant_run,capital_base=1000000,frequency='da

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论