01 引言

不少喜欢量化的读者向我反馈,虽然已经掌握了Python的编程基础,但仍不知道如何切入到股票量化分析上,一是对如何获取股票数据还不太熟悉;二是拿到股票数据后不知道怎么做量化回测。实际上公众号分享了很多这方面的文章,可以作为参考模板。目前公众号文章主要是以tusahre来获取数据,实际上Python可用的获取数据api还是很多的,如开源的有akshare、baostock、pandas_datareader(国内外数据丰富,但外网访问常连接不上)、alpha_vantage(国外)、quandl(国外)、yfinance(原雅虎财经,外网访问常连接不上);非开源的有WindPy(Wind付费插件)、恒有数hs_udata(恒生云)、聚宽JQData(可试用)等等。关于这些库或数据api的详细介绍大家可以直接百度进入官网了解,此处不做进一步展开,本文主要介绍如何使用开源数据包获取数据并进行量化回测,实现最简单的代码输出专业的分析图表。

02 数据获取

下面分别对tusahre、tushare pro、akshare和baostock四个当前较流行的开源数据包构建统一参数的数据获取函数,比较程序编写的复杂程度和获取数据所需时间。

先导入pandas、matplotlib等常用包。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
#不显示警告信息
import warnings
warnings.filterwarnings('ignore')

