前复权和不复权哪个真实,k线是看前复权还是不复权

  

  01   

  

  引言   

  

  很多喜欢量化的读者给我反馈。虽然掌握了Python的编程基础,但还是不知道如何切入股票的量化分析。首先,他们不熟悉如何获取股票数据。二是拿到股票数据后不知道如何做量化回测。其实微信官方账号已经分享了很多这方面的文章,可以作为参考模板,包括《【手把手教你】Python获取交易数据》,《【手把手教你】搭建自己的量化分析数据库》,《【手把手教你】Python面向对象编程入门及股票数据管理应用实例》;《手把手教你用Python搭建自己的量化回测框架【均值回归策略】》,《【手把手教你】用Python量化海龟交易法则》,《A股存在月份效应吗?构建月度择时策略【附Python源码】》,《北向资金能预示大盘涨跌?【附Python源码】》。量化回测的专业框架,请参考backtrader的系列文章(如【手把手教你】backtrader(一),入门量化回测最强神器)。目前微信官方账号的文章主要使用tusahre获取数据。其实Python中可用的数据采集API还有很多,如akshare、baostock、pandas_datareader(国内国外数据丰富,但外网接入无法连接)、alpha_vantage(国外)、quandl(国外)、yfinance(原雅虎财经,但外网接入无法连接)。非开源包括Windpy(风的付费插件)、常数hs_udata(恒生云)、聚宽JQData(试用)等。对于这些库或者数据API的详细介绍,可以直接去官网了解,这里不再赘述。本文主要介绍如何利用开源数据包获取数据并进行定量回测,从而实现代码输出最简单的专业分析图。   

  

  02   

  

  数据获取   

  

  下面分别针对四个流行的开源数据包,即tusahre、tushare pro、akshare和baostock,构造参数统一的数据采集函数,比较编程的复杂度和采集数据所需的时间。   

  

  先导入熊猫、matplotlib等常用包。   

  

  import pandas as PD import numpy as NP import matplotlib . py plot as PLT #从py lab导入mpl . RC params ' font . sans-serif '=' sim hei ' mpl . RC params ' axes . unicode _ MINUS '=false #不显示警告信息导入警告.过滤警告('忽略')   

  

  构建统一参数的数据采集函数,将恢复、开始和结束时间设置为默认参数。注意,tushare pro需要注册才能获得Token(https://tushare.pro/register?Reg=218422)只能使用,部分数据权限受积分限制。它的旧版本非常简单易用,但不再维护。Akshare相当于一个数据网站(如新浪财经、同花顺、东方财富等。)连接全网开放数据源的api。由于软件包更新,某些功能不可用。Basostock不需要注册,是免费的,但是函数调用有点麻烦。   

  

  #使用旧版tushare获取数据导入Tushare为ts def get _ from _ Tushare (code,adj=' HFQ ',start=' 2010-01-01 ',End=' 2021-11-05 ')3360 df=ts . get _ k _ data(code,autype start=start,End=End)df . index=PD . to _ datetime(df . date)#原始数据已经默认按日期排序。return df#使用tushare pro获取数据导入tushare as tstoken='输入自己的令牌' pro=ts . pro _ API(token)ts . set _ token(token)def get _ from _ tu share _ pro(code,adj=' HFQ ',start=' 2010-01-01 ',end=' 2021-11-05') 3360 # code3360输入一个数字字符串,例如,' 300002 ' #开始和结束输入'年-月-日'应进行转换以(' 6') 3360code=code '开头。sh' else3360code=code '。SZ“start=”。join (start.split end=' '。join(end . split('-'))df=ts . pro _ bar(ts _ code=code,adj=ad   

j,start_date=start,end_date=end) #原数据是倒序的,所以将时间设置为索引,根据索引重新排序 df.index=pd.to_datetime(df.trade_date) df=df.sort_index() return df#使用akshare获取数据,其数据源来自新浪,与tushare旧版本相似import akshare as akdef get_from_akshare(code,adj='hfq',start='2010-01-01',end='2021-11-05'): if code.startswith('6'): code='sh'+code else: code='sz'+code start=''.join(start.split('-')) end=''.join(end.split('-')) df = ak.stock_zh_a_daily(symbol=code, start_date=start, end_date=end, adjust=adj) return df#使用baostock获取数据import baostock as bsdef get_from_baostock(code,adj='hfq',start='2010-01-01',end='2021-11-05'): if code.startswith('6'): code='sh.'+code else: code='sz.'+code #转换复权为数字 if adj=='hfq': adj='1' elif adj=='qfq': adj='2' else: adj='3' #必须登陆和登出系统 bs.login() #登陆系统 rs = bs.query_history_k_data_plus(code, fields="date,code,open,high,low,close,volume", start_date=start, end_date=end, frequency="d", adjustflag=adj) #adjustflag:复权类型,默认不复权:3;1:后复权;2:前复权 data_list = <> while (rs.error_code == '0') & rs.next(): data_list.append(rs.get_row_data()) #将数据转为dataframe格式 df = pd.DataFrame(data_list, columns=rs.fields) df.index=pd.to_datetime(df.date) bs.logout() #登出系统 return df

  

下面分别使用这四个api接口获取数据并比较耗用时间,结果显示,tushare pro和akshare耗用时间均较短,获取‘300002’于2010.1-2021.11期间数据只需0.6-0.8秒,tushare旧版接口代码最简洁,但需1.05秒,而baostock则需1.6,当然结果会受网络状态影响。

  

