用Python做股票市场数据分析—做K线图

由于本科在校期间身边有许多朋友是金融专业的,他们时长在我耳边谈起股票情况,受他们影响,耳濡目染地对证券时长有了兴趣。毕业前几个月找实习单位时,又机缘巧合地在这方面工作了一段时间,学习了证券交易的各种理论(道氏理论、日本蜡烛图技术、波浪理论等),虽然后期转行做了本专业工作(数据挖掘),但对证券交易这块一直在关注。闲来无事就用Python来实现了一下蜡烛图,话不多说,直接上代码:

# 导入需要的包和模块
import datetime

import pandas as pd
import tushare as ts # 该模块是一个免费提供股票交易数据的API

# 我们将看看从2016年1月1日开始过去一年的股票价格
start = datetime.date(2016,1,1)
end = datetime.date.today()

# 得到国金证券公司的股票数据;股票代码是600109
# 第一个参数是获取股票数据的股票代码串,第二个参数是开始日期,第三个参数是结束日期
guojin = ts.get_h_data(‘600109‘,str(start),str(end),‘qfq‘)
type(guojin)
guojin.head()

得到股票数据如下:

# 可视化股票数据
import matplotlib as mlp
import matplotlib.pyplot as plt
%matplotlib inline
%pylab inline

mlp.rcParams[‘figure.figsize‘] = (15,9)guojin[‘close‘].plot(grid=True)

得到国金证券2015-2016年的收盘价走势情况:

# 导入画图蜡烛图所需模块
from matplotlib.dates import DateFormatter
from matplotlib.dates import WeekdayLocator
from matplotlib.dates import MONDAY
from matplotlib.dates import DayLocator
from matplotlib.finance import candlestick_ohlc

