本节目录:
1、前沿介绍
2、各软件的使用比较
3、变成环境的搭建
4、集成开发环境的介绍(IDE)
5、python常用库的介绍
5.1、numpy
5.2、scipy
5.3、pandas
6、可视化分析
6.1、实时行情,历史行情,Tick行情,公司公告,股指行情获取(接口介绍)
6.2、K线图、折线图、散点图、条形图、直方图、饼图、函数图、热力图、可交互K线图
-----------------------------------前沿介绍--------------------------------------
量化投资基本概念:凡是借助于数学模型和计算机实现的投资方法都可以成为量化投资,多因子策略,期货CTA策略,套利策略和高频交易策略。
量化策略分为4个维度:直觉接收,直觉决策——阅读新闻感知投资者情绪进行决策;
直觉接收。量化决策——抓取网络文本,建立模型进行决策;
量化接收,直觉决策——研究财报数据,根据直觉经验进行投资决策;
量化接收,量化决策——通过统计分析,建立多因子模型,进行投资决策。
量化投资决策最大特点就是:具有一套基于数据的完整交易规则,客观的量化标准,一旦确定必须严格遵守。
量化决策的优势:客观性;大数据;响应快。高频交易以微秒进行计算交易。只需要一套代码就可以同时对全市场5000多只股票进行分析,受人为因素影响很小。
但没有一种策略时可以持续赚钱的,即使夏普比率很高的高频交易策略也会面临政策的不确定性,那么这样的交易策略也就不可能获得极高的收益了。
量化投资AI并不是一切,因为算法交易只是优化问题,而真正市场上交易是预测问题,在这一点上AI是无法做到的。
本篇会涉及到多种语言,MATLAB和R主要用于业务层面的研究工作;C++和Java主要用于系统搭建工作;python作为胶水语言,实用性非常强,非常广,可以同时完成淑芬和系统搭建工作,性能和效率有着非常好的平衡。
------------------------------各软件的使用比较-----------------------------------
MATLAB在Wlnd量化接口中是使用频率最高的,python是使用速度增长最快的,MATLAB功能强大,可靠性高,但授权费用较贵,在网络爬虫和交易系统存在缺陷。
R是一款开源数分软件,有时间序列分析,贝叶斯模型,机器学习,经典统计模型,也有量化相关的库(quantmod),但对于大量数据的处理,R显得有些力不从心,更适合做研究,不适合做底层的系统开发。
C++杜甫快,响应及时,但语言偏底层,开发难度高,对于数据分析还不是很方便。
python是一种脚本语言,可直接运行,面向对象的编程,相关库再进行优化后,速度慢不了多少,而且拥有优秀的量化、数分、机器学习ML工具,可以用python构建一条完整的量化投资生产线。
不可否认:R的统计库,MATLAB的科学计算,SAS的可靠性,C++的高速交易系统要比python强,但这也只是95分和90分的区别。
选择python的原因:基本全能;丰富的开源项目;AI时代的头牌语言。
后续我是基于windows11,python3.8.7进行开发,不过搭建系统在Windows、Linux、苹果OS X都可以进行搭建,根据自身偏好进行选择。
考虑到部分库的兼容性,建议同时安装python2.7和python3.8版本。
------------------------------变成环境的搭建-----------------------------------
编程环境目前网上大部分基于爬虫分析师进行搭建的,到最后越使用就越不顺手,环境搭建主要包括两部分:python底层库 + 集成开发环境(IDE),这里主要针对量化投资介绍python编程环境搭建。
首先一定要到官网下载Anaconda,Anaconda是python与第三方库的一个大集合,囊括了数分领域大部分库,也包含了常用的开发环境,比如:spyder;jupyter Notebook等;Anaconda安装直接到官网下载软件安装即可,注意安装位置最好指定一下,后续方便找到文件夹,此外在安装时选择将py添加到PATH路径中,方便后续开发。
比如:安装位置我的是:C:\Users\59980\conda3;便于后文阐述,安装位置统一默认为我的位置。 其他的如果不指定,安装的默认位置一般会是appdata,很难找到。
查询PATH路径(环境变量)可以打开命令行:输入sysdm.cpl进行查询。
接下来就需要手动安装比较流行的数据库接口了:Tushare、PostgreSQL数据库接口psycopg2等,可以用pip方式进行安装,也可以用conda管理器进行安装。
1、conda管理器安装: 在“开始”菜单里面或搜索框输入:
anaconda prompt
或找到anaconda prompt 点击进入;
使用命令:
conda search psycopg2
查找对应源;
搜索到后就可以使用:
conda install -c anaconda psycopg2
进行安装;有时候有需要更新的提醒,输入y即可。
2、用pip进行安装,查看自己的python版本,确认安装的版本正确,输入:
pip install psycopg2
安装成功提示:
需要注意的是,如果安装了多个anaconda版本用pip可能会出现问题,手动进入对应的anaconda目录下进行安装就没有问题,具体如下:
cd conda3 #可能是cd d:/conda3
cd scripts
pip install tushare
查看python对应的版本直接输入python即可就可以看到:
安装好后:
Tushare目前在日行情上可能有使用限制,在分钟或高频行情一定存在使用限制,建议安装akshare库,该库也是常用的获取行情的数据库接口。
------------------------------集成开发环境的介绍(IDE)-----------------------------------
Anaconda自带了jupyter notebook 和spyder两种开发环境。
1、jupyter notebook是一个交互式笔记本,本质是一种web应用程序,支持实时代码、数学方程、可视化和markdown,使用的最大好处是可以将文字和公式混合排版在一起,将结果一起发送给别人。
2、spyder对于之前使用MATLAB的人来说很可能会更加熟悉,也适合做数据分析。
3、Vscode是一款轻量级的IDE,方便进行系统开发,包含了一些数据分析插件,也是越来完善。
4、pycharn是一款重量级python IDE,很多功能都是专门针对python进行开发的,pycharm分为免费版和收费版,pycharm需要制定python核心组件才能运行,也就是python解释器(编译器),可手动添加:菜单——file——settings——build execution deployment——console——python console——python interpreter 中进行指定python版本和运行程序。
在这里后续都将用Vscode做比较复杂的系统开发和数据分析。
Vscode界面如下:
------------------------------python常用库的介绍-----------------------------------
python由于是开源的,各种接口和库相对较多,函数也比较丰富,实现功能不确定是否单一针对性,如绘制散点图可以用matplotlib或seaborn实现,回测可以用zipline或PyAlgoTrade实现。
下面主要针对主要基础库进行简单介绍:
1、numpy(numerical python)是高性能科学计算和数据分析的基础包,是所有高级计算的基础组件,部分功能如下:
ndarray:具有矢量算术运算的多维数组。
无需循环可以对整租数据进行快速运算。
包含读写工具和内存映射工具,拥有C语言的API,可以相互传递数据。
具有线性代数、随机数生成、傅里叶变换等功能,集成C++、C、fortran等语言编写的工具。
如:
import numpy as np
a = np.arange(10)
print(type(a))
print(a)
print(a.dtype)
print(a.shape)
#创建多维数据
a = np.array([np.arange(4) , np.arange(4)])
print(a)
print(a.dtype)
print(a.shape)
引用元素可以用下标引用,也可以用切片引用,还可用步长引用,还可以翻转数组:
a = np.array([np.arange(1,5) , np.arange(5,9)]) # 左开右闭
print(a)
print(a[1,1]) # 索引访问
print(a[1,0])
a = np.arange(10)
print(a[4:7]) # 切片
print(a[::2]) # 步长切片
print(a[::-1]) # 翻转
2、Scipy是基于numpy的,提供了线性代数、优化、积分、插值、信号处理等功能。
如读写matlab文件,Scipy.io提供了导入导出.mat接口,使得python和matlab协同工作非常容易。
读写matlab文件:
from scipy import io as spio
import numpy as np
a = np.arange(10)
spio.savemat('a.mat' , {'a':a}) # 保存matlab文件
data = spio.loadmat('a.mat',struct_as_record = True) # 读取matlab文件
data['a']
线性代数计算:
from scipy import linalg
a = np.array([[1,2] , [3,5]])
linalg.det(a) # 线性代数计算
优化拟合:
from scipy import optimize
import numpy as np
import matplotlib.pyplot as plt
def f(x):
return x**2 + 20*np.sin(x)
x = np.arange(-10,10,0.1)
plt.plot(x,f(x))
计算最小值是对应的x值:(穷举法)
grid = (-10,10,0.1)
x_min = optimize.brute(f,(grid,))
x_min
遇到不懂得函数直接右键转到定义:
不过也提供了模拟退火等优化算法,后续会讲到。
3、pandas具有numpy和ndarray所不具有的很多功能,处理缺失数据、集成时间序列、按轴对齐数据等常用功能。pandas主要接触DataFrame 和series 两种。
DataFrame本身有行索引和列索引,使用上没有区别,创建数据框DataFrame很容易:
import pandas as pd
df = {'a':[1,2,3] ,'b':['q','w','e'] , 'c':[10]} # 创建字典
data = pd.DataFrame(df , index = ['1','2','3']) # 转换成数据框
print(data)
data.index #获取行索引
pandas中使用频率最高的就是:数据;索引;列标签。
获取行索引:
data.index
获取列索引:
data.columns
data = pd.DataFrame(columns = ['1','2','3']) # 生成指定列名的数据框
data
df = pd.DataFrame(columns=['a', 'b', 'c'], index=range(4)) # 生成指定列名、特定长度的空数据框
df
生成新列:
data['D']=8
data
会自动填充一样的长度。
删除指定列:
del data['D']
data
添加行可以用append或指定行索引添加:
目前好像没有了DataFrame的append方法。只能用索引添加:
df = {'a':[1,2,3] ,'b':['q','w','e'] , 'c':[10]}
data = pd.DataFrame(df , index = ['1','2','3'])
print(data)
data.loc['e'] = [2,4,5]
data
将数据框转换成字典列表,用item遍历每个元素:
data_list = yield_data_a.to_dict('records') # yield_data_a是数据框名称,'records'表示每次按行转换
for item in data_list: # 就可以实现遍历每个元素了,遍历结果为 item['列名']
数据框的合并:
df1= pd.DataFrame([1,2,3,4],index=['1',2,'3','e'],columns=['f'])
data=data.join(df1)
data
索引为字符型,因此不是字符型时会显示NAN,此时索引为2的值丢失了,提供一个参数告诉pandas如何连接:
df1= pd.DataFrame([1,2,3,4],index=['1',2,'3','e'],columns=['f'])
data=data.join(df1,how='outer')
data
import numpy as np
df=pd.DataFrame(np.random.randn(6,3),index=dates,columns=list('ABC'))
df
上述代码中outer是使用两个集合的并集、inner是两个集合的交集、left是两个集合的调用方法的对象值,right是被连接对象的索引值。
金融数分中一般是基于时间序列分析,首先需要一个时间索引:
dates = pd.date_range('20230910',periods=6 , freq='B') # 未指定起止日期时必须指定periods,freq默认为D(日历日),B交易日,W每周,M每月底,SM半个月频率
dates
创建数据:
import numpy as np
df=pd.DataFrame(np.random.randn(6,3),index=dates,columns=list('ABC'))
df
按列求和
按列求均值
按列求累计总和
print(df.sum()) #按列求和
print(df.mean()) #按列求均值
print(df.cumsum()) #按列求累计总和
其中describe可以一键生成多种数据:
df.describe()
按照某一列进行排序:
df.sort_values('A')
根据日期进行排序:
df.sort_index(ascending=False)
选取某一列方法:
前面所所有操作不赋值给df,df不会改变。
df.A
df['A']
选取特定的行或几行:
print(df[1:3])
df.loc[dates[1]]
注意返回序列或数据框:
print(df.loc[:,['A','C']])
print(df.loc['20230912',['A','C']]) #series
print(df.loc['20230912':'20230912',['A','C']]) #DataFrame
对于正式代码通常用iloc选取:
df.iloc[1:3,1:2] # 选取第2到3行,第2列
利用boll值选取数:
print(df)
df[df.A>0]
全量筛选:
df[df>0]
增加列:
df['E']=0
df
使用loc改变列的值:
df.loc[:,'E']=2
df
使用loc改变列的单个值:
df.loc['20230913','E']=4
df
使用绝对位置进行索引:ix
df.ix[2,'A']=4
df
Series为一维数组,由索引和标签组成:
s=pd.Series([1,23,4,5,7])
print(s)
s=pd.Series([1,23,4,5,7],index=['a','s','d','f','g'])
s
用索引选取:
s[['s','g']]
Series最重要功能在于在不同索引中对其数据:取交集
s1=pd.Series([1,23,4,5,7],index=['a','s','d','f','g'])
s2=pd.Series([1,2,54,95,7],index=['a','e','d','u','g'])
s1+s2
Series索引可以直接赋值修改:
s1.index=['a','e','d','u','g']
s1
关于statsModels模块后续会讲到,包含描述统计和统计模型估计推断。
-------------------------------------------可视化分析-------------------------------------------------
K线图:
K线由高开低收四个价格绘制而成。分为阳线与阴线两种,收盘价高于开盘价时为阳线,收盘价低于开盘价时为阴线;K线图的示意图如下:
阳线 阴线
K线由矩形实体与上下两根影线组成,实体上方的影线成为上影线,下方的成为下影线。实体与阴线相对长短,可形成多种形态。
1、股票数据
akshare可以获取大量股票数据,通常接口有:
详情输入和输出参数见:AKShare 股票数据 — AKShare 1.11.3 文档
实时行情获取:
"""
接口: stock_individual_info_em
目标地址: http://quote.eastmoney.com/concept/sh603777.html?from=classic
描述: 东方财富-个股-股票信息
限量: 单次返回指定 symbol 的个股信息
"""
import akshare as ak
stock_individual_info_em_df = ak.stock_individual_info_em(symbol="000001")
print(stock_individual_info_em_df)
"""
接口: stock_bid_ask_em
目标地址: https://quote.eastmoney.com/sz000001.html
描述: 东方财富-行情报价
限量: 单次返回指定股票的行情报价数据
"""
import akshare as ak
stock_bid_ask_em_df = ak.stock_bid_ask_em(symbol="000001")
print(stock_bid_ask_em_df)
"""
接口: stock_zh_a_spot_em
目标地址: http://quote.eastmoney.com/center/gridlist.html#hs_a_board
描述: 东方财富网-沪深京 A 股-实时行情数据
限量: 单次返回所有沪深京 A 股上市公司的实时行情数据
"""
import akshare as ak
stock_zh_a_spot_em_df = ak.stock_zh_a_spot_em()
print(stock_zh_a_spot_em_df)
股票历史数据获取:
"""
历史行情数据-东财
接口: stock_zh_a_hist
目标地址: https://quote.eastmoney.com/concept/sh603777.html?from=classic(示例)
描述: 东方财富-沪深京 A 股日频率数据; 历史数据按日频率更新, 当日收盘价请在收盘后获取
限量: 单次返回指定沪深京 A 股上市公司、指定周期和指定日期间的历史行情日频率数据
输入参数
"""
##不复权
import akshare as ak
stock_zh_a_hist_df = ak.stock_zh_a_hist(symbol="000001", period="daily",\
start_date="20170301", end_date='20210907', adjust="")
print(stock_zh_a_hist_df)
##前复权
import akshare as ak
stock_zh_a_hist_df = ak.stock_zh_a_hist(symbol="000001", period="daily", start_date="20170301", end_date='20210907', adjust="qfq")
print(stock_zh_a_hist_df)
##后复权
import akshare as ak
stock_zh_a_hist_df = ak.stock_zh_a_hist(symbol="000001", period="daily", start_date="20170301", end_date='20210907', adjust="hfq")
print(stock_zh_a_hist_df)
分钟级历时行情数据获取:
"""
分时数据-新浪
接口: stock_zh_a_minute
目标地址: http://finance.sina.com.cn/realstock/company/sh600519/nc.shtml
描述: 新浪财经-沪深京 A 股股票或者指数的分时数据,目前可以获取 1, 5, 15, 30, 60 分钟的数据频率, 可以指定是否复权
限量: 单次返回指定股票或指数的指定频率的最近交易日的历史分时行情数据; 注意调用频率
输入参数
"""
import akshare as ak
stock_zh_a_minute_df = ak.stock_zh_a_minute(symbol='sh600751', period='1', adjust="qfq")
print(stock_zh_a_minute_df)
"""
分时数据-东财
接口: stock_zh_a_hist_min_em
目标地址: http://quote.eastmoney.com/concept/sh603777.html?from=classic
描述: 东方财富网-行情首页-沪深京 A 股-每日分时行情; 该接口只能获取近期的分时数据,注意时间周期的设置
限量: 单次返回指定股票、频率、复权调整和时间区间的分时数据, 其中 1 分钟数据只返回近 5 个交易日数据且不复权
"""
import akshare as ak
# 注意:该接口返回的数据只有最近一个交易日的有开盘价,其他日期开盘价为 0
stock_zh_a_hist_min_em_df = ak.stock_zh_a_hist_min_em(symbol="000001", start_date="2021-09-01 09:32:00", end_date="2021-09-06 09:32:00", period='1', adjust='')
print(stock_zh_a_hist_min_em_df)
新浪输入参数:
东财输入参数:
获取公司动态:发的公告
"""
股市日历
公司动态
接口: stock_gsrl_gsdt_em
目标地址: https://data.eastmoney.com/gsrl/gsdt.html
描述: 东方财富网-数据中心-股市日历-公司动态
限量: 单次返回指定交易日的数据
"""
import akshare as ak
stock_gsrl_gsdt_em_df = ak.stock_gsrl_gsdt_em(date="20230808")
print(stock_gsrl_gsdt_em_df)
"""
风险警示板
接口: stock_zh_a_st_em
目标地址: http://quote.eastmoney.com/center/gridlist.html#st_board
描述: 东方财富网-行情中心-沪深个股-风险警示板
限量: 单次返回当前交易日风险警示板的所有股票的行情数据
"""
import akshare as ak
stock_zh_a_st_em_df = ak.stock_zh_a_st_em()
print(stock_zh_a_st_em_df)
获取股指行情实时数据:
"""
股票指数
实时行情数据
接口: stock_zh_index_spot
目标地址: http://vip.stock.finance.sina.com.cn/mkt/#hs_s
描述: 中国股票指数数据, 注意该股票指数指新浪提供的国内股票指数
限量: 单次返回所有指数的实时行情数据
"""
import akshare as ak
stock_zh_index_spot_df = ak.stock_zh_index_spot()
print(stock_zh_index_spot_df)
获取股指历史行情数据:
"""
历史行情数据-新浪
接口: stock_zh_index_daily
目标地址: https://finance.sina.com.cn/realstock/company/sz399552/nc.shtml(示例)
描述: 股票指数数据是从新浪财经获取的数据, 历史数据按日频率更新
限量: 单次返回具体某个指数的所有历史行情数据
输入参数
"""
import akshare as ak
stock_zh_index_daily_df = ak.stock_zh_index_daily(symbol="sz399552")
print(stock_zh_index_daily_df)
"""
历史行情数据-腾讯
接口: stock_zh_index_daily_tx
目标地址: http://gu.qq.com/sh000919/zs
描述: 股票指数(或者股票)历史行情数据
限量: 单次返回具体某个股票指数(或者股票)的所有历史行情数据
输入参数
"""
import akshare as ak
stock_zh_index_daily_tx_df = ak.stock_zh_index_daily_tx(symbol="sh000919")
print(stock_zh_index_daily_tx_df)
1、获取数据
这里用当东方财富接口演示获取历史行情:
需要安装的包包含:pandas akshare mpl_finance matplotlib
# 加载取数与绘图所需的函数包
import pandas as pd
import datetime
import akshare as ak
from mpl_finance import candlestick_ohlc
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
#1、获取行情
symbol="600570"
start_date="20210601"
end_date='20210801'
data = ak.stock_zh_a_hist(symbol, period="daily", start_date = start_date, end_date = end_date, adjust="qfq")
结果为:
2、数据处理
使用candlestick_ohlc包绘制K线图时,需要将日期转为数值。程序代码与执行结果如下:
#2、数据处理
def convert_date(data):
data_price = data[['日期','开盘','最高','最低','收盘' ,'成交量']] # 选取日期、高开低收价格、成交量数据
data_price = data_price.rename(columns={
'日期': 'trading_date','开盘': 'open_price','最高': 'high_price',
'最低': 'low_price','收盘': 'close_price','成交量': 'business_amount'
})
data_price['trading_date'] = data_price['trading_date'].astype(str) # 先将日期转为字符串
data_price.set_index('trading_date', inplace=True) # 将日期作为索引
data_price = data_price.astype(float) # 将价格数据类型转为浮点数
# 将日期格式转为 candlestick_ohlc 可识别的数值
data_price['Date'] = list(map(lambda x:mdates.date2num(datetime.datetime.strptime(x,'%Y-%m-%d')),data_price.index.tolist()))
return data_price
3、绘制K线
使用mpl_finance函数包中candlestick_ohlc函数进行绘图
#3、绘制K线图
# 提取绘图数据
data_price = convert_date(data)
ohlc = data_price[['Date','open_price','high_price','low_price','close_price']]
f1, ax = plt.subplots(figsize = (12,6)) # 创建图片
candlestick_ohlc(ax, ohlc.values.tolist(), width=.7, colorup='red', colordown='green') # 使用candlestick_ohlc绘图
ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d')) # 设置横轴日期格式
plt.xticks(rotation=30) # 日期显示的旋转角度
plt.title(symbol,fontsize = 14) # 设置图片标题
plt.xlabel('日 期',fontsize = 14) # 设置横轴标题
plt.ylabel('价 格(元)',fontsize = 14) # 设置纵轴标题
plt.show()
4、去除图中非交易日
由于candlestick_ohlc函数默认绘制的K线图并未剔出非交易日,导致K线之间存在空白间隔。
我们通过修改绘图数据中横轴数据,修改横轴标注日期,实现剔除图中的非交易日数据。
# 4、去除非交易日的间隔
data_price = convert_date(data)
ohlc = data_price[['Date','open_price','high_price','low_price','close_price']]
ohlc.loc[:,'Date'] = range(len(ohlc)) # 重新赋值横轴数据,使横轴数据为连续数值
# 绘图
f1, ax = plt.subplots(figsize = (12,6))
candlestick_ohlc(ax, ohlc.values.tolist(), width=.7, colorup='red', colordown='green')
plt.xticks(rotation=30) # 日期显示的旋转角度
plt.title(symbol,fontsize = 14) # 设置图片标题
plt.xlabel('日 期',fontsize = 14) # 设置横轴标题
plt.ylabel('价 格(元)',fontsize = 14) # 设置纵轴标题
# 修改横轴标注日期
date_list = ohlc.index.tolist() # 获取日期列表
xticks_len = round(len(date_list)/(len(ax.get_xticks())-1)) # 获取默认横轴标注的间隔
xticks_num = range(0,len(date_list),xticks_len) # 生成横轴标注位置列表
xticks_str = list(map(lambda x:date_list[int(x)],xticks_num)) # 生成正在标注日期列表
ax.set_xticks(xticks_num) # 设置横轴标注位置
ax.set_xticklabels(xticks_str) # 设置横轴标注日期
plt.show()
5、在K线图中,添加成交量
K线图中,除了K线数据,一般还配有成交量数据。恒有数的stock_quote_daily接口返回的数据中,也有成交量数据。将K线图与成交量绘制在同一张图的程序如下:
#5、绘制成交量
fig = plt.figure(figsize=(12,10))
grid = plt.GridSpec(12, 10, wspace=0.5, hspace=0.5)
#(1)绘制K线图
# K线数据
data_price = convert_date(data)
ohlc = data_price[['Date','open_price','high_price','low_price','close_price']]
ohlc.loc[:,'Date'] = range(len(ohlc)) # 重新赋值横轴数据,绘制K线图无间隔
# 绘制K线
ax1 = fig.add_subplot(grid[0:8,0:12]) # 设置K线图的尺寸
candlestick_ohlc(ax1, ohlc.values.tolist(), width=.7
, colorup='red', colordown='green')
plt.title(symbol,fontsize = 14) # 设置图片标题
plt.ylabel('价 格(元)',fontsize = 14) # 设置纵轴标题
ax1.set_xticks([]) # 日期标注在成交量中,故清空此处x轴刻度
ax1.set_xticklabels([]) # 日期标注在成交量中,故清空此处x轴
#(2)绘制成交量
# 成交量数据
data_volume = data_price[['Date','close_price','open_price','business_amount']]
data_volume['color'] = data_volume.apply(lambda row: 1 if row['close_price'] >= row['open_price'] else 0, axis=1) # 计算成交量柱状图对应的颜色,使之与K线颜色一致
data_volume.Date = ohlc.Date
# 绘制成交量
ax2 = fig.add_subplot(grid[8:10,0:12]) # 设置成交量图形尺寸
ax2.bar(data_volume.query('color==1')['Date']
, data_volume.query('color==1')['business_amount']
, color='r') # 绘制红色柱状图
ax2.bar(data_volume.query('color==0')['Date']
, data_volume.query('color==0')['business_amount']
, color='g') # 绘制绿色柱状图
plt.xticks(rotation=30)
plt.xlabel('日 期',fontsize = 14) # 设置横轴标题
# 修改横轴日期标注
date_list = ohlc.index.tolist() # 获取日期列表
xticks_len = round(len(date_list)/(len(ax2.get_xticks())-1)) # 获取默认横轴标注的间隔
xticks_num = range(0,len(date_list),xticks_len) # 生成横轴标注位置列表
xticks_str = list(map(lambda x:date_list[int(x)],xticks_num)) # 生成正在标注日期列表
ax2.set_xticks(xticks_num) # 设置横轴标注位置
ax2.set_xticklabels(xticks_str) # 设置横轴标注日期
plt.show()
绘制其他图(散点、直方、雷达图等)
折线图绘制步骤如下:
1、先导入相关包:import matplotlib.pyplot as plt;
2、传入相关x,y的值,使用plot(x,y)来绘制折线图;在这一步可以设置具体细节的值,比如线条样式、宽度、颜色、透明度等等;
折线设置具体代码:plt.plot(x,y,color="green",alpha=0.5,linestyle="-",linewidth=3)
折点设置具体代码:plt.plot(x,y,marker="o",color="g",markersize=20,markeredgecolor="b",markeredgewidth=5)
3、使用plt.show来展示绘制图形;
#设置x轴和y轴的刻度标签(包括范围大小,方向、单位,最大最小值等)
#设置显示中文:包括x轴和y轴,以及标题,需要首先导入字体管理模块,并找到自己电脑上的字体路径,最后再来对x轴和y轴的标题以及图表标题进行字体颜色、方向设置等
#设置x轴和y轴的刻度:
from matplotlib import pyplot as plt
import numpy as np
x=range(2,26,2)
y=[np.random.randint(15,30)for i in x]
plt.figure(figsize=(20,8),dpi=80) #设置图片的大小
#设置x、y轴的刻度:
plt.xticks(x)
plt.xticks(range(1,25))
plt.yticks(y)
plt.yticks(range(min(y),max(y)+1))
#设置x轴的刻度标签:
x_ticks_label=["{}:00".format(i)for i in x]
plt.xticks(x,x_ticks_label,rotation=45)
#设置y轴的刻度标签:
y_ticks_label=["{}c".format(i) for i in range(min(y),max(y)+1)]
plt.yticks(range(min(y),max(y)+1),y_ticks_label)
#导入字体管理模块:并找到自己电脑上的字体路径:一般是C:\windows\fonts里面
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname=r'C:\Users\59980\Desktop\msyh.ttc',size=18)
#设置x轴,并将字体旋转45度;
plt.xlabel("时间",fontproperties=my_font)
#设置y轴:
plt.ylabel("次数",fontproperties=my_font)
#设置标题:
plt.title("每小时次数",color="red",fontproperties=my_font)
plt.plot(x,y)
plt.show()
# plt.savefig("./t5.png")#保存图片
一图多线:两个轴的设置,以及网格、图例、字体;
y1=[1,2,3,5,4,3,6,7,8,6]
y2=[1,2,2,1,3,5,4,7,5,8]
x=range(1,11)
plt.figure(figsize=(20,8),dpi=80)
plt.plot(x,y1,color="r",label="A部门")
plt.plot(x,y2,color="b",label="B部门")
#设置x轴刻度:显示格式、字体、旋转方向;
xtick_labels=["第{}周".format(i) for i in x]
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/STFANGSO.TTF",size=18)
plt.xticks(x,xtick_labels,fontproperties=my_font,rotation=45)
#绘制网格:透明度
plt.grid(alpha=0.4)
#设置图例:包括字体,位置等;
plt.legend(prop=my_font,loc="upper right")
#绘制图形:
plt.show()
一图多个子图:包括子图的字体大小,透明度设置;子图的位置 ,具体图形的内容;
#设置一个图多个坐标子系;采用add_subplot系列;
import numpy as np
import matplotlib.pyplot as plt
x=np.arange(1,100)
#先设置好子图的字体大小,透明度;
fig=plt.figure(figsize=(20,10),dpi=80)
#新建子图1:
ax1=fig.add_subplot(2,2,1)
ax1.plot(x,x**3)
#新建子图2:
ax2=fig.add_subplot(2,2,2)
ax2.plot(x,np.sqrt(x))
ax2.grid(color="r",linestyle="--",linewidth=1,alpha=0.3)
#新建子图3:
ax3=fig.add_subplot(2,2,3)
ax3.plot(x,np.log(x))
#绘制图形:
plt.show()
设置坐标范围:
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(-10,11,1)
y=x**2
plt.plot(x,y)
#可以调整x,y的起点:
plt.xlim(xmin=0)
plt.ylim(ymin=0)
plt.show()
绘制散点图:
#绘制散点图:
from matplotlib import pyplot as plt
from matplotlib import font_manager
import numpy as np
import random
# x = [random.random() for _ in range(20)] # 0到1之间随机数
# y = [random.randint(0, 100) for _ in range(20)] # 0到100之间随机数
x = [i for i in range(20)] # 0到1之间随机数
y = [i**2-8 for i in range(20)] # 0到100之间随机数
#设置图形大小:
plt.figure(figsize=(20,8),dpi=80)
#使用scatter绘制散点图:
size=np.random.randint(0,100,20)
plt.scatter(x,y,label="3月份",alpha=0.5,s=size,c="g")
#绘制x轴的刻度:
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/STFANGSO.TTF",size=18)
xticks_len = round(len(x)/4) # 获取默认横轴标注的间隔
xticks_num = range(0,len(x),xticks_len) # 生成横轴标注位置列表
xticks_str = list(map(lambda x:x,xticks_num)) # 生成正在标注日期列表
ax.set_xticks(xticks_num) # 设置横轴标注位置
ax.set_xticklabels(xticks_str) # 设置横轴标注日期
#绘制坐标轴标题:
plt.xlabel("日期",fontproperties=my_font)
plt.ylabel("温度",fontproperties=my_font)
#绘制图例:
plt.legend(prop=my_font)
plt.show()
#绘制流程:导入相关的库和包-得到x和y的值-设置图形的大小
#-使用scatter绘制图形并设置具体的一些值-绘制x轴和y轴的刻度、显示格式、设置字体、显示范围
#-绘制坐标轴标题-绘制图例;
绘制纵向条形图:导入相关模块—数据准备—字体设置—设置图片大小—绘制图形,调整图形中的参数。 非hist
—设置x轴和y轴刻度值—给图形加上标注—展示绘制的图形
from matplotlib import pyplot as plt
from matplotlib import font_manager
a=["流浪地球","疯狂的外星人","飞驰人生","大黄蜂","熊出没.原始时代","新喜剧之王"]
b=[38.13,19.85,14.89,11.36,6.47,5.93]
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/STFANGSO.TTF",size=18)
plt.figure(figsize=(20,8),dpi=80)
#绘制条形图
rects=plt.bar(a,[float(i) for i in b],width=0.3,color=["r","g","b","r","g","b"])
plt.xticks(range(len(a)),a,fontproperties=my_font)
plt.yticks(range(0,41,5),range(0,41,5))
#给图形加上标注(水平居中)
for rect in rects:
height=rect.get_height()
plt.text(rect.get_x()+rect.get_width()/2,height+0.3,str(height),ha="center")
plt.show()
from matplotlib import pyplot as plt
from matplotlib import font_manager
a=["流浪地球","疯狂的外星人","飞驰人生","大黄蜂","熊出没.原始时代","新喜剧之王"]
b=[38.13,19.85,14.89,11.36,6.47,5.93]
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/STFANGSO.TTF",size=18)
plt.figure(figsize=(20,8),dpi=80)
plt.barh(range(len(a)),b,height=0.5,color=["r","g","b","r","g","b"])
plt.yticks(range(len(a)),a,fontproperties=my_font,rotation=45)
#给图形加上标注:
for rect in rects:
width=rect.get_width()
plt.text(width,rect.get_y()+0.3/2,str(width),va="center")
plt.show()
并列条形图:
from matplotlib import pyplot as plt
import numpy as np
index=np.arange(4)
BJ=[50,55,53,60]
SH=[44,66,55,41]
#并列
plt.bar(index,BJ,width=0.3)
plt.bar(index+0.3,SH,width=0.3,color="green")
plt.xticks(index+0.3/2,index)
plt.show()
堆叠条形图:
from matplotlib import pyplot as plt
import numpy as np
index=np.arange(4)
BJ=[50,55,53,60]
SH=[44,66,55,41]
#并列
plt.bar(index,BJ,width=0.3)
plt.xticks(index+0.3/2,index)
plt.bar(index,SH,bottom=BJ,width=0.3,color="green")
plt.show()
绘制直方图(频数分布图):
流程:先导入需要的库和包—生成数据—绘制直方图—显示横轴、纵轴标签—显示图表标题—图表展示
from matplotlib import pyplot as plt
import numpy as np
import matplotlib
#设置matplotlib正常显示中文和负号:
matplotlib.rcParams["font.sans-serif"]=["SimHei"]#用黑体显示中文
matplotlib.rcParams["axes.unicode_minus"]=False#正常显示负号
#随机生成(10000,)服从正态分布的数据:
data=np.random.randn(10000)
#绘制直方图:
plt.hist(data,bins=40,facecolor="blue",edgecolor="black",alpha=0.7)
#显示横轴标签:
plt.xlabel("区间")
#显示纵轴标签
plt.ylabel("频数/频率")
#显示图表标题:
plt.title("频数/频率分布直方图")
plt.show()
绘制饼图:
导入相关模块—设置字体—准备数据、以及具体设置
—绘制饼图—图形大小设置—具体细节:角度、颜色设计—图例设置:位置/字体—绘制展示
from matplotlib import pyplot as plt
import numpy as np
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/STFANGSO.TTF",size=10)
label_list=["第一部分","第二部分","第三部分","第四部分"] # 可调
size=[29,35,10,26] # 可调
color=["r","g","b",'y'] # 可调
explode=[0,0.05,0,0] # 可调
plt.figure(figsize=(20,8),dpi=100)
patches,l_text,p_text=plt.pie(size,
explode=explode,
colors=color,
labels=label_list,
labeldistance=1.1,
autopct="%1.1f%%",
shadow=False,
startangle=90,
pctdistance=0.6
)
for t in l_text:
print(dir(t))
t.set_fontproperties(my_font)
for t in p_text:
t.set_size(18)
for i in patches:
i.set_color("pink")
break
plt.legend(prop=my_font,loc="upper right")
plt.show()
实现饼图特效——增加阴影效果和破裂效果;
from matplotlib import pyplot as plt
from matplotlib import font_manager
my_font=font_manager.FontProperties(fname="C:/Windows/Fonts/STFANGSO.TTF",size=14)
x=[15,30,45,10]
label_list=["Frogs","Hogs","Dogs","Logs"]
color=["blue","orange","green","red"]
explode=[0,0.09,0,0]
plt.figure(figsize=(7,7),dpi=100)
patches,l_text,p_text=plt.pie(x,
explode=explode,
colors=color,
labels=label_list,
labeldistance=1.1,
autopct="%1.1f%%",
shadow=True,
startangle=90,
pctdistance=0.6
)
plt.legend(prop=my_font,loc="upper right")
plt.show()
画函数图像:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)
x1 = np.arange(-3.0, 3.0, 0.1)
x2 = np.arange(-3.0, 3.0, 0.1)
X, Y = np.meshgrid(x1, x2)
Z = X**2 + Y**2
plt.xlabel('x1')
plt.ylabel('x2')
a,b=2,9
plt.text(0.5*(a+b),20,r"$\int_a^b (-(x-1)*(x-6)+50)\mathrm{d}x$",horizontalalignment='center',fontsize=20)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow')
plt.show()
使用sns.regplot() 建立热力图
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
df=pd.DataFrame(np.random.rand(10,10),columns=list('abcdefghij'))
df.head(10)
sns.heatmap(df,cmap='Greens') # 颜色越深数据越小,越浅数据越大
sns.heatmap(df,vmin=0.5,vmax=0.5) # vimn vmax显示范围
sns.heatmap(df,annot=True) #显示具体数值
-------------------------python-highcharts绘制带成交量的、可交互的K线图---------------------------
pip install python-highcharts
继续用到之前获取的数据:data原始数据:
取出我们需要用到的数据,并且将时间转换成时间戳的格式:
要安装
pip install panel_highcharts
pip install panel
import time
import pandas as pd
import panel as pn
import panel_highcharts as ph
df = data[['日期','开盘','最高','最低','收盘' ]] # 选取日期、高开低收价格、成交量数据
df = df.rename(columns={
'日期': 'date','开盘': 'open','最高': 'high',
'最低': 'low','收盘': 'close'
})
df["date"] = df["date"].astype(str)
df["date"] = df["date"].apply(lambda x: int(time.mktime(time.strptime(x,"%Y-%m-%d"))) * 1000)
df=df[['date', 'open', 'high', 'low', 'close']].values.tolist()
结果如下:
pn.extension('highstock')
# Creating Configuration
configuration = {
"title": {"text": "stock price by month and day"},
"rangeSelector": {
"buttons": [
{"type": "day", "count": 1, "text": "1D"},
{"type": "month", "count": 1, "text": "1M"},
{"type": "all", "count": 1, "text": "All"},
],
"selected": 1,
"inputEnabled": False,
},
"series": [
{"name": "stock", "type": "candlestick", "data": df, "tooltip": {"valueDecimals": 2}}
],
}
#Visualizing the chart
chart = ph.HighStock(object=configuration, sizing_mode= "stretch_width", height=600)
chart
效果显示有问题,出不来。