您的位置 首页 股票炒股

单因子策略进阶版

本篇延续(第三期:单因子策略入门版),介绍如何使用优矿平台编写策略代码,以股息率作为择股条件,自动筛选出股息率…

本篇延续(第三期:单因子策略入门版),介绍如何使用优矿平台编写策略代码,以股息率作为择股条件,自动筛选出股息率前十名的股票构建投资组合,并通过历史模拟回测的方式评估这个策略的​表现。

本期重点讲解具体实现代码,手把手的教大家撰写单因子​投资策略。

选股标准:

(1)沪深300成分股

(2)选出因子X数值(X=股息率)最高的n家(n=10)公司股票作为投资组合

回测方法:

(1)回测期间:BeginDate 至 EndDate(BeginDate = 2010年1月1日,EndDate = 2019年7月1日)

(2)调仓周期:每年调仓一次,调仓日为5月第1个交易日,这是由于中国A股上市公司每年4月30日之前发布上一年年报,财务数据会更新。考虑停牌、涨跌停对交易的影响。

(3)手续费:佣金、滑点总计交易费用为千分之1.3

(4)资金分配方法:等权

(5)比较基准:沪深300指数

注: 策略代码参考 王小川《Python与量化投资 从基础到实战》[1]

可以将该策略代码分为以下四步:

导入相关模块——获取调仓日——编写选股函数——策略执行

一、导入相关模块

Python编程语言可以使用import函数导入已经定义好的工具包,导入之后可以直接使用已经编写好的函数。我们逐行对代码进行解释,注意看代码左侧数字顺序:

l 1:精确除法division:导入division函数前,‘/’代表阶段除法,导入后‘/’代表精确除法,看图秒懂:

l 2、3:上述函数中,pandas、numpy是在量化投资策略撰写中最常用的两个包,用来处理和计算数据。

l 4、5:处理时间:datetime和parse是处理和解析时间格式的函数

l 6、7:CAL.PyCAL是优矿编写的金融分析工具,导入后可以直接使用相关分析工具,比如Calendar(‘China.SSE’)用来调取交易日历,传入参数规则是‘国家.市场’,’China.SSE‘就是中国上海证券交易所。

二、获取调仓日

上述代码的目的是获取调仓日的日期,就是最后的t_date,这个调仓日是每年5月的第一个交易日。我们逐行对代码进行解释,对照代码左侧数字顺序:

l 2:优矿提供了丰富的数据获取接口,点击菜单的研究数据就可以找到对应的数据获取代码。DataAPI.TradeCAlGet是优矿提供的交易所交易日历。输入之后便可以获得下图的日历:

l 3、4:代码3是相当于excel的筛选功能,筛选出交易所开盘的交易日(isOpen==1),代码4是筛选出某个日期之后的交易日,输入之后得到下面的表格:

l 5~8:为了得到每年5月的第一个交易日的日期,作者采用三步走,首先摘取出每个交易日的月份和年份(5、6),接着使用去重的方法获取每月第一个交易日(7),最后筛选出5月(8)。其中,以下函数是我们第一次遇到:

n apply+lambda: 逐行应用用户自定义的规则

n drop_duplicates:去重,其中subset=[‘mon’,’year’] 是看见mon和year相同的都去掉;keep=’first’是保留第一个,之后遇到重复的全去掉

n mon.isin([’05’]):筛选出mon这一列中有‘05‘的行

n values:取表格里的数值

运行完成后,我们得到了一组每年5月第一个交易日的日期数据:

l 9:遍历每一个日期,将时间的字符串调整之后模板运行要求的时间格式。遍历使用for循环,格式调整使用strptime函数。

三、编写选股函数

这个函数实现的目标是:

输入:股票列表(universe),日期(date),因子(factor)

输出:因子数值前十名的股票列表

简单说,这个函数是一个在某一时间点的选股函数,输入时间点、备选股票、选择标准(因子),就可以得到按这个因子数值排序前十名的股票列表,当然也可调整成为前二十名,后二十名等等。下面我们逐行对代码进行解释:

l 1:def是python中自定义函数的代码,括号中是需要输入的关键参数。

