python的量化代码怎么用到股市中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python的量化代码怎么用到股市中相关的知识,希望对你有一定的参考价值。
2010 ~ 2017 沪深A股各行业量化分析
在开始各行业的量化分析之前,我们需要先弄清楚两个问题:
第一,A股市场上都有哪些行业;
第二,各行业自2010年以来的营收、净利润增速表现如何?
第一个问题
很好回答,我们使用JQData提供的获取行业成分股的方法,输入get_industries(name='sw_l1')
得到申万一级行业分类结果如下:它们分别是:【农林牧渔、采掘、化工、钢铁、有色金属、电子、家用电器、食品饮料、纺织服装、轻工制造、医药生物、公用事业、交通运输、房地产、商业贸易、休闲服务、综合、建筑材料、建筑装饰、电器设备、国防军工、计算机、传媒、通信、银行、非银金融、汽车、机械设备】共计28个行业。
第二个问题
要知道各行业自2010年以来的营收、净利润增速表现,我们首先需要知道各行业在各个年度都有哪些成分股,然后加总该行业在该年度各成分股的总营收和净利润,就能得到整个行业在该年度的总营收和总利润了。这部分数据JQData也为我们提供了方便的接口:通过调用get_industry_stocks(industry_code=‘行业编码’, date=‘统计日期’),获取申万一级行业指定日期下的行业成分股列表,然后再调用查询财务的数据接口:get_fundamentals(query_object=‘query_object’, statDate=year)来获取各个成分股在对应年度的总营收和净利润,最后通过加总得到整个行业的总营收和总利润。这里为了避免非经常性损益的影响,我们对净利润指标最终选取的扣除非经常性损益的净利润数据。
我们已经获取到想要的行业数据了。接下来,我们需要进一步分析,这些行业都有什么样的增长特征。
我们发现,在28个申万一级行业中,有18个行业自2010年以来在总营收方面保持了持续稳定的增长。它们分别是:【农林牧渔,电子,食品饮料,纺织服装,轻工制造,医药生物,公用事业,交通运输,房地产,休闲服务,建筑装饰,电气设备,国防军工,计算机,传媒,通信,银行,汽车】;其他行业在该时间范围内出现了不同程度的负增长。
那么,自2010年以来净利润保持持续增长的行业又会是哪些呢?结果是只有5个行业保持了基业长青,他们分别是医药生物,建筑装饰,电气设备,银行和汽车。(注:由于申万行业在2014年发生过一次大的调整,建筑装饰,电气设备,银行和汽车实际从2014年才开始统计。)
从上面的分析结果可以看到,真正能够保持持续稳定增长的行业并不多,如果以扣非净利润为标准,那么只有医药生物,建筑装饰,电气设备,银行和汽车这五个行业可以称之为优质行业,实际投资中,就可以只从这几个行业中去投资。这样做的目的是,一方面,能够从行业大格局层面避免行业下行的风险,绕开一个可能出现负增长的的行业,从而降低投资的风险;另一方面,也大大缩短了我们的投资范围,让投资者能够专注于从真正好的行业去挑选公司进行投资。
「2010-2017」投资于优质行业龙头的收益表现
选好行业之后,下面进入选公司环节。我们知道,即便是一个好的行业也仍然存在表现不好的公司,那么什么是好的公司呢,本文试图从营业收入规模和利润规模和来考察以上五个基业长青的行业,从它们中去筛选公司作为投资标的。
3.1按营业收入规模构建的行业龙头投资组合
首先,我们按照营业收入规模,筛选出以上5个行业【医药生物,建筑装饰,电气设备,银行和汽车】从2010年至今的行业龙头如下表所示:
可以看到,虽然时间跨度很长,但是在这5个行业中,营收规模大的公司始终处于领先地位。它们分别是【上海医药,中国建筑,上海电气,工商银行,上汽集团】。
由于各年度上市公司年报的公布截止日是4月30日,待所有上市公司年报公布后,确定行业龙头,然后将这些行业龙头构建成一个投资组合。那么,持有投资组合的收益表现如何呢?为了保证投资时间的一致性,我们假设从2015年4月30号之后的第一个交易日开始投资,本金是100万,每个标的投资权重相同,都是20%,并且忽略交易成本,那么持有该组合至2018年4月30号的投资收益是多少呢?
我们利用JQData提供的获取行情接口get_price(security='股票代码', start_date='开始交易日', end_date='投资截止日', frequency='daily', fields=None, skip_paused=False, fq='pre'),分别获取组合中各个公司在各年度开始交易日和投资截止日(4.30之后的第一个交易日)的价格,得到最终的投资结果如下图所示:
可以看到,除了2015.5.4-2016.5.3股灾期间,该组合投资收益率和上证指数、沪深300指数有一个同步的大幅下跌外,从2016.5.3至2018年5.2,改组合连续两年获得了正收益,并在2016年大幅跑赢另外两个基准指数20%以上。
聪明的读者一定会问这样一个问题,如果我从2018年5月2号开始,投资100万买入这样一个按营收规模衡量的行业龙头组合,至2018年5月30号,收益表现会如何呢?答案是【3.04%】,而同期上证指数收益率和沪深300收益率分别是【-0.20%】和【-0.39%】,可以说表现非常之好了。具体收益如下表所示:
3.2按扣非净利润规模构建的行业龙头投资组合
如果我们按照扣除非经常性损益的净利润来衡量,以上5个行业从2010年至今的行业龙头又会是哪些呢,我们查出来如下表所示:
可以看到,按照扣非净利润来构建投资组合,医药生物和电气设备两个行业分别发生了行业龙头的更替,如果要构建基于扣非净利润的投资组合,那么我们就需要每年去调整我们的组合标的以保证组合中都是上一年度的行业龙头。和上述投资回测方式一样,我们从2015年5月4号买入这样一个组合,并在之后每年4月30号之后的第一个交易日调整组合中的行业龙头标的,最终的投资结果如下表所示:
可以看到,即使是2015.4.30-2016.5.3股灾期间,该组合也跑赢上证指数和沪深300指数3%左右;而2016.5.3至2018年5.2期间更是大幅跑赢两个基准指数高达30%以上。
同样的,如果从2018年5月2号开始,投资100万买入这样一个按扣非净利润规模衡量的行业龙头组合,至2018年5月30号,收益表现会如何呢?答案是【2.83%】,对比同期上证指数收益率和沪深300指数的【-0.20%】和【-0.39%】,仍然维持了非常良好的表现。具体收益如下表所示:
结论
通过以上行业分析和投资组合的历史回测可以看到:
先选行业,再选公司,即使是从2015年股灾期间开始投资,至2018年5月1号,仍然能够获得相对理想的收益,可以说,红杉资本的赛道投资法则对于一般投资者还是比较靠谱的。
在构建行业龙头投资组合时,净利润指标显著优于营业收入指标,获得的投资收益能够更大的跑赢全市场收益率
市场是不断波动的,如果一个投资者从股灾期间开始投资,那么即使他买入了上述优质行业的龙头组合,在近3年也只能获得12%左右的累计收益;而如果从2016年5月3日开始投资,那么至2018年5月2日,2年时间就能获得超过50%以上的收益了。所以,在投资过程中选择时机也非常重要。
出自:JoinQuant 聚宽数据 JQData
参考技术A 使用第三方支持python语言开发量化交易模型的量化交易平台,并进行回测、仿真、实盘等步骤,从而实现股票量化交易的过程,目前国内较好的量化交易平台推荐您使用 ~掘|金|量|化~ 参考技术B (1) #按照市值从小到大的顺序活得N支股票的代码;(2) #分别对这一百只股票进行100支股票操作;
(3) #获取从2016.05.01到2016.11.17的涨跌幅数据;
(4) #选取记录大于40个的数据,去除次新股;
(5) #将文件名名为“股票代码.csv”。本回答被提问者采纳
Python零基础该如何学习
这篇文章经过叙述 [单股市均线战略] 在 Ricequant 量化渠道的完成,了解渠道并迅速入门、创立自个的量化战略代码。
难易度:入门级
那么以下咱们就先从 [单股市均线战略] 的代码完成及进行日等级回测讲起吧。
1 确定框架:
[单股票均线策略] 的主要策略框架: 5 日均线高于 30 天均线,则全仓买入股票 5 日均线低于 30 天均线,则卖出所持股票
从我们日常交易的角度,一般交易者的行为可以拆分以下两部分:
1 选择标的(初始化):
在交易之前,我们通常会先选定要交易的股票池或者单个股票
2 交易(每天盯盘)
我们会观察该股票的五日均线和 30 日均线,并进行比较 如果该股票的五日均线在 30 天均线以上,则全仓买入股票 如果该股票的五日均线在 30 天均线以下,则全仓卖出(空仓)
那么程序中,我们是怎么做的呢?
先看看 Ricequant 平台中对应的代码框架会是怎么样的吧:
definit(context):#程序的初始化,预设股票池、设置参数和变量。 只运行一次defhandle(context, bar_dict):#从回测的开始日期至结束日期,根据选择的频率(日、分钟)循环运行
对照策略思路 及 Ricequant 代码框架,你会发现我们可以很轻松地把 两者结合起来
以上框架也是 Ricequant 平台的最基本也最主要的框架,也就是
初始化
循环 - 根据选择的频率(日、分钟)循环运行
2 初始化:
选择标的:本策略的交易股票设定为 300059 ”东方财富“。
definit(context): context.stock ="300059.XSHE" # 存入目标股票 [东方财富 ]
延伸阅读:
1 在 init 中实现程序的初始化,例如存入目标股票池,设置滑点、基准等参数以及设置其它变量。 context 是一个全局的容器,你可以通过它设置任何全局变量并初始化:如 context.stock 将会在后面代码所被调用到。
2 代码中 # 代表注释,作为代码说明,执行时会被跳过而不为程序所运行。
3 如何填写股票代码:你会发现策略代码中 股票代码后带有后缀,那么它们分别代表什么呢?
后缀为
XSHE 代表在深交所上市交易的股票
XSHG 在上交所上市交易的股票
例子:
300059.XSHE 为深交所上市的东方财富
600000.XSHG 为上交所上市的浦发银行
我们的代码编辑器还提供了非常便利的股票代码自动寻找和补全功能,在 Windows 中你可以用 ctrl+i , Mac 系统你可以用 cmd+i 激活证券代码自动补全功能。如下图:
3 获取均价:
我们分别获取该股票 5 日和 30 日的均价
# 用法:变量 = bar_dict[股票代码].mavg(天数, frequency='day')# 获取近五日股票收盘价均价,命名为 fast fast= bar_dict[context.stock].mavg(5, frequency='day')# 同上,获取近二十日的收盘价均价,命名为 slow : slow = bar_dict[context.stock].mavg(30, frequency='day')
4 判断买卖条件:
获得均价数据之后,我们就可以进行一个判断决定是否买卖了:
iffast>slow:# 若快线在慢线之上则用所有现金买入该股票 #买入操作 eliffast<slow:# 若慢线在快线之上则清空所持股票 #卖出操作
在判断之前,我们还漏了一步,那是什么呢?就是要知道我们有多少现金,那么在程序中是如何获得现金的呢?我们使用以下代码
# 用法:变量 = context.portfolio.cashcash= context.portfolio.cash#取得当前的现金量,命名为 cash
延伸阅读: portfolio 中 包含所有的投资组合的信息,请参考文档 - Portfolio 对象
5 买入 /卖出:
在判定买卖的条件成立之后,我们会对股票进行买入或者卖出的操作:
#用法 order_value(股票代码,买卖金额) 金额为正则为买入,负数则为卖出#将所有现金买入 300059 东方财富order_value(context.stock, cash)#用法: order_target_value(股票代码,目标持仓比例) 比例在 1 与 0 之间#此处将持仓比例调整为 0 ,则等同于全部卖出order_target_percent(context.stock,0)
6 策略回测
以上,我们用几行代码就把策略的框架完整地搭建起来了,最终的完整代码为:
definit(context): #初始化 context.stock ="300059.XSHE" #存入要交易的股票代码defhandle_bar(context, bar_dict): #每日循环运行 #获取 30 日均线 slow = bar_dict[context.stock].mavg(30, frequency='day') #获取 5 日均线 fast = bar_dict[context.stock].mavg(5, frequency='day') cash = context.portfolio.cash #获取持有现金金额 iffast>slow: #判定买入条件 order_value(context.stock, cash) #买入目标股票 eliffast<slow: order_target_percent(context.stock,0) #卖出目标股票
写完了策略,那么我们接下去做什么呢? 先对我们的策略进行一次历史回测,看看它的历史表现是如何吧。
在策略编辑页面右上方,选择从 2015 年 1 月 4 日至 2016 年 10 月 4 日,用资金 10 万元进行日回测吧,请点击 运行回测
如代码没有问题,在数秒之后,我们就会拿到该策略的历史表现结果:
我们可以看到回测详情中有精致的图表,详细的各项风险收益指标、以及持仓、落单等详情辅助你进一步了解你的策略的表现。
到这里,一个完整的从 [构建策略思路] 到 [策略代码编写] 到 [回测结果检验] 的流程就结束了。
7 从日回测到分钟回测:
在循环部分, handle 函数根据选择的频率(日、分钟)循环运行,在以上的日回测中, handle 内的代码会每日被触发一次
defhandle(context, bar_dict):
如果是进行分钟回测或模拟实盘,那么这个 handle 里的代码就会被每分钟触发一次;
因此,我们的代码逻辑也势必要进行一定的改进,使得策略按照我们的逻辑正常地运行。
我们先把修改好的代码贴上来:
definit(context): context.stock ="300059.XSHE"# 每日开盘前运行一次,可以进行选股、设置参数等行为 defbefore_trading(context): # 设定并重置 context.fired 的值为 0 context.fired =0 #从回测的开始日期至结束日期,根据选择的频率(日、分钟)循环运行defhandle_bar(context, bar_dict): # 判定今日是否有下过单,若未下单则进行下列代码的操作 if(context.fired ==0): slow = bar_dict[context.stock].mavg(30, frequency='day') fast = bar_dict[context.stock].mavg(5, frequency='day') cash = context.portfolio.cash iffast>slow: order_value(context.stock, cash) eliffast < slow: order_target_percent(context.stock,0) # 设置 fired 等于 1 ,表示执行完毕 context.fired =1
可以看到这里改动并不多,
这里需要介绍到框架中常用到的函数 before_trading :
# 每日开盘前运行一次,可以进行选股、设置参数等行为 defbefore_trading(context):
我们在 before_trading 中设置一个变量命名为 fired ,赋值为 0
# 设定并重置 context.fired 的值为 0 context.fired =0
由于 before_trading 是每天开盘前运行一次,所以 context.fired 会被每天重置为 0
在 handle 函数中,我们加入了判断,如 context.fired 为 0 ,则继续执行下面的代码,否则本次循环结束。
# 判定今日是否有下过单,若未下单则进行下列代码的操作if(context.fired ==0):
并在执行完判断和买卖操作之后,设定 context.fired 的值等于 1 ,使得当日余下的分钟循环操作均被跳过。
# 设置 fired 等于 1 ,表示今天已下过单 context.fired =1
在完成以上代码后,我们开始进行分钟回测吧: 在策略编辑页面右上方,选择从 2015 年 1 月 4 日至 2016 年 10 月 4 日,用资金 10 万元进行分钟回测吧,请点击 运行回测
8 模拟交易:
模拟交易通过实时的分钟切片数据进行撮合,也就是 handle 函数会每分钟被触发一次循环。在开启你的策略的模拟交易之前,你必须要对它进行一次分钟回测,才可以开启模拟交易。 在上面分钟回测之后,你可以在策略回测详情页面点击 开启模拟交易。然后你将在模拟交易列表中看到进行中的策略。
9 开启微信通知,接收交易信号:
点击导航栏中的 [我的策略] ,可以在 [模拟交易] 一栏看到创建的模拟交易,如下图:
点击右边的微信通知开关,将 OFF 调至 ON ,并按照指示扫描二维码,绑定微信,就能通过微信接收交易信号了。
当该策略进行买卖操作,你的微信会收到类似下图的信号提醒。微信推送的延迟非常小,使得你能根据信号进行及时的下单操作。
是不是很轻松,数行代码就可以把你的出资战略成为代码,我们都来试试吧!
原文链接:http://www.magedu.com/71651.html
本文出自 “马哥Linux培训” 博客,请务必保留此出处http://mageedu.blog.51cto.com/4265610/1926413
以上是关于python的量化代码怎么用到股市中的主要内容,如果未能解决你的问题,请参考以下文章