python分析股票

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

pyechart 官网
图表例子
github

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)]

猜你喜欢

转载自blog.csdn.net/qq_33236581/article/details/95358829