func={'tushare':get_from_tushare, 'tushare pro':get_from_tushare_pro, 'akshare':get_from_akshare, 'baostock':get_from_baostock}#以个股神州泰岳为例code='300002'from time import timedata=pd.DataFrame()for name,f in func.items(): t0=time() data=f(code).close t1=time() print(f'{name}耗时:{t1-t0:.04f}秒')输出结果:
tushare耗时:1.0488秒
tushare pro耗时:0.6780秒
akshare耗时:0.7795秒
login success!
logout success!
baostock耗时:1.6439秒

  

比较四个api获取的“300002”后复权价格数据,结果显示四个接口得到的数据存在一些差别,其中tushare和baostock数据接近,二者与akshare差别较大,可能是计算方式存在差异。由于采用后复权,随着时间拉长,分红次数增加,差异越来越大。

  


  

data.tail()

  


  

(data<'tushare pro'>-data<'akshare'>).plot(figsize=(12,5),c='r');

  

  


  

03

  

策略回测

  


  

下面以tushare旧版接口为例,获取数据并基于技术指标进行量化回测。图中显示,“300002”的股价在2010.1.4-2021.11.5期间波动非常大,累计收益率-14.5%,年化收益率-1.4%,年化波动率53.8%,最大回撤高达89%,日VaR为-6.7%。换句话说,如果从2010年1月4日开始持有该股票,至2021年11月5日将亏损14.5%,但如果是在其最高点买入最大亏损为89%;当然,如果你是在2012年12月买入,持有到2015年6月21日,股价差不多增长了10倍。现实的情况往往是,大量股民像韭菜一样在股价不断波动的过程中被收割。

  


  

df=get_from_tushare('300002')df.close.plot(figsize=(12,6));plt.title('神州泰岳股价走势\n2010-2021',size=15)

  

  


  

import pyfolio as pfpf.create_simple_tear_sheet((df.close.pct_change()).fillna(0).tz_localize('UTC'))

  

  


  

  


  

下面以趋势指标ADX结合均线和MACD指标构建交易策略进行量化回测。ADX是一种常用的趋势衡量指标,指标值越大代表趋势越强,但指标本身无法告诉你趋势的发展方向,与均线和MACD指标配合运用,可以确认市场是否存在趋势,并衡量趋势的强度。下面以13、55、89日均线(斐波那契数列),MACD(12,26,9)和ADX(阈值设置为前值和25)指标为例,得到下列回测结果。

  


  

#技术分析包import talib as tadef adx_strategy(df,ma1=13,ma2=55,ma3=89,adx=25): #计算MACD和ADX指标 df<'EMA1'> = ta.EMA(df.close,ma1) df<'EMA2'> = ta.EMA(df.close,ma2) df<'EMA3'> = ta.EMA(df.close,ma3) df<'MACD'>,df<'MACDSignal'>,df<'MACDHist'> = ta.MACD(df.close,12,26,9) df<'ADX'> = ta.ADX(df.high,df.low,df.close,14) #设计买卖信号:21日均线大于42日均线且42日均线大于63日均线;ADX大于前值小于25;MACD大于前值 df<'Buy_Sig'> =(df<'EMA1'>>df<'EMA2'>)&(df<'EMA2'>>df<'EMA3'>)&(df<'ADX'><=adx)\ &(df<'ADX'>>df<'ADX'>.shift(1))&(df<'MACDHist'>>df<'MACDHist'>.shift(1)) df.loc = 1 df.loc = " " #避免最后三天内出现交易 df.Buy_Trade.iloc<-3:> = " " df.loc = df.close df.Buy_Price = df.Buy_Price.ffill() df<'Buy_Daily_Return'>= (df.close - df.Buy_Price)/df.Buy_Price df.loc = -1 df.loc = df.Buy_Daily_Return df.loc《df.Sell_Trade==-1》&(df.Buy_Daily_Return==0),'Buy_Total_Return'> = \ (df.Buy_Price - df.Buy_Price.shift(1))/df.Buy_Price.shift(1) df.loc《df.Sell_Trade==-1》&(df.Buy_Trade.shift(1)==1),'Buy_Total_Return'> = \ (df.close-df.Buy_Price.shift(2))/df.Buy_Price.shift(2) #返回策略的日收益率 return df.Buy_Total_Return.fillna(0)

  

回测结果显示,使用该交易策略可获得11.3%的年化收益率,累计收益率221.5%,最大回撤-24.2%,夏普比率0.63。使用策略后各项指标得到有效改善。

  


  

import pyfolio as pfpf.create_simple_tear_sheet(adx_strategy(df).tz_localize('UTC'))

  

  


  

04

  

结语

  


  

对于tushare、tushare pro、akshare、baostock开源数据api,本文构建了统一参数的数据获取函数,获取个股后复权数据并以技术指标ADX结合均线和MACD构建交易策略进行量化回测。本文旨在为大家利用开源数据进行量化分析提供一个思路和模板,各位读者可以在此基础上结合自身对市场的理解进行深入拓展。值得注意的是,文中提及的交易策略仅供学习参考,切勿直接拿来做真实交易。实际上,文中对‘300002’单个标的进行回测得到结果不代表该交易策略就有效,可能正好适合该股票和该段时间走势,任何基于技术指标的交易策略均具有一定的局限性,具体问题具体分析。

相关文章