金融量化交易,是时下最时髦的词。相对于人工股票,量化交易通过采集数据,定制交易策略,程序化执行,可以避免人工盯盘的辛劳,更能轻松解决人性中的很多牵绊对交易的影响,也是新一代股民的革命武器。很多人也因学习量化交易,学习了Python编程,学习了pandas数据分析,甚至学习了各种指标分析。
说到量化交易,不可避免的首先就是行情数据源的获取。虽然市面上各种量化平台众多,但大多聚焦于回测用的历史数据,实时行情数据要么需要付费,或者就需要在特定券商开户(一般有大资金量的要求)。那作为初入股市或者资金量不大的Python股民,就没有办法了吗?怎么会!这难不倒爱钻研的IT人。下面就说说几种常见的获取数据源是方式。
注:以下平台均基于Python,建议安装Anaconda,一次性解决Python及数据分析常用pandas,numpy等包,省去很多麻烦,这对初学者很重要。Anaconda是一个开源的Python发行版本,其包含了conda、Python等180多个科学包(数据分析用到的pandas)及其依赖项,下载地址https://www.anaconda.com/download/。
以下几种方法都可以实现对股票行情数据的提取,返回pandas数据格式,方便进行数据分析和加工。
Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工 到 数据存储的过程,能够为金融分析人员提供快速、整洁、和多样的便于分析的数据,为他们在数据获取方面极大地减轻工作量,使他们更加专注于策略和模型的研究与实现上。Pro版做了更大的改进。数据内容将扩大到包含股票、基金、期货、债券、外汇、行业大数据,同时包括了数字货币行情等区块链数据的全数据品类的金融大数据平台,为各类金融投资和研究人员提供适用的数据和工具。
方式1:pip install tushare --upgrade
使用国内源安装:
pip install tushare -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn --upgrade
https://github.com/waditu/tushare
Tushare :http://tushare.org/
Tushare Pro:https://tushare.pro/
AKShare 是基于 Python 的财经数据接口库,目的是实现对股票、期货、期权、基金、外汇、债券、指数、加密货币等金融产品的基本面数据、实时和历史行情数据、衍生数据从数据采集、数据清洗到数据落地的一套工具,主要用于学术研究目的。
AKShare 的特点是获取的是相对权威的财经数据网站公布的原始数据,通过利用原始数据进行各数据源之间的交叉验证,进而再加工,从而得出科学的结论。
AKShare 后续会基于学术论文和研究报告来添加更多数据接口和衍生指标,并提供相应的计算代码,敬请关注。
pip install akshare --upgrade
使用国内源安装:
pip install akshare -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com --upgrade
https://github.com/akfamily/akshare
证券宝www.baostock.com是一个免费、开源的证券数据平台(无需注册)。
提供大量准确、完整的证券历史行情数据、上市公司财务数据等。 通过python API获取证券数据信息,满足量化交易投资者、数量金融爱好者、计量经济从业者数据需求。
方式1:pip install baostock --upgrade
使用国内源安装:
pip install baostock -i https://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.tsinghua.edu.cn --upgrade
Ashare ( 开源 极简 A股实时行情数据API),项目库就一个文件Ashare.py,不用安装设置,可自由裁剪,随用随走 from Ashare import * 即可。
双内核封装,新浪财经,腾讯股票的实时行情数据,包括任意历史日线,周线,月线,分钟线,小时线等,已经稳定运行数年。双内核一主一备,自动热备,自动切换,Ashare即使用来做量化实盘行情源也可以满足。
从Github下载Ashare.py文件,复制到自己的项目目录下即可。
https://github.com/mpquant/Ashare
https://github.com/mpquant/Ashare
Pytdx一款纯Python语言开发的类似TradeX的行情数据接口的实现,虽然目前已不再维护,但其仍可以使用。
pip install pytdx --upgrade
https://github.com/rainx/pytdx(已不再维护)
https://rainx.gitbooks.io/pytdx/content/
因测试代码需要使用以上包,请提前使用pip语句进行安装;Ashare需要下载Ashare.py,并将其和测试代码放在同一目录。
另外,为了方便数据展示,需要调用prettytable包,请测试前提前安装,以免报错。安装语句如下:
pip install -U prettytable
(以提取300750代码,20210101~20220715,共371跟K线日线历史行情为例。耗时数据为单次结果,因涉及网速、数据列内容不一致,表格处理等,不具有统计意义,仅作参考,使用前请自行测试。)
import time
# ===============表格美化输出===============
def df_table(df,index):
import prettytable as pt
#利用prettytable对输出结果进行美化,index为索引列名:df_table(df,'market')
tb = pt.PrettyTable()
df = df.reset_index(drop = True)
tb.add_column(index,df.index)
for col in df.columns.values:#df.columns.values的意思是获取列的名称
tb.add_column(col, df[col])
print(tb)
# 测试计时开始,测试哪个就把if 后面的0改为1即可,其它改成0。
time1 = time.time()
print('开始提取数据')
if 0:
# 1.Tushare
import tushare as ts
pro = ts.pro_api('6a0899533f8a5996f738183dbdf63c0afb3fcc931f08e1233575a339')#token,请注册后替换为自己的token。
df = pro.daily(ts_code='300750.SZ', start_date='20210101', end_date='20220715')
print('Tushare行情获取\n',df)
# 单次提取股票数据耗时: 1.0941672325134277 秒
if 0:
# 2.AKshare
import akshare as ak
df = ak.stock_zh_a_hist(symbol="300750", period="daily", start_date="20210101", end_date='20220715', adjust="qfq")
print('AKshare行情获取\n',df)
# 单次提取股票数据耗时: 2.899998426437378 秒
if 0:
# baostock
import baostock as bs
import pandas as pd
lg = bs.login()
rs = bs.query_history_k_data_plus("sz.300750",
"date,code,open,high,low,close,preclose,volume,amount,adjustflag,turn,tradestatus,pctChg,isST",
start_date='2021-01-01', end_date='2022-07-15',
frequency="d", adjustflag="3")
data_list = []
while (rs.error_code == '0') & rs.next():
# 获取一条记录,将记录合并在一起
data_list.append(rs.get_row_data())
df = pd.DataFrame(data_list, columns=rs.fields)
bs.logout()
print('baostock行情获取\n',df)
# 单次提取股票数据耗时: 0.9699969291687012 秒
if 0:
# 4.Ashare
from Ashare import *
df=get_price('sz300750',frequency='1d',count=371) #默认获取今天往前5天的日线实时行情,count=371,表示获取371根K线。
print('Ashare行情获取\n',df)
# 单次提取股票数据耗时: 0.9399988651275635 秒
if 1:
# 5.Pytdx
from pytdx.hq import TdxHq_API
api = TdxHq_API()
# 数据获取接口一般返回list结构,如果需要转化为pandas Dataframe接口,可以使用 api.to_df 进行转化
with api.connect('119.147.212.81', 7709):
df = api.to_df(api.get_security_bars(9, 0, '300750', 0, 371))
print('pytdx行情获取\n',df)
# 单次提取股票数据耗时: 0.9504680633544922 秒
if __name__ == "__main__":
df_table(df,'行情')
time2 = time.time()
print("单次提取股票数据耗时:",time2-time1,'秒')