在众多金融数据接口中,我比较推荐使用tushare。传送门:Tushare大数据社区
1.tushare的优点:(1)接口方便。在数据接口界面,你只需按照界面要求输入参数,然后点勾打记自己想要的类别,即可一键式获取自己想要的数据。在数据输出界面,你还可以选择下方的“运行调试”(进行数据预检查),“生成代码”(在已经安装了pandas包的情况下,一键复制所给代码便可在编译器界面输出),“导出CSV”(生成数据文档)等等,功能完备且使用简单。下面我以获取紫光国微(002049.SZ)在2021年7月15日(国微转债【127038.SZ】上市第二天)至2021年10月4日期间的数据为例:
(2)部分数据免费。比如上面我们尝试获取的股票日线数据就是免费的。当然,如果是可转债数据或者股票分钟级据是需要一定积分的。不过相比于其他平台的收费数据而言tushare算是很好很好的了。对于我们当下进行的数据分析和低频策略实现来说,多花费百来块钱也就足够使用。
数据可视化:(基于jupyter) 1.数据分析预动作在pycharm界面,当需要在终端显示的数据过多时,为便于查看和显示,pycharm往往会用“…”将中间数据一略而过。这个时候,我们就可以固定添加以下代码,保证数据全部输出全部显示,其含义注解也一并附录在同一行代码后。
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
import pandas as pd
pd.set_option('display.max_colwidth', None) # 单位数据的宽度无限制
pd.set_option('display.max_columns', None) # 显示的列数量无限制
pd.set_option('display.width', None) # 以字符为单位的总显示宽度无限制
pd.set_option('display.max_rows', None) # 显示的行数量无限制
2.通过tushare接口获取数据
这个时候tushare接口的便利就进一步显现出来了,一方面是代码简洁易懂,另一方面更为重要的是数据质量高,不需要将大量精力用在无意义的数据清洗和数据规整上,偶有遇到一条数据缺失,还可以立即通过qq群反馈给管理员。
# 导入tushare
import tushare as ts # tushare包需要提前安装
# 初始化pro接口
pro = ts.pro_api('…………………………') # ‘……’中是你的接口TOKEN
# 拉取数据
data_stock = pro.daily(**{
"ts_code": "002049.SZ", # 这里是为了举例,用的是紫光国微的股票代码
"trade_date": "",
"start_date": 20210715, # 这里是为了举例,选取的是2021.7.15(国微转债上市第二天)至2021.10.4(实际交易日至2021.9.30)
"end_date": "",
"offset": "",
"limit": ""
}, fields=[
"ts_code",
"trade_date",
"open",
"high",
"low",
"close",
"pre_close",
"change",
"pct_chg",
"vol",
"amount"
])
至此,我们需要的数据就都保存在了data_stock变量里了。
3.调用matplotlib包进行数据可视化# 1.准备数据
x = data_stock.trade_date.iloc[::-1].reset_index(drop=True).values # 以trade_data作为图像的x轴
y1 = data_stock.open.iloc[::-1].reset_index(drop=True).values # 以open作为图像的y1
y2 = data_stock.close.iloc[::-1].reset_index(drop=True).values # 以close作为图像的y2
y3 = data_stock.high.iloc[::-1].reset_index(drop=True).values # 以high作为图像的y3
y4 = data_stock.low.iloc[::-1].reset_index(drop=True).values # 以low作为图像的y4
trade_date_string = []
for i in range(0, len(x)):
a = str(x[i])
a = a[0:4] + '-' + a[4:6] + '-' + a[6:8]
trade_date_string.append(a)
x = trade_date_string # 将原本所给的数值型时间转换为字符串型
# 2.创建画布
plt.figure(figsize=(15, 10), dpi=200)
# 3.绘制图像
plt.plot(x, y1, color='b', lw=3.0, label='开盘价')
plt.plot(x, y2, color='y', lw=3.0, label='收盘价')
plt.plot(x, y3, color='r', label='最高价')
plt.plot(x, y4, color='g', label='最低价')
plt.legend()
# 4.添加辅助层
plt.xlabel('交易时间', fontsize=15)
plt.ylabel('价格', fontsize=15)
xticks = []
for i in range(0, len(trade_date_string)):
if i % 1 == 0:
xticks.append(trade_date_string[i])
plt.xticks(xticks, rotation=60)
//这一段是获取当下时间并且给输出的图像添加标题
import time
today_date = time.strftime("%Y-%m-%d")
plt.title(f'紫光国微(002049)2021-07-15至{today_date}价格信息', fontsize=25)
//
plt.grid(linestyle='--', color='k')
# 4.x保存图像必须在显示图像之前
plt.savefig(f'紫光国微(002049)2021-07-15至{today_date}价格信息.jpg')
# 5.显示图像
plt.show()
这是最终输出的可视化结果:
4.采用相近方式输出国微转债的可视化代码如下:(注意所用的包pandas,matlplotlib,time均默认在上述代码中已经调用,所以未在代码中给出)
# 拉取数据
data_bond = pro.cb_daily(**{
"ts_code": "127038.SZ",
"trade_date": "",
"start_date": 20210715,
"end_date": "",
"limit": "",
"offset": ""
}, fields=[
"ts_code",
"trade_date",
"pre_close",
"open",
"high",
"low",
"close",
"change",
"pct_chg",
"vol",
"amount"
])
# 1.准备数据
x = data_bond.trade_date.iloc[::-1].reset_index(drop=True).values
y1 = data_bond.open.iloc[::-1].reset_index(drop=True).values
y2 = data_bond.close.iloc[::-1].reset_index(drop=True).values
y3 = data_bond.high.iloc[::-1].reset_index(drop=True).values
y4 = data_bond.low.iloc[::-1].reset_index(drop=True).values
trade_date_string = []
for i in range(0, len(x)):
a = str(x[i])
a = a[0:4] + '-' + a[4:6] + '-' + a[6:8]
trade_date_string.append(a)
x = trade_date_string
# 2.创建画布
plt.figure(figsize=(15, 10), dpi=200)
# 3.绘制图像
plt.plot(x, y1, color='b', lw=3.0, label='开盘价')
plt.plot(x, y2, color='y', lw=3.0, label='收盘价')
plt.plot(x, y3, color='r', label='最高价')
plt.plot(x, y4, color='g', label='最低价')
plt.legend()
# 4.添加辅助层
plt.xlabel('交易时间', fontsize=15)
plt.ylabel('价格', fontsize=15)
xticks = []
for i in range(0, len(trade_date_string)):
if i % 1 == 0:
xticks.append(trade_date_string[i])
plt.xticks(xticks, rotation=60)
plt.title(f'国微转债(127038)2021-07-15至{today_date}价格信息', fontsize=25)
plt.grid(linestyle='--', color='k')
# 4.x保存图像必须在显示图像之前
plt.savefig(f'国微转债(127038)2021-07-15至{today_date}价格信息.jpg')
# 5.显示图像
plt.show()
国微转债可视化输出结果:
数据简单分析:根据简单的金融知识,可转债的现价同对应股票的现价理应密切相关,否则就存在无风险套利的空间。我们选取2021.7.15至2021.9.30期间交易日时段,就紫光国微和国微转债每日涨跌额和涨跌幅的相关系进行分析,以印证我们的金融结论:
代码如下:
# 涨跌额的相关性分析 change_correlation = data_stock.change.corr(data_bond.change) change_correlation # 涨跌幅的相关性分析 pct_chg_correlation = data_stock.pct_chg.corr(data_bond.pct_chg) pct_chg_correlation
最终的输出结果:
0.7974622949949992 0.8089032989433472
根据简单的数学知识:如果两个变量的相关系数在0.8及以上,就可以认为这两个变量的相关性很强,从而印证了我们的金融结论。
总结:1.推荐使用tushare金融接口。但尽管tushare数据很规整,使用很方便,但还是建议每次进行大规模数据分析前对其中部分数据进行可视化分析。一方面可以规避极小概率出现的数据错误,另一方面也可以辅助自己的金融结论,从而为接下来的量化投资作铺垫。(毕竟是用真金白银上战争,怎么小心谨慎都不为过)
2.金融知识很重要。这不仅意味着在进行数据分析前部分结论已经心中有数,从而可以互相照应对比减小错误,更意味着在机器学习中的特征值上能有的放矢,加快投资策略的代码形成。
祝大家选取的股票天天涨!!!


