1 python 炒股简介
2 tushare
tushare 从新浪财经
、腾讯财经
、上交所
、深交所
获取数据。
调取 tushare pro 版数据,先在平台上注册,得到 token,
import tushare as ts
pro = ts.pro_api('你的token')
df = pro.daily(ts_code='000001.SZ', start_date='20200300', end_date='20200404')
print(df) # df
其他接口参考这里;
这里生成的 df(DataFrame) 可以用 pandas 来处理;
3 pandas 处理数据
DataFram 像一个表格数据,这里用行列来描述;
函数 | 意义 |
---|---|
df.dtypes | 每列的数据类型 |
df.head() | 头部数据,也可以加上数字,如 df.head(5) |
df.tail() | 尾部数据,也可以加上数字,如 df.tail(5) |
df[3:5] | 从第3行到第(5-1)行的数据 |
df.index | 索引号,即第一列的数据信息 |
df.columns | 除第一列的所有列的表头,如:[‘ts_code’, ‘trade_date’, ‘open’, ‘high’, ‘low’, ‘close’, ‘pre_close’, ‘change’, ‘pct_chg’, ‘vol’, ‘amount’] 可以单独列出这些项,如 格式1:df.ts_code、df.trade_date 格式2: df[‘ts_code’]、df[‘trade_date’] |
df.to_numpy() | 把数据转换为 numpy 格式 |
df.describe() | 统计该 DateFrame 数据,如每项的平均值、最大值、最小值 |
df.T | 转置数据 |
df.sort_values(by=‘open’) | 根据 ‘open’ 的数据来排序 |
df.loc[哪些行,哪些列] | 筛选出对应行列数据,如: df.loc[[0, 3], [‘open’, ‘close’]] # 索引为0、3的 ‘open’, ‘close’ 数据 df.loc[ : , [‘open’, ‘close’]] #每一行的 ‘open’, ‘close’ 数据df.loc[[0, 3], : ] # 第0行、3行的所有项数据 |
df.at[行, 列] | 读取某行某列的值 |
df.iloc[哪些行, 哪些列] | 同df.loc,不过这里的行和列用数字表示就行,不用具体的名称 |
df.iat[行, 列] | 同df.at,不过这里的行和列用数字表示就行 |
df[df.open > 13] | 筛选出 ‘open’ 项大于 13 的行 |
df.mean() | 求平均值,df.mean(1)是求第1行的平均值 |
df.rename() | 重命名列名称,如: df.rename(columns={‘open’:‘Open’, ‘high’:‘High’, ‘low’:‘Low’, ‘close’:‘Close’, ‘vol’:‘Volume’},inplace=True) |
df.index = pd.date_range() | 把索引改成日期的格式,这里的日期自己生成,"20200101"为起始日期,periods是天数,如: df.index = pd.date_range(“20200101”, periods=5) |
df.index = pd.to_datetime() | 把索引转换成日期格式,日期来源于 df.trade_date ,是真实数据,如: df.index = pd.to_datetime(df.trade_date.to_numpy()) |
5 可视化方法一
# python3.5 及以下
pip3 install pyecharts==0.5.11
# python3.6 以上
pip3 install pyecharts
5.1 生成 html 图片
示例代码:
from pyecharts import options as opts
from pyecharts.charts import Kline
data = [
[2320.26, 2320.26, 2287.3, 2362.94],
[2300, 2291.3, 2288.26, 2308.38],
[2295.35, 2346.5, 2295.35, 2345.92],
[2347.22, 2358.98, 2337.35, 2363.8],
[2360.75, 2382.48, 2347.89, 2383.76],
[2383.43, 2385.42, 2371.23, 2391.82],
[2377.41, 2419.02, 2369.57, 2421.15],
[2425.92, 2428.15, 2417.58, 2440.38],
[2411, 2433.13, 2403.3, 2437.42],
[2432.68, 2334.48, 2427.7, 2441.73],
[2430.69, 2418.53, 2394.22, 2433.89],
[2416.62, 2432.4, 2414.4, 2443.03],
[2441.91, 2421.56, 2418.43, 2444.8],
[2420.26, 2382.91, 2373.53, 2427.07],
[2383.49, 2397.18, 2370.61, 2397.94],
[2378.82, 2325.95, 2309.17, 2378.82],
[2322.94, 2314.16, 2308.76, 2330.88],
[2320.62, 2325.82, 2315.01, 2338.78],
[2313.74, 2293.34, 2289.89, 2340.71],
[2297.77, 2313.22, 2292.03, 2324.63],
[2322.32, 2365.59, 2308.92, 2366.16],
[2364.54, 2359.51, 2330.86, 2369.65],
[2332.08, 2273.4, 2259.25, 2333.54],
[2274.81, 2326.31, 2270.1, 2328.14],
[2333.61, 2347.18, 2321.6, 2351.44],
[2340.44, 2324.29, 2304.27, 2352.02],
[2326.42, 2318.61, 2314.59, 2333.67],
[2314.68, 2310.59, 2296.58, 2320.96],
[2309.16, 2286.6, 2264.83, 2333.29],
[2282.17, 2263.97, 2253.25, 2286.33],
[2255.77, 2270.28, 2253.31, 2276.22],
]
c = (
# Kline(
# init_opts=opts.InitOpts(
# width="750px", # 画布宽度
# height="500px", # 画布高度
# js_host="http://www.tamray.cn/" # js资源加载地址,可以不用这行,它有默认地址
# )
# )
Kline()
.add_xaxis(["2017/7/{}".format(i + 1) for i in range(31)])
.add_yaxis("kline", data)
.set_global_opts(
xaxis_opts=opts.AxisOpts(is_scale=True),
yaxis_opts=opts.AxisOpts(
is_scale=True,
splitarea_opts=opts.SplitAreaOpts(
is_show=True, areastyle_opts=opts.AreaStyleOpts(opacity=1) # 根据坐标刻度来高亮图表背景
),
),
datazoom_opts=[opts.DataZoomOpts(pos_bottom="-2%")], # 缩放功能
title_opts=opts.TitleOpts(title="Kline-DataZoom-slider-Position"), # 设置主标题
)
.render("kline_datazoom_slider_position.html") # 生成的 html 文件名
)
# 叠加图表
#line = (
# Line()
# .add_xaxis(time)
# .add_yaxis("", data3, color="#bf0500", label_opts=opts.LabelOpts(is_show=False))
# )
#c.overlap(line)
#c.render("render.html")
双机生成的 html 图片即可打开,如果不能打开,用编辑器打开该 html 文件,发现头部有个链接,很有可能是访问访问不了:
<head>
<meta charset="UTF-8">
<title>Awesome-pyecharts</title>
<script type="text/javascript" src="https://assets.pyecharts.org/assets/echarts.min.js"></script>
</head>
这里的 echarts.min.js 文件需要先下载到本地,然后把路径改成本地路径即可;
下载路径:https://assets.pyecharts.org/assets/echarts.min.js,把下载的 echarts.min.js 文件存放至 html 文件的同级目录,然后在代码中指定 js 的路径:
# 把代码中的:
Kline()
# 改成:
Kline(
init_opts=opts.InitOpts(
js_host="./" # js资源加载地址,'./'表示当前目录
)
)
生成的 html 文件头部会自动更改路径,如:
<head>
<meta charset="UTF-8">
<title>Awesome-pyecharts</title>
<script type="text/javascript" src="./echarts.min.js"></script>
</head>
双击该文件就可以在浏览器上打开了;
5.2 生成 png 图片
需要安装snapshot-selenium:
pip install snapshot_selenium -i https://pypi.mirrors.ustc.edu.cn/simple/
还需要下载对应版本的 chromedriver,要与 chrom 版本号一致:
下载地址:http://npm.taobao.org/mirrors/chromedriver/
下载得到文件 chromedriver_linux64.zip
,解压后得到 chromedriver
,将其移动至 /usr/bin/
目录下即可;
生成图片实例代码(关键是最后一行):
from snapshot_selenium import snapshot as driver
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.render import make_snapshot
def bar_chart() -> Bar:
c = (
Bar()
.add_xaxis(["衬衫", "毛衣", "领带", "裤子", "风衣", "高跟鞋", "袜子"])
.add_yaxis("商家A", [114, 55, 27, 101, 125, 27, 105])
.add_yaxis("商家B", [57, 134, 137, 129, 145, 60, 49])
.reversal_axis()
.set_series_opts(label_opts=opts.LabelOpts(position="right"))
.set_global_opts(title_opts=opts.TitleOpts(title="Bar-测试渲染图片"))
)
return c
# 需要安装 snapshot-selenium 或者 snapshot-phantomjs
make_snapshot(driver, bar_chart().render(), "bar.png")
5 可视化方法二
参考
安装 mplfinance:
pip install mplfinance
在绘图之前,确保 df 的数据格式如下,索引以日期命名(转换方法看上面那小结),列名称要对应:
Open High Low Close Volume
2020-01-01 12.82 12.89 12.55 12.61 825348.14
2020-01-02 12.75 12.97 12.66 12.97 518365.04
2020-01-03 12.86 13.13 12.82 12.89 520836.04
2020-01-04 13.05 13.09 12.78 12.80 513370.30
2020-01-05 12.85 13.04 12.76 12.94 661738.79
开始绘图:
import mplfinance as mpf
# 得到 df 数据
# ...
mpf.plot(df)
如上所示,默认图类型为’ohlc’。其他情节类型可以用关键字参数来指定type,例如type=‘candle’,type='line’或type=‘renko’
mpf.plot(df, type='candle')
mpf.plot(df, type='line')
mpf.plot(df, type=‘renko’)
可以使用mav关键字绘制移动平均线,可以单条,也可以多条:
mpf.plot(daily,type='ohlc',mav=4)
mpf.plot(daily,type='candle',mav=(3,6,9))
还可以显示 Volume 成交量:
mpf.plot(daily,type='candle',mav=(3,6,9),volume=True)
上面的图中没有显示非交易日的数据,如果要显示出来可以用关键字 show_nontrading:
mpf.plot(daily,type='candle',mav=(3,6,9),volume=True,show_nontrading=True)
示例代码:
import mplfinance as mpf
import tushare as ts
import pandas as pd
pro = ts.pro_api('5622b32a445df8a1372aedd831c2b2d109fbd418a7201ab1b4b0fcce')
df = pro.daily(ts_code='000001.SZ', start_date='20200300', end_date='20200404') # 获取数据
df = df.sort_index(axis=0, ascending=False) # 根据索引排序
df.index = pd.to_datetime(df.trade_date.to_numpy()) # 将索引转换为日期
df = df.loc[:, ["open","high", "low", "close","vol"]] # 筛选出这几项数据
df.rename(columns={
'open':'Open', 'high':'High', 'low':'Low', 'close':'Close', 'vol':'Volume'},
inplace=True) # 重命名项名称
mpf.plot(df, type='ohlc',mav=2, volume=True)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fYtpqaWN-1609572898827)(http://www.tamray.cn/wp-content/uploads/2020/04/Figure_1.png)]