l 2、3:是检验你输入的日期是否符合之后函数要求的时间格式,如果不符合格式,需要先使用parse函数解析使用者输入的时间元素,并调整成要求的时间格式。

l 5:利用优矿因子值获取的代码,可以直接获取因子数值

l 7:对因子数值按照降序进行排列,如图:

l 9~11:取前十名股票的股票代码(secID),并转成列表格式,返回列表

df_factor.head(10)表示前10只,

df_factor.head(20)表示前20只

df_factor.tail(10)表示后10只

四、策略执行

优矿提供了一个策略执行模板,点击下面“+策略”就可以调出这个模板,使用策略模板自动对编写的策略进行回测,并对运行结果可视化,可以节省大量时间,让投资者可以专注在策略研发上,下面我们对模板涉及代码进行讲解。

其中,部分代码含义模板中已经进行注释,容易理解的部分在此不再赘述。

l 6:refresh_rate:是指执行策略指令的时间将,默认该指标等于1,代表每分钟运行一次,通常日频回测会选择此值。

l 7:commission是对买入卖出的交易费用进行设定,也可以通过slippage函数对滑点进行设置,衡量冲击成本,费用的设定即可以设置为绝对金额,也可以设定为比例。

l 8~10:设置账户:可以包含股票账户、期货账户等,capital_base是初始本金,初始本金太少,可能会导致策略运行异常,如剩余本金无法买足一手股票

l 12:策略初始化,一般无需修改。

l 第15开始是模板的最关键部分,也是需要投资者自己撰写的部分,即投资策略的运行规则,什么情况买入,什么情况卖出

l 16:打开将要交易的股票账户,context函数是优矿模板中的函数,不能修改

l 17~19:检查交易日是否是调仓日,如果不是调仓日,保持仓位不变,如果是调仓日,需要进行调仓。调仓是先要获得账户持仓情况(18),然后执行选股函数,得到符合条件的买入清单(19),买入清单中排除了停牌的股票

得到买入清单之后,只需要将原账户持仓调整成买入清单中的持仓就可以了,这需要先卖出原账户不符合条件的股票,买入新符合条件的股票并且重新调整股票权重。但是有一个问题需要注意,那就是原账户中停牌的股票无法卖出,也无法调整权重,下面的代码用来处理这一问题:

l 21~26:如果原账户有股票,则需要考虑停牌问题,通过优矿数据接口获取停牌的股票清单(isOpen=‘0‘)

l 27~32:计算停牌股票的市值。停牌股票无法卖出,所以在计算总持仓时要把停牌股持仓市值计算在内,剩余资金再买入清单上的股票。27~31:遍历加总计算所有停盘股的市值之和。32:用来计算去除停牌股市值后,剩余资金占总持仓占比,将这个值与买入清单各股权重相乘可以得到实际需买入股票权重。

l 33~34:当账户空仓时,账户中没有停牌股票。

l 35~38:先卖出原账户中不在买入清单中的股票,使用优矿account.order_to函数.

l 39~42:如果买入清单有符合条件股票,则计算需买入的股票的实际权重,此案例中采用等权法,因此要除以股票个数,如果没有,就不需要买入。

l 43~48:使用优矿account.order_pct_to(stk,weight)函数,将各股票仓位调整成买入清单要求的仓位权重。仔细观察这段代码,有人可能会提出疑问,这段代码是不是可以写成下面的代码:

答案是不可以,因为命令的执行是有顺序的,需要先调整原账户持仓股票权重,腾出资金,再买入股票清单上新股票。如果顺序相反,有可能出现由于原账户股票持仓比例过高,剩余资金不足以买够新股票的权重。

长吁一口气,点击运行,得到运行结果:

参考资料:[1]王小川等.Python与量化投资 从基础到实战 [M].北京:电子工业出版社,2018:207-211.

完整代码:完整代码请复制链接下载:

链接:/s/1vR5tzYj_wMvi0U42QOR-FA

提取码:a7yo

本文来自网络,不代表伊好股票网立场,转载请注明出处:https://www.yhaow.com/chaogu/2234.html

作者: 伊好股票网

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

联系我们

0898-88881688

在线咨询: QQ交谈

邮箱: email@wangzhan.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部