版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第12章实现量化交易策略Python数据分析与应用1CONTENTS12.1知识准备12.2任务介绍12.3代码演示12.4代码补全和知识拓展目录12.5实训任务2知识准备13在股票技术分析中经常会考虑复权的情形,以便于对股票价格走势进行更准确的分析判断。因为上市公司在经营过程中其价值会发生变化,同时会伴随进行股本价值的变化,比如由于送股、配股或转增资本等因素,会让公司的总股本增加,从而每股股价所代表的企业实际价值减少。比如除权当日,K线图形好像大跌一样,有明显的缺口位,但是投资者账户的资金是没有减少的。而进行复权就是消除这些指标的畸变。再比如一只股票在经过分红之后,因为每股的价值出现减少,所以在股价上也要做相应的减值。复权可以分为前复权和后复权。前复权、后复权量化交易起源于上世纪七十年代的股票市场,是指借助现代统计学和数学的方法,利用计算机技术来进行交易的证券投资方式。量化交易用数量模型验证及固化这些规律和策略,然后严格执行策略来指导投资,以求获得可以持续的、稳定且高于平均收益的超额回报。量化交易并没有一个精确的定义,广义上可以认为,凡是借助于数学模型和计算机实现的交易方法都可以称为量化交易。12.1.1量化交易简介股票的交易需要策略,而交易策略主要基于三个方面的信息:基本面、技术面和消息面,三个方面各有优缺点。市面上常见的交易策略类型可以分为趋势策略、量化对冲策略、套利策略和高频策略等。12.1.2量化交易策略知识准备任务介绍25本章任务要求选定一只股票用5日均线、20日均线实现均线交易策略,并且计算其在选定时间区间的收益率。任务介绍5日均线、20日均线交易策略:1)当5日均线上穿20日均线,买入。2)当5日均线下穿20日均线,卖出。比如选择上海证交所的浦发银行600000.SH,我们选取start_date='20180702',end_date='20190930'之间的数据,按照该均线交易策略进行交易,然后计算其收益率。代码演示372312代码演示从证券宝()网站下载数据,导入到pandas的DataFrame中备用。12.3.1读取数据1importbaostockasbs2importpandasaspd34####登陆系统####5lg=bs.login()6#显示登陆返回信息7print('loginresponderror_code:'+lg.error_code)8print('loginresponderror_msg:'+lg.error_msg)910####获取沪深A股历史K线数据####11#“分钟线”参数与“日线”参数不同。“分钟线”不包含指数。12#分钟线指标:date,time,code,open,high,low,close,volume,amount,adjustflag13#周月线指标:date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg14rs=bs.query_history_k_data_plus("sh.600000",15"date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",16start_date='2017-07-01',end_date='2017-12-31',17frequency="d",adjustflag="3")#frequency="d"取日k线,adjustflag="3"默认不复权18print('query_history_k_data_plusresponderror_code:'+rs.error_code)19print('query_history_k_data_plusresponderror_msg:'+rs.error_msg)2021####打印结果集####22data_list=[]23while(rs.error_code=='0')&rs.next():24#获取一条记录,将记录合并在一起25data_list.append(rs.get_row_data())26result=pd.DataFrame(data_list,columns=rs.fields)2728####结果集输出到csv文件####29result.to_csv("history_A_stock_k_data.csv",index=False)30print(result)3132####登出系统####33bs.logout()342312代码演示1#--------------------------------------------------------2#MyBaoStock类:用来获取前复权股票数据3#--------------------------------------------------------4importbaostockasbs5importpandasaspd678classMyBaoStock(object):910def__init__(self):11super().__init__()1213defget_stock_daily(self,ts_code,start_date,end_date):1415#如果股票代码格式和时间格式是tushare的,将其转换为baostock格式16#'600000.SH'->'sh.600000'17#'20180702'->'2018-07-02'18ifts_code[0].isdigit():19ts_code=ts_code[-2:].lower()+'.'+ts_code[0:6]20ifnot('-'instart_date):21start_date=start_date[0:4]+'-'+start_date[4:6]+'-'+start_date[6:]22ifnot('-'inend_date):23end_date=end_date[0:4]+'-'+end_date[4:6]+'-'+end_date[6:]2425####登陆系统####26lg=bs.login()27#显示登陆返回信息28print('loginresponderror_code:'+lg.error_code)29print('loginresponderror_msg:'+lg.error_msg)3012.3.2编写证券宝数据接口类Tushare是一个免费、开源的Python财经数据接口包,我们可以采用Tushare作为股票交易数据源,也可以采用证券宝作为数据源。接下来我们将证券宝提取股市数据的功能写成一个类的形式,方便今后随时调用。未完下页继续2312代码演示31####获取沪深A股历史K线数据####32#详细指标参数,参见“股票数据分析可视化”章节11.3.1;“分钟线”参数与“日线”参数不同。“分钟线”不包含指数。33#分钟线指标:date,time,code,open,high,low,close,volume,amount,adjustflag34#周月线指标:date,code,open,high,low,close,volume,amount,adjustflag,turn,pctChg35rs=bs.query_history_k_data_plus(ts_code,36"date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",37start_date=start_date,end_date=end_date,38frequency="d",adjustflag="2")#frequency="d"取日k线,adjustflag="3"默认不复权39#默认不复权:3;1:后复权;2:前复权。40print('query_history_k_data_plusresponderror_code:'+rs.error_code)41print('query_history_k_data_plusresponderror_msg:'+rs.error_msg)4243####打印结果集####44data_list=[]45while(rs.error_code=='0')&rs.next():46#获取一条记录,将记录合并在一起47data_list.append(rs.get_row_data())48df=pd.DataFrame(data_list,columns=rs.fields)4950#为保持和tushare数据兼容,修改数据列名称51df.rename(52columns={'date':'trade_date','code':'ts_code','volume':'vol'},53inplace=True)54#为保持和tushare数据兼容,修改数据列数据类型从str到float55df['close']=df['close'].astype('float')56df['open']=df['open'].astype('float')57df['high']=df['high'].astype('float')58df['low']=df['low'].astype('float')59####结果集输出到csv文件####60#df.to_csv("history_A_stock_k_data.csv",index=False)61#print(df)6263####登出系统####64bs.logout()6566returndf6712.3.2编写证券宝数据接口类(续)2312代码演示12.3.3移动平均线交易策略(1)stock['ma5-20']=stock['ma5']-stock['ma20']#求差值stock['diff']=np.sign(stock['ma5-20’]) #取得差值的符号#绘制在图形上,图形上下边界为ylime从-2到2,#直线颜色color是黑色,线宽linewidth=2(图12-4)stock['diff'].plot(ylim=(-2,2)).axhline(y=0,color='black',lw=2)我们发现5日均线与K线图较为接近,而20日均线则更平坦,可见20日移动平均线具有抹平短期波动的作用,更能反映中长期的走势。比较5日均线和20日均线,特别是关注它们的交叉点,这些是交易的时机。移动平均线策略中最简单的方式就是:当5日均线从下方超越20日均线时,买入股票,当5日均线从上方跌落到20日均线之下时,卖出股票。为了找出交易的时机,我们计算5日均价和20日均价的差值,并取其正负号,作于下图。当图中水平线出现跳跃的时候就是交易时机。图12-4差值的符号(5日均线与20日均线求差)示意图2312代码演示12.3.3移动平均线交易策略(2)#当日与前一日相减,再取其符号作为交易信号(图12-5)stock['signal']=np.sign(stock['diff']-stock['diff'].shift(1))stock['signal'].plot(ylim=(-2,2))为了更方便观察,上述计算得到的均价差值,再取其相邻日期的差值,得到信号指标。当信号为1时,表示买入股票;当信号为-1时,表示卖出股票;当信号为0时,不进行任何操作。图12-5继续计算得到交易信号代码补全和知识拓展413231212.4.1代码补全(可以采用两种不同的写法来补全)我们尝试用刚才编写完成的证券宝类MyBaoStock来尝试提取数据,首先为了方便识别,我们将包含该类的文件名更名为mybaostock.py,然后在文件中可以通过importmybaostock来提取数据。1#代码补全2#--------------------------------------------------------3importpandasaspd4(__________)5(__________)6stock_code='600000.SH'7#读取数据8df=(__________).get_stock_daily(ts_code=stock_code,start_date='20180702',end_date='20190930')9df=df.loc[:,['trade_date','open','high','low','close','vol']]#选取需要的列10df.rename(11columns={'trade_date':'Date','open':'Open','high':'High',12'low':'Low','close':'Close','vol':'Volume'},13inplace=True)#把小写改首字母大写14#改变时间次序15df['Date']=pd.to_datetime(df['Date'])#转换日期列的格式,便于作图16df.set_index(['Date'],inplace=True)#将日期列作为行索引17df=df.sort_index()#倒序,因为Tushare的数据是最近的交易日数据显示在DataFrame上方,倒序后方能保证作图时X轴从左到右时间序列递增。18print(df.head())19print(())231212.4.2知识拓展:通过alphavantage获取股票交易数据假设我们想要获得万科(000002.SHZ)股票的交易数据,可以参考下面的代码进行获取。其中key.txt保存有我们通过注册免费获取的APIKey。有兴趣的用户可以通过其官方网站索取AlphaVantageStockAPI©的免费密钥,终身使用。申请时建议使用合法的电子邮件地址,一旦丢失了API密钥,可以通过邮件找回。1fromalpha_vantage.timeseriesimportTimeSeries2importmatplotlib.pyplotasplt3importseabornassns45symbol='000002.SHZ'6api_key=open('key.txt').read()#os.environ['AV-Key']7ts=TimeSeries(key=api_key,output_format='pandas')8#outputsize='full'ornot,ifnotthenoneyearbackdata9data,metadata=ts.get_daily_adjusted(symbol,outputsize='full')10#print(metadata)11print()12sns.set_style('darkgrid')13sns.set_context('notebook')14data.describe()15data['4.close'].plot(figsize=(10,8))16plt.show()实训任务:Tushare数据演示移动平均线交易策略51612.5.1实训任务一获得均线量化交易策略的交易信号1#任务一:生成交易信号2#--------------------------------------------------------3importnumpyasnp4importpandasaspd5importmatplotlib.pyplotasplt6importmybaostockasmbs78stock_code='600000.SH'910#读取数据11df=mbs.MyBaoStock().get_stock_daily(ts_code=stock_code,start_date='20180702',end_date='20190930')12df=df.loc[:,['trade_date','open','high','low','close','vol']]#选取需要的列13df.rename(14columns={'trade_date':'Date','open':'Open','high':'High',15'low':'Low','close':'Close','vol':'Volume'},16inplace=True)#把小写改首字母大写17#改变时间次序18df['Date']=pd.to_datetime(df['Date'])#转换日期列的格式,便于作图19df.set_index(['Date'],inplace=True)#将日期列作为行索引20df=df.sort_index()#倒序,因为Tushare的数据是最近的交易日数据显示在DataFrame上方,倒序后方能保证作图时X轴从左到右时间序列递增。2122#计算23stock=df24stock["ma5"]=np.round(stock['Close'].rolling(window=5,center=False).mean(),2)25stock["ma20"]=np.round(stock['Close'].rolling(window=20,center=False).mean(),2)2627importmatplotlibasmpl28通过下述代码可以获得交易信号12.5.1实训任务一获得均线量化交易策略的交易信号29mpl.use('TkAgg')30#我们发现5日均线与K线图较为接近,而20日均线则更平坦,可见移动平均线具有抹平短期波动的作用,更能反映长期的走势。31#比较5日均线和20日均线,特别是关注它们的交叉点,这些是交易的时机。移动平均线策略,最简单的方式就是:32#当5日均线从下方超越20日均线时,买入股票,当5日均线从上方越到20日均线之下时,卖出股票。33(__________)34plt.show()35#为了更方便观察,上述计算得到的均价差值,再取其相邻日期的差值,得到信号指标。36#当信号为1时,表示买入股票;当信号为-1时,表示卖出股票;当信号为0时,不进行任何操作。37(__________)38plt.show()39#计算在该时间区间内,经过该交易策略的收益率40trade=pd.concat([41pd.DataFrame({"price":stock.loc[stock["signal"]==1,"Close"],42"operation":"Buy"}),43pd.DataFrame({"price":stock.loc[stock["signal"]==-1,"Close"],44"operation":"Sell"})45])4647trade.sort_index(inplace=True)48print(trade)49通过下述代码可以获得交易信号12.5.2实训任务二模拟回测交易计算量化策略的收益率(1)1#任务二:根据交易信号,进行交易并计算该策略的收益。2#--------------------------------------------------------3importnumpyasnp4importpandasaspd5importmatplotlib.pyplotasplt6importmybaostockasmbs78stock_code='600000.SH'910#读取数据11df=mbs.MyBaoStock().get_stock_daily(ts_code=stock_code,start_date='20180702',end_date='20190930')12df=df.loc[:,['trade_date','open','high','low','close','vol']]#选取需要的列13df.rename(14columns={'trade_date':'Date','open':'Open','high':'High',15'low':'Low','close':'Close','vol':'Volume'},16inplace=True)#把小写改首字母大写17#改变时间次序18df['Date']=pd.to_datetime(df['Date'])#转换日期列的格式,便于作图19df.set_index(['Date'],inplace=True)#将日期列作为行索引20df=df.sort_index()#倒序,因为Tushare的数据是最近的交易日数据显示在DataFrame上方,倒序后方能保证作图时X轴从左到右时间序列递增。2122#计算23stock=df24stock["ma5"]=np.round(stock['Close'].rolling(window=5,center=False).mean(),2)25stock["ma20"]=np.round(stock['Close'].rolling(window=20,center=False).mean(),2)26通过下述代码可以模拟回测交易,并计算打印量化策略的收益率。27importmatplotlibasmpl2829mpl.use('TkAgg')30#我们发现5日均线与K线图较为接近,而20日均线则更平坦,可见移动平均线具有抹平短期波动的作用,更能反映长期的走势。31#比较5日均线和20日均线,特别是关注它们的交叉点,这些是交易的时机。移动平均线策略,最简单的方式就是:32#当5日均线从下方超越20日均线时,买入股票,当5日均线从上方越到20日均线之下时,卖出股票。33stock['ma5-20']=stock['ma5']-stock['ma20']34stock['diff']=np.sign(stock['ma5-20'])#取得符号35stock['diff'].plot(ylim=(-2,2)).axhline(y=0,color='black',lw=2)#lw:linewidth36plt.show()37#为了更方便观察,上述计算得到的均价差值,再取其相邻日期的差值,得到信号指标。38#当信号为1时,表示买入股票;当信号为-1时,表示卖出股票;当信号为0时,不进行任何操作。39stock['signal']=np.sign(stock['diff']-stock['diff'].shift(1))40stock['signal'].plot(ylim=(-2,2))41plt.show()42#计算在该时间区间内,经过该交易策略的收益率43trade=pd.concat([44pd.DataFrame({"price":stock.loc[stock["signal"]==1,"Close"],45"operation":"Buy"}),46pd.DataFrame({"price":stock.loc[stock["signal"]==-1,"Close"],47"operation":"Sell"})48])4950trade.sort_index(inplace=True)51print(trade)通过下述代码可以模拟回测交易,并计算打印量化策略的收益率。12.5.2实训任务二模拟回测交易计算量化策略的收益率(2)52#buys=pd.DataFrame(trade.loc[trade['operation']=='Buy','price'])53#print(buys.index.min())54#price1=buys.loc[buys.index.min(),'price']55tradevol=100#每次交易一手56iftrade.loc[trade.index.min(),'operation']=='Buy':57account_cash=begin_cash=10000.058account
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广东佛山南海区丹灶镇仙湖幼儿园招聘备考题库(含答案详解)
- 20206中国烟草南通醋酸纤维有限公司招聘备考题库附参考答案详解(达标题)
- 2026北京市政路桥股份有限公司招聘26人备考题库【研优卷】附答案详解
- 2026湖南永州市双牌县融媒体中心(双牌县广播电视台)招聘1人备考题库附答案详解【满分必刷】
- 2026江苏南京大学南京赫尔辛基大气与地球系统科学学院准聘长聘教师岗位(事业编制)招聘备考题库(名校卷)附答案详解
- 中国通信服务广东公司2026届春季校园招聘备考题库及答案详解【有一套】
- 2026河北保定市消防救援支队次政府专职消防员招录154人备考题库含完整答案详解(历年真题)
- 2026恒丰银行总行实习生招收备考题库及参考答案详解【满分必刷】
- 2026浙江台州市中医院招聘120驾驶员编外人员1人备考题库含答案详解(模拟题)
- 2026西藏阿里地区日土县审计局招聘3名备考题库(模拟题)附答案详解
- 2025年院感试题及参考答案
- 药厂卫生管理知识培训课件
- 2025国家义务教育质量监测小学德育测评估考试试题库及答案
- 2026届江苏省南京市鼓楼区重点达标名校中考联考语文试题含解析
- 肠梗阻护理个案病例汇报
- 高血压糖尿病的护理问题和措施
- 施工项目管理制度
- 公路处安全培训课件
- BIM技术在城市绿化项目中的应用
- 隧道突水突泥风险评估与防控技术
- 建筑设计策略分享
评论
0/150
提交评论