来源:雪球App,作者: 爱喝豆汁的投资者,(https://xueqiu.com/2680567071/130470562)

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

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

选股标准:

(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函数导入已经定义好的工具包,导入之后可以直接使用已经编写好的函数。我们逐行对代码进行解释,注意看代码左侧数字顺序:

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

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

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

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

二、获取调仓日

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

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

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

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

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

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

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

values:取表格里的数值

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

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

三、编写选股函数

这个函数实现的目标是:

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

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

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

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

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

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

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

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

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

df_factor.head(20)表示前20只

df_factor.tail(10)表示后10只

四、策略执行

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

完整代码:

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

提取码:a7yo

-------------------------------------------

不求取悦他人,但求愉悦自己

想了解更多请关注公众号:爱喝豆汁的量化投资者

微信号: investorSean

python写因子策略_单因子策略进阶版 本篇延续(第三期:单因子策略入门版),介绍如何使用优矿平台编写策略代码,以股息率作为择股条件,自动筛选出股息率前十名的股... - 雪球...相关推荐

  1. excel单元格数字对比及输入条件自动筛选

    excel单元格数字对比 在b1单元格中输入以下公式,再下拉填充到b6即可. =iF(oR(mid(a1,1,1)="*",mid(a1,1,1)=mid($c$8,1,1)),i ...

  2. JS编写一个函数,实现传入一个不定长度字符串,查找出重复次数前n名的字符并分别统计其次数

    编写一个函数,实现传入一个不定长度字符串,查找出重复次数前n名的字符并分别统计其重复次数.写得好像比较复杂,大家有更好的方法欢迎留言指导,谢谢. function compare(string, n) ...

  3. python写硬件驱动_用Python驱动开源硬件|课程开发者的对话

    随着中小学创客教育的推进,开源硬件逐步被教育工作者所了解并进入了中小学课堂.从一开始的小规模应用到区域级别的大规模推广,开源硬件因为其价格低廉.性能强大和资源丰富,加上扩展性好,越来越得到教师们的认可 ...

  4. python写魔兽世界脚本_用python bat写软件安装脚本 + HM NIS Edit自动生成软件安装脚本...

    2019-03-11更新:原来NSIS脚本也可以禁用64位文件操作重定向的! 1.在安装脚本的开始处定义 LIBRARY_X64. !include "MUI.nsh" !incl ...

  5. python写机器人程序_用Python写的一个多线程机器人聊天程序

    本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows).后来发现实现起来特别麻烦, 就想到python.听说这家伙在什么地方都能发挥作用.所以想用python来做通讯模块...所 ...

  6. python 写一个计算器_用 Python 写个计算器

    首页 专栏 python 文章详情 0 用 Python 写个计算器 Python小二 发布于 56 分钟前 我们常见的计算辅助工具有两种,一种是古人发明的算盘,另一种就是我们现代人发明的计算器,与算 ...

  7. 用python写shell脚本_应用python编写shell脚本

    今天同事叫我编写一个shell脚本.话说,虽然我受*nix的影响甚深,但是对于*nix里随处可见的sh脚本却是讨厌之极.为什么讨厌呢?首先是因为sh脚本那莫名其妙的语法,感觉就像随写随扔的程序,完全没 ...

  8. python写一个接口_如何用python写接口

    如何用python写接口?具体步骤如下: 1.实例化server 2.装饰器下面的函数变为一个接口 3.启动服务 开发工具和流程: python库:flask =>实例化server:serve ...

  9. python写采集程序_用python写的一个wordpress的采集程序

    在学习python的过程中,经过不断的尝试及努力,终于完成了第一个像样的python程序,虽然还有很多需要优化的地方,但是目前基本上实现了我所要求的功能,先贴一下程序代码: 具体代码如下: #! /u ...

最新文章

  1. python pil保存图片_python爬取百度图片并保存到本地
  2. leetcode 861. 翻转矩阵后的得分
  3. 【9702】黑白棋的移动
  4. Hadoop学习系列之PageRank
  5. 简而言之,JUnit:测试隔离
  6. java中 flush()方法
  7. c语言程序设计基础项目教程,C语言程序设计基础项目教程
  8. 分享一个Go项目的整洁架构模板
  9. java map 缓存池_map端合并(分布式缓存)
  10. AR研究-Demo集
  11. 还花几个小时整理线缆你就OUT了,VR自由漫步来了
  12. 基础算法matlab
  13. 关于Select option默认选中及查询后选项值保留的问题
  14. Win7网络和共享中心显示“依赖服务或组无法启动”,无法连接网络
  15. 牛客-练习赛101-推理小丑
  16. 漏洞复现----6、Jenkins远程命令执行漏洞(CVE-2018-1000861)
  17. C++ 快速傅里叶变换
  18. 1758. Minimum Changes To Make Alternating Binary String
  19. TiKV 集群版本的安全迁移
  20. Redis源码分析(十一)--- memtest内存检测

热门文章

  1. (读书笔记)大数据时代
  2. BOS项目01_02_项目的相关概述、MySQL创建新用户并授权、数据库环境的配置、Mysql命令行
  3. WIN10系统无法连接共享打印机注册导入再重启电脑
  4. kail Linux httrack简单使用教程
  5. python的image用法_python PIL.Image使用
  6. 如何合理的规避移动端App的频繁更新
  7. XPath注入漏洞学习
  8. 中南建设营收净利双增,净负债率下降,但仍踩两条“红线”
  9. [课程视频]指针、引用、函数参数、内联函数等
  10. SQL server共享锁,排他锁,更新锁的使用(转载)