画K线图、画N日均线 python3

记下自己的研究成果是件开心的事情,本文介绍用Python3将股票历史行情画成K线图,以及添加5日,10日,N日均线。

    首先,是获取数据源,一般分两种,一是直接从财经类网站读取;二是读取本地数据文件。我是先从财经网站下载历史行情数据csv文件,然后放到工程文件夹里。

[python]  view plain  copy
  1. ####从雅虎财经获取历史行情####  
  2.   
  3. from matplotlib.finance import quotes_historical_yahoo_ohlc  
  4.   
  5. start = (201711)  
  6.   
  7. end = (2017712)  
  8.   
  9. stock = quotes_historical_yahoo_ohlc("399300.ss", start, end)  
  10.   
  11. if len(stock) == 0:  
  12.   
  13.     raise SystemExit  
  14.   
  15. ##从雅虎获取google的股价数据###  
  16.   
  17. import datetime  
  18.   
  19. import pandas_datareader.data as web  
  20.   
  21.    
  22. start = datetime.datetime(2016101)  
  23.   
  24. end = datetime.date.today()  
  25.   
  26. goog = web.DataReader("GOOG""yahoo", start, end)  


方式二,读取本地数据文件

[python]  view plain  copy
  1. import pandas as pd  
  2.   
  3. stock = pd.read_csv("hs300_399300.csv")  

csv文件如下:


    然后,进行数据预处理,或者说数据清洗。

[python]  view plain  copy
  1. #import sys  
  2.   
  3. # 显示编译器默认编码格式  
  4.   
  5. print(sys.getdefaultencoding)  
  6.   
  7. # 读取前28行数据,将第一列解析为时间格式,将第一列指定为索引,文件编码方式为ANSI  
  8.   
  9. stock = pd.read_csv("hs300_399300.csv",nrows=28, parse_dates=[0], index_col=0, encoding="ANSI")  
  10.   
  11. # 逆序排序  
  12.   
  13. stock = stock[::-1]  
  14.   
  15. print(stock.info())  
  16.   
  17. print(stock.head())  
  18.   
  19. print(stock.columns)  
  

可以看到数据信息,总共28行,时间索引为2017-05-26到2017-07-06,没有空值,以及各列的数据类型。若数据有缺损或者有多余空格,就要进行调整。

    数据没问题后就可以开始画图的了,首先用自带的plot()画单列数据的图:

[python]  view plain  copy
  1. # 网格开启True  
  2.   
  3. stock["收盘价"].plot(grid=True)  
  4.   
  5. stock["最高价"].plot()  


    可以看到它的横坐标竟然是以时间为刻度从2017-05-28到2017-07-02,原因是我们之前将csv文件第一列解析成时间格式,并且设为索引。如果没这么做,那么横坐标将为0,1,2,3....28.这一点在后面将不同坐标系的图绘入同一坐标系中非常重要。

    K线图又称蜡烛图,起源于日本德川幕府时代,当时的商人用此图来记录米市的行情和价格波动,后来K线图被引入到股票市场。每天的四项指标数据用如下蜡烛形状的图形来记录,不同的颜色代表涨跌情况。

    

    基本背景知识介绍完,上主菜:

[python]  view plain  copy
  1. import matplotlib.pyplot as plt  
  2.   
  3. from matlplotlib.dates import DateFormatter,WeekdayLocator, DayLocator, MONDAY  
  4.   
  5. import pandas as pd  
  6.   
  7. import matplotlib.dates as mdates  
  8.   
  9. from matplotlib.finance import candlestick_ohlc,quotes_historical_yahoo_ohlc  
  10.   
  11. import numpy as np  
  12.    
  13.   
  14. def candle(stock, stocks, others=None):  
  15.   
  16.     # 将时间数据转换为pandas的时间格式  
  17.   
  18.     stock['日期'] = pd.to_datetime(stock['日期'])  
  19.   
  20.     # 将时间数据转换为matplotlib的时间格式  
  21.   
  22.     stock['日期'] = stock['日期'].apply(lambdad: mdates.date2num(d.to_pydatetime()))  
  23.   
  24.     # 将需要数据转换为元组  
  25.   
  26.     tuples = [tuple(x)for x in stock[['日期''开盘价''最高价''最低价''收盘价']]]  
  27.   
  28.   
  29.     # 获得fig和ax对象  
  30.   
  31.     fig, ax =plt.subplots()  
  32.   
  33.     # 调节横坐标距离底部的高度  
  34.   
  35.     fig.subplots_adjust(bottom=0.2)  
  36.    
  37.     # 设置横坐标主刻度标签位置,标签文本格式(显示每周周一),年月日  
  38.   
  39.     mondays =WeekdayLocator(MONDAY)  
  40.   
  41.     ax.xaxis.set_major_locator(mondays)  
  42.   
  43.     mondays_formatter = DateFormatter("%Y-%m-%d")  
  44.   
  45.     ax.xaxis.set_major_formatter(mondays_formatter)  
  46.   
  47.   
  48.     # 设置横坐标次刻度标签位置  
  49.   
  50.     days =DayLocator()  
  51.   
  52.     ax.xaxis.set_minor_locator(days)  
  53.   
  54.     # day_formatter= DateFormatter("%d")  
  55.   
  56.     # ax.xaxis.set_minor_formatter(day_formatter)  
  57.   
  58.   
  59.     # 网格,x坐标轴网格使用主刻度,y坐标轴使用副刻度  
  60.   
  61.     #ax.xaxis.grid(True, which='major')  
  62.   
  63.     #ax.yaxis.grid(True, which='minor')  
  64.   
  65.     ax.grid(True)  
  66.   
  67.    
  68.     # 绘图  
  69.   
  70.     candlestick_ohlc(ax,tuples, width=0.6, colorup='r', colordown='g')  
  71.   
  72.     # 其它折线  
  73.   
  74.     if others isnot None:  
  75.   
  76.         for each inothers:  
  77.   
  78.            plt.plot(stocks[each], label=each)  
  79.   
  80.         plt.legend()  
  81.   
  82.     ax.xaxis_date()  
  83.     ax.autoscale_view()  
  84.   
  85.   
  86.     # 设置横坐标标签的样式,获得当前坐标轴plt.gca,获得x轴刻度标签get_xticklabels(),转换角度,倾斜角度  
  87.   
  88.     plt.setp(plt.gca().get_xticklabels(), rotation=45,horizontalalignment='right')  
  89.   
  90.     plt.title("hs300_399300")  
  91.   
  92.     #plt.xlabel("time")  
  93.   
  94.     #plt.ylabel('price')  
  95.   
  96.     plt.show()  