# 定义画图函数
def pandas_candlestick_ohlc(dat,stick=‘day‘,otherseries=None):
    """
    参数dat:pandas DataFrame对象采用datetime64指数,和浮点数列
    “开盘价”,“最高价”,“收盘价”,“最低价”
    参数stick:一个字符串或数字只是的时间段覆盖单一的蜡杆。有效
    地字符串输入包括“day”,“week”,“month”,“year”(默认是day)
    和任何数字输入,该数字表明一段时间内包括的交易日
    参数otherseries:一个可迭代的,它将被强制转换为一个列表,包含dat包
    含的其他series将被回执为线条的列
    这将显示一个存储在dat中的股票数据的日本蜡烛K线图
    """
    mondays = WeekdayLocator(MONDAY) # 每周一的主要刻度
    alldays = DayLocator()  # 每周日的次要此刻度
    dayFormatter = DateFormatter("%d")

    # 创建一个新的DataFrame,包含按色呼入制定的每个阶段的OHLC数据
    transdat = dat.loc[:,["open","high","low","close"]]
    if type(stick) == str:
        if stick == "day":
            plotdat = transdat
            stick = 1
        elif stick in [‘week‘,‘month‘,‘year‘]:
            if stick == ‘week‘:
                transdat[‘week‘] = pd.to_datetime(transdat.index).map(
                    lambda x: x.isocalendar()[1])  #确定周
            elif stick == ‘month‘:
                transdat[‘month‘] = pd.to_datetime(transdat.index).map(
                    lambda x: x.month)  # 确定月
            transdat[‘year‘] = pd.to_datetime(transdat.index).map(
                lambda x: x.isocalendar()[0])   # 确定年

            # 按年和其他适当变量分组
            grouped = transdat.groupby(list(set([‘year‘,stick])))

            # 创建将要包含绘图的空数据框
            plotdat = pd.DataFrame({"open":[],"high":[],"low":[],"close":[]})
            for name, group in grouped:
                plotdat = plotdat.append(pd.DataFrame({"open":group.iloc[0,0],
                                                     "high":max(group.high),
                                                     "low":min(group.low),
                                                     "close":group.iloc[-1,3]},
                                                     index = [group.index[0]]))
            if stick == "weed":
                stick = 5
            elif stick == "month":
                stick = 30
            elif stick == "year":
                stick = 365
    elif type(stick) == int and stick >=1:
        transdat["stick"] = [np.float(i/stick) for i in range(len(transdat.index))]
        grouped = transdat.groupby("stick")

        # 创建将要包含绘图的空数据框
        plotdat = pd.DataFrame({"open":[],"high":[],"low":[],"close":[]})
        grouped = transdat.groupby(‘stick‘)
        for name,group in grouped:
            plotdat = plotdat.append(pd.DataFrame({"open": group.iloc[0,0],
                                                  "high": max(group.high),
                                                  "low": min(group.low),
                                                  "close": group.iloc[-1,3]},
                                                 index = [group.index[0]]))
    else:
        raise ValueError(‘Valid inputs to argument "stick" include the        strings "day","week","month","year",or a positive integer‘)

    # 设置plot参数,包括用绘制的轴线对象ax
    fig, ax = plt.subplots()
    fig.subplots_adjust(bottom=0.2)
    if plotdat.index[-1] - plotdat.index[0] < pd.Timedelta(‘730 days‘):
        weekFormatter = DateFormatter("%b %d")  # 例如,1月12
        ax.xaxis.set_major_locator(mondays)
        ax.xaxis.set_minor_locator(alldays)
    else:
        weekFormatter = DateFormatter("%b %d,%Y")
    ax.xaxis.set_major_formatter(weekFormatter)
    ax.grid(True)

    # 创建K线图
    candlestick_ohlc(ax,list(zip(list(date2num(plotdat.index.tolist())),
                                 plotdat["open"].tolist(),
                                 plotdat["high"].tolist(),
                                 plotdat["low"].tolist(),
                                 plotdat["close"].tolist())),
                     colorup = "black",colordown=‘red‘)

    # 绘制其他series(如移动平均线)作为线
    if otherseries != None:
        if type(otherseries) != list:
            otherseries = [otherseries]
        dat.loc[:,otherseries].plot(ax=ax,lw=1.3,grid=True)

    ax.xaxis_date()
    ax.autoscale_view()
    plt.setp(plt.gca().get_xticklabels(),rotation=45,
            horizontalalignment=‘right‘)
    plt.show()

  下面调用该函数,输出结果:

pandas_candlestick_ohlc(guojin)

  

该图看起来和商用交易软件显示结果差不多,但还是存在些问题,如图像中对于未开盘日期K线不连续,不能缩放等,后期继续加以改进。

时间: 2024-10-12 00:54:02

用Python做股票市场数据分析—做K线图的相关文章

股票K线图-JfreeChart版

http://blog.csdn.net/ami121/article/details/3953272 股票K线图-JfreeChart版 标签: jfreechartpropertiesappletdatetabledataset 2009-03-03 16:00 9378人阅读 评论(8) 收藏 举报 分类: jfreechart(7) 股票的K线图是所有Chart图中最复杂的一种,把一个K线图拆分开来我们可以发现,K线图的上半截实际上是由阴阳线(阴阳线可以表示开盘价,收盘价,最高价,最低价

[python]沪深龙虎榜数据导入通达信的自选板块,并标注于K线图上

将沪深龙虎榜数据导入通达信的自选板块,并标注于K线图上 原理:python读取前一次处理完的计算5日后涨跌幅输出的csv文件 文件名前加"[paint]" 安照通达信的画图文件和板块文件格式,输出文件 用通达信的导入功能,导入画图文件和板块文件即可 事前数据截图: 处理后所得文件: 导入通达信后板块截图: k线截图: 代码: 1 #coding=utf-8 2 3 #读取'[paint]'开头的csv文件 4 #copyright @ WangXinsheng 5 #http://ww

如何看K线图基础知识