构建统一参数的数据获取函数,复权、起始和结束时间设置为默认参数,注意tushare pro需要注册获取token(https://tushare.pro/register?reg=218422)才能使用,某些数据权限受积分限制,其旧版非常接口简洁好用但不再维护。akshare相当于连接全网开放数据源api的数据网站(如新浪财经、同花顺、东方财富等),某些函数由于包更新不可用。basostock无需注册且免费,但函数调用稍显麻烦。

#使用tushare旧版获取数据
import tushare as ts
def get_from_tushare(code,adj='hfq',start='2010-01-01',end='2021-11-05'):df=ts.get_k_data(code,autype=adj,start=start,end=end)df.index=pd.to_datetime(df.date)#原数据已默认按日期进行了排序return df#使用tushare pro获取数据
import tushare as ts
token='输入你自己的token'
pro=ts.pro_api(token)
ts.set_token(token)
def get_from_tushare_pro(code,adj='hfq',start='2010-01-01',end='2021-11-05'):#code:输入数字字符串,如‘300002’#start和end输入'年-月-日'需转为'年月日'格式if code.startswith('6'):code=code+'.SH'else:code=code+'.SZ'start=''.join(start.split('-'))end=''.join(end.split('-'))df=ts.pro_bar(ts_code=code,adj=adj,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 ak
def get_from_akshare(code,adj='hfq',start='2010-01-01',end='2021-11-05'):if code.startswith('6'):code='sh'+codeelse:code='sz'+codestart=''.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 bs
def get_from_baostock(code,adj='hfq',start='2010-01-01',end='2021-11-05'):if code.startswith('6'):code='sh.'+codeelse: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 time
data=pd.DataFrame()
for name,f in func.items():t0=time()data[name]=f(code).closet1=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 pf
pf.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 ta
def 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[df.Buy_Sig,'Buy_Trade'] = 1df.loc[df.Buy_Trade.shift(1)==1,'Buy_Trade'] = " "#避免最后三天内出现交易df.Buy_Trade.iloc[-3:]  = " " df.loc[df.Buy_Trade==1,'Buy_Price'] = df.closedf.Buy_Price = df.Buy_Price.ffill()df['Buy_Daily_Return']= (df.close - df.Buy_Price)/df.Buy_Pricedf.loc[df.Buy_Trade.shift(3)==1,'Sell_Trade'] = -1df.loc[df.Sell_Trade==-1,'Buy_Total_Return'] = df.Buy_Daily_Returndf.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 pf
pf.create_simple_tear_sheet(adx_strategy(df).tz_localize('UTC'))

04

结语

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

关于Python金融量化

专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取30多g的量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、量化投资前沿分析框架,与博主直接交流、结识圈内朋友等。加星球前可先加个人sky2blue2(Healer),私信优惠。

【手把手教你】获取股票数据并进行量化回测——基于ADX和MACD趋势策略相关推荐

  1. 手把手教你用Python搭建自己的量化回测框架【均值回归策略】

    1 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的,交易将无利可图.均值回归是金融学的一个重要概念,指股票价格无 ...

  2. python回测函数_【手把手教你】动量指标的Python量化回测

    我认为投资专业的学生只需要两门教授得当的课堂:如何评估一家公司,以及如何考虑市场价格.--巴菲特 01 引言 本文延续"手把手教你使用Python的TA-Lib"系列,以资金流量指 ...

  3. backtrader股票技术指标自定义与量化回测

    01 引言 股票市场自交易以来,人们就开始孜孜不倦地探索各种各样的投资理论,其中技术分析是重要的理论之一.实际上,技术分析是100多年前创建的股票投资理论,是投资者对股票量价变化长期观察归纳总结的若干 ...

  4. 手把手教你完成一个数据科学小项目(7):经纬度获取与BDP可视化

    前言 请先阅读"中国年轻人正带领国家走向危机",这锅背是不背? 一文,以对"手把手教你完成一个数据科学小项目"系列有个全局性的了解. 本系列代码统一开源在Git ...

  5. 手把手教-网络时空大数据爬取与分析DAS系统(瓦片地图获取)

    手把手教 | 网络时空大数据爬取与分析DAS系统(瓦片地图获取) 原创 DAS Team 双评价DAS 地理计算语言,为大众赋能地理智慧. --DAS Team 爬取分析DAS系统下载 地址: htt ...

  6. 价值十万的代码之二——手把手教你获取数据篇

    我们要利用个股研报数据,肯定是会结合个股行情数据的,所以首先要获取股票数据,本篇我跟大家分享一下我是如何获取个股行情数据的. 选定目标 现在获取股票行情数据的渠道有好多,比较正规的途径就是各种量化平台 ...

  7. 【手把手教你】股票可视化分析之Pyecharts(二)

    01 引言 Pyechartss 是基于Echarts 的开源可视化库,可以制作非常精美的图表.公众号推文<[手把手教你]股票可视化分析之Pyecharts(一)>,以股票交易数据为例,为 ...

  8. python tushare获取股票数据_Python 金融: TuShare API 获取股票数据 (1)

    多多教Python 金融 是我为金融同行,自由职业投资人 做的一个专栏.这里包含了我自己作为量化交易员,在做研究时所用到的Python技巧和实用案例.这个栏目专业性会比较强:本人29岁,量化工作5年的 ...

  9. Nature综述:手把手教你分析菌群数据

    本文转载自"热心肠先生",己获授权. 导读 自然微生物综述(2017 IF:31.851)于2018年5月23日在线发表了Rob Knight亲自撰写(一作兼通讯)的微生物组领域研 ...

最新文章

  1. html显示yuv,CS50 HTML和CSS基础(介绍最简单的HTML和CSS)
  2. mysql tinyint和char(1)性能对比
  3. 【Linux网络编程】TCP编程
  4. 拥抱云原生,Fluid结合JindoFS :阿里云OSS加速利器
  5. 微赞dataconfig.php,php生成微信jssdk wx.config参数,调用js接口
  6. 事件循环中的宏任务和微任务执行顺序
  7. W-3 用grub4dos安装Windows7、Ubuntu 12.10双系统(图解)
  8. 计算机在工程制图上的应用,浅析计算机软件在工程制图中的应用
  9. Tushare使用教程
  10. linux sed 多个条件,sed多条件匹配
  11. Android网络请求三篇
  12. 计算View中的子View在View的superview中的坐标
  13. gtx660 linux驱动下载,佳能 NVIDIA GeForce GTX660 GPU 驱动程序下载-更新佳能软件(显卡)...
  14. 计算机能使用硬盘吗,旧电脑的硬盘能直接插在新电脑上用吗?
  15. vue2 provide和inject的使用
  16. 央视主持人都在用的无限领夹麦克风快充方案
  17. 装饰模式--私人定制冬装夏装
  18. Zhong__PyCharm配置豆瓣源提升插件、依赖安装速度
  19. 帕斯卡分布/负二项分布
  20. varbinary转换成字符串

热门文章

  1. 一个单身程序员的新年寄语
  2. Django无法显示图片
  3. C++ 多态(补充)
  4. 《淘宝店铺营销推广一册通》一1.1 什么是网店推广
  5. 大数据对人们的好处_大数据对我们有什么作用呢?
  6. android alarmmanager后台,Android各版本AlarmManager使用
  7. 决策树鸢尾花算法讲解
  8. End-to-End Entity Resolution for Big Data: A Survey Matching部分学习笔记
  9. android 获取多个控件,Android----获取activity上所有的控件
  10. 利用搜搜的问问做外链小技巧