5日均线:5天的收盘价的平均值

10日均线:10天的收盘价的平均值

依次类推。

给数据文件加一列“5日均线”,和‘10日均线’

stocks["5days"] = np.round(stocks["收盘价"].rolling(window=5, center=False).mean(), 2)

stocks["10days"] = np.round(stocks["收盘价"].rolling(window=10, center=False).mean(), 2)

现在打印下前60行

  

可见现在5,10日均线的数据都以计算并添加进数据文件中,接下来就是将其绘制入K线图上

[python]  view plain  copy
  1. # 读取数据画k线图  
  2.   
  3. stock = pd.read_csv("hs300_399300", nrows=60,encoding="ANSI")  
  4.   
  5. stock = stock[::-1]  
  6.   
  7. # 读取数据画均线图  
  8.   
  9. stock = pd.read_csv("hs300_399300", nrows=60,parse_dates=[0], index_col=0, encoding="ANSI")  
  10.   
  11. stock = stock[::-1]  
  12.   
  13. # 重命名columns索引,有些编码方式不支持中文,可以换成英文  
  14.   
  15. stock.index.rename('日期', inplace=True)  
  16.   
  17. stock.rename(columns={}, inplace=True)  
  18.   
  19. candle(stock, stocks, ["5days","10days"])  

运行输出:

要在python中股票k线图并添加均线,可以按照以下步骤进行操作: 1. 导入必要的库:使用`import`语句导入需要的库,例如`import matplotlib.pyplot as plt`和`import mpl_finance as mpf`。 2. 准备数据:将股票的历史数据存储在一个数据框中,确保数据框包含期、开盘价、最高价、最低价和收盘价等必要的列。 3. 计算均线数据:使用`rolling`函数和`mean`函数计算5均线和10均线的数据,并将结果存储在数据框的新列中。例如,使用以下代码计算5均线和10均线: ``` df['M5'] = df['close'].rolling(5).mean() # 5均线 df['M10'] = df['close'].rolling(10).mean() # 10均线 ``` 4. 创建布和子图:使用`plt.subplots`函数创建布和子图,并设置布的大小。例如,使用以下代码创建一个大小为15x6的布和子图: ``` fig, ax = plt.subplots(figsize=(15, 6)) ``` 5. 绘制k线图:使用`mpf.candlestick_ochl`函数绘制k线图,传入子图名称、股票历史数据、k线柱的宽度、涨跌颜色和柱形透明度等参数。例如,使用以下代码绘制k线图: ``` mpf.candlestick_ochl(ax, df_arr, width=0.6, colorup='r', colordown='g', alpha=1) ``` 6. 添加均线图:使用`plt.plot`函数在同一子图中绘制均线图。例如,使用以下代码绘制5均线和10均线: ``` plt.plot(df_arr[:, 0], df['M5']) # 绘制5均线 plt.plot(df_arr[:, 0], df['M10']) # 绘制10均线 ``` 7. 添加标题和坐标轴标签:使用`plt.title`、`plt.xlabel`和`plt.ylabel`函数分别设置标题、x轴标签和y轴标签。例如,使用以下代码添加标题和标签: ``` plt.title('股票名称') # 设置标题 plt.xlabel('期') # 设置x轴标签 plt.ylabel('价格') # 设置y轴标签 ``` 8. 设置刻度格式:使用`ax.xaxis_date`函数将x轴刻度设置为常规期格式。 9. 显示图像:使用`plt.show`函数显示绘制的图像。 请注意,上述步骤中的变量名和参数值应根据实际情况进行调整。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python绘制股票k线图](https://blog.csdn.net/hjhlln/article/details/127282449)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值