在日K线图中一般白线.黄线.紫线.绿线依次分别表示:5.10.20.60日移动平均线,但这并不是固定的,会根据设置的不同而不同,比如你也可以在系统里把它们设为5.15.30.60均线. 你看K线图的上方有黄色PMA5=几的字样,就是五日均线等于几的意思.其他的有紫色的10日均线PMA10=什么的.设定的话双击数字就行!数字是几就是几日均线,颜色和线的颜色一样! 那是移动平均线,在日K线图中一般白线.黄线.紫线.绿线依次分别表示:5.10.20.60日移动平均线,但这并不是固定的,会根据设置的不同

功能分解——Android下画分时图与k线图有感

最近工作极度繁忙,已经好久没有更新博客了,总感觉要是再不抽空总结总结点东西,分分钟就会被懒惰的状态给打到了.同时也希望同学们谨记,如果你已经决定要坚持某些正确的东西,比如背完某章单词,看一完本书抑或是跑完多少公里等等,都要坚持下去,不要轻易被自己的懒惰与懈怠打败…… 今天要讲的是关于怎么解决某些砰然大物般的问题,我回想了一下过去遇到的所有难题,都可以划分成为一个个微不足道的小问题.于是想起了管理学里面有关“拆分”的内容,就是任何复杂的东西都可以拆分成一个个简单得任何人都可以做的地步. 想到这些问

PHP使用HighChart生成股票K线图详解

本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29LoD19)    QQ:1542385235 HighChart是集合了各种常见的web图表的开源合集,其中产生股票K线图的部分叫做“HighStock”.大家如果需要可以到我的资源页下载,是最新版: http://download.csdn.net/detail/wangyuchun_799/9353525

C#下如何用NPlot绘制期货股票K线图(3):设计要显示的股票价格图表窗口并定义相应类的成员及函数

[内容简介] 上一篇介绍了要显示K线图所需要的数据结构,及要动态显示K线图,需要动态读取数据文件必需的几个功能函数.本篇介绍要显示蜡烛图所用到的窗口界面设计及对应类定义.下面分述如下: [窗口界面] 见下图 上图中对应各周期功能按钮和标签进行相应拖放操作就是了, 不再多述 .倒是图表区为一个Nplot控件,命名:myPlot. [窗口类定义] 界面部分自动生成的代码文件: ///<ctp1.Designer.cs> ///K线图窗口界面代码此代码由VS自动生成. //-------------

股票行情K线图Android版

转载请注明出住:http://blog.csdn.net/andywuchuanlong 现在在手上的是一个证券资讯类型的app,其中有涉及到股票行情界面,行情中有K线图等,看到网上很多人在求这方面的资料,所以我特地写了一个demo在此处给大家分享一下. 下面是做出来的效果图: 这个 界面 是如何画出来的我就不做介绍了,大家可以去下载项目源码. 背景图是利用canvas先画出一个矩形,然后再画几根虚线,均线图是通过path来绘制的,总之图的绘制是很简单的,我就不在这里作介绍了,大家可以去gith

Canvas绘制股票K线图

最近想在小程序做股票K线图,于是尝试用Canvas实现股票K线图.K线图用到Canvas的API其实只有划线和画矩形,即moveTo(),lineTo(),fillRect()等函数. 第一步,我们先定义K线类: function Bar(open,high,low,close,width){ this.open = open; this.high = high; this.low = low; this.close = close; this.width = width | 5; } 输入参数

WPF中使用amCharts绘制股票K线图

原文:WPF中使用amCharts绘制股票K线图 本想自己用GDI绘图, 通过数据直接绘制一张蜡柱图, 但觉得这样子的功能比较少, 所以到网上搜索一些能画出K线图的控件. 发现DynamicDataDisplay挺好的, 在它的开发截图里也发现可以绘制蜡柱图, 但文档好像做的不是很好, 不知道怎么用它来画, 在寻找它比较好的例子的时候发现有人推荐用amCharts绘制, 所以便去看了一下, 发现挺好用的, 效果如下: 准备工作 先要去这里下载amCharts Stock Chart for WP