绘制折线图分析股票涨跌

本文通过Python的numpy和matplotlib库分析股票数据,包括加载文件、计算平均值(算术平均值、加权平均值)、最值、中位数、标准差,以及时间数据处理、移动均线、卷积和布林带等技术,帮助理解股票走势并进行可视化分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用numpy加载文件

numpy提供了函数用于加载逻辑上可被解释为二维数组的文本文件,格式如下:

数据项1 <分隔符> 数据项2 <分隔符> ... <分隔符> 数据项n
例如:
AA,AA,AA,AA,AA
BB,BB,BB,BB,BB
或:
AA:AA:AA:AA:AA
BB:BB:BB:BB:BB

调用numpy.loadtxt()函数可以直接读取该文件并且获取ndarray数组对象:

import numpy as np
# 直接读取该文件并且获取ndarray数组对象 
# 返回值:
#     unpack=False:返回一个二维数组
#     unpack=True: 多个一维数组
np.loadtxt(
    '../aapl.csv',			# 文件路径 在我自己的电脑路径为:
 #  'C:/Users/ADMIN/Desktop/DATASCIENCE/day03/da_data/aapl.csv'
    delimiter=',',			# 分隔符
    usecols=(1, 3),			# 读取1、3两列 (下标从0开始)
    unpack=False,			# 是否按列拆包
    dtype='U10, f8',		# 制定返回每一列数组中元素的类型
    converters={
   1:func}		# 转换器函数字典
)    

csv源文件信息:
在这里插入图片描述
第0列: 股票名称
第1列: 日期
第3列: 开盘价
第4列: 当日最高价
第5列: 当日最低价
第6列: 收盘价
第7列: 成交量
案例:读取aapl.csv文件,得到文件中的信息:

import numpy as np
import datetime as dt
# 日期转换函数
def dmy2ymd(dmy):
	dmy = str(dmy, encoding='utf-8')
	time = dt.datetime.strptime(dmy, '%d-%m-%Y').date()
	t = time.strftime('%Y-%m-%d')
	return t
dates, opening_prices, highest_prices, lowest_prices, closeing_prices  = np.loadtxt(
    'C:/Users/ADMIN/Desktop/DATASCIENCE/day03/da_data/aapl.csv',		# 文件路径
    delimiter=',',			# 分隔符
    usecols=(1, 3, 4, 5, 6),			# 读取1、3两列 (下标从0开始)
    unpack=True,						# 按列拆包
    dtype='M8[D], f8, f8, f8, f8',		# 制定返回每一列数组中元素的类型
    converters={
   1:dmy2ymd})
print(dates, opening_prices, highest_prices, lowest_prices, closeing_prices)

运行结果:

['2011-01-28' '2011-01-31' '2011-02-01' '2011-02-02' '2011-02-03'
 '2011-02-04' '2011-02-07' '2011-02-08' '2011-02-09' '2011-02-10'
 '2011-02-11' '2011-02-14' '2011-02-15' '2011-02-16' '2011-02-17'
 '2011-02-18' '2011-02-22' '2011-02-23' '2011-02-24' '2011-02-25'
 '2011-02-28' '2011-03-01' '2011-03-02' '2011-03-03' '2011-03-04'
 '2011-03-07' '2011-03-08' '2011-03-09' '2011-03-10' '2011-03-11'] 
[344.17 335.8  341.3  344.45 343.8  343.61 347.89 353.68 355.19 357.39
 354.75 356.79 359.19 360.8  357.1  358.21 342.05 338.77 344.02 345.29
 351.21 355.47 349.96 357.2  360.07 361.11 354.91 354.69 349.69 345.4 ] 
 [344.4  340.04 345.65 345.25 344.24 346.7  353.25 355.52 359.   360.
 357.8  359.48 359.97 364.9  360.27 359.5  345.4  344.64 345.15 348.43
 355.05 355.72 354.35 359.79 360.29 361.67 357.4  354.76 349.77 352.32] 
 [333.53 334.3  340.98 343.55 338.55 343.51 347.64 352.15 354.87 348.
 353.54 356.71 357.55 360.5  356.52 349.52 337.72 338.61 338.37 344.8
 351.12 347.68 348.4  355.92 357.75 351.31 352.25 350.6  344.9  345.  ] 
 [336.1  339.32 345.03 344.32 343.44 346.5  351.88 355.2  358.16 354.54
 356.85 359.18 359.9  363.13 358.3  350.56 338.61 342.62 342.88 348.16
 353.21 349.31 352.12 359.56 360.   355.36 355.76 352.47 346.67 351.99]

从已读的日期和收盘价,使用matplotlib绘制K线图:

import numpy as np
import datetime as dt
import matplotlib.pyplot as mp
import matplotlib.dates as md
# 日期转换函数
def dmy2ymd(dmy):
	dmy = str(dmy, encoding='utf-8')
	time = dt.datetime.strptime(dmy, '%d-%m-%Y').date()
	t = time.strftime('%Y-%m-%d')
	return t
dates, opening_prices, highest_prices, lowest_prices, closeing_prices  = np.loadtxt(
    'C:/Users/ADMIN/Desktop/DATASCIENCE/day03/da_data/aapl.csv',		# 文件路径
    delimiter=',',			# 分隔符
    usecols=(1, 3, 4, 5, 6),			# 读取1、3两列 (下标从0开始)
    unpack=True,						# 按列拆包
    dtype='M8[D], f8, f8, f8, f8',		# 制定返回每一列数组中元素的类型
    converters={
   1:dmy2ymd})
mp.figure('APPL K', facecolor='lightgray')
mp.title('APPL K')
mp.xlabel('Day', fontsize=12)
mp.ylabel('Price', fontsize=12)

#拿到坐标轴
ax = mp.gca()
#设置主刻度定位器为周定位器(每周一显示主刻度文本)
ax.xaxis.set_major_locator(md.WeekdayLocator(byweekday=md.MO))
ax.xaxis.set_major_formatter(md.DateFormatter('%d %b %Y'))
#设置次刻度定位器为日定位器 
ax.xaxis.set_minor_locator(md.DayLocator())
mp.tick_params(labelsize=8)
dates = dates.astype(md.datetime.datetime)

mp.plot(dates, closeing_prices, color='dodgerblue', linestyle='-')
mp.gcf().autofmt_xdate()
mp.show()

运行结果:
在这里插入图片描述

k线图(蜡烛图)的基本形态指标:
1、收盘价高于开盘价时,则开盘价在下收盘价在上,二者之间的长方柱用红色或空心绘出,称之为阳线;其上影线的最高点为最高价,下影线的最低点为最低价。

2、收盘价低于开盘价时,则开盘价在上收盘价在下,二者之间的长方柱用黑色或实心绘出,称之为阴线,其上影线的最高点为最高价,下影线的最低点为最低价。
在这里插入图片描述
在上述已得到的折线图的基础上,绘制蜡烛图:

#绘制每一天的蜡烛图
#填充色:涨为白色,跌为绿色
rise = closeing_prices >= opening_prices
color = np.array([('white' if x else 'limegreen') for x in rise])
#边框色:涨为红色,跌为绿色
# edgecolor = np.array([('red' if x else 'limegreen') for x in rise]) 等同于下面的三行
ecolor = np.zeros(closing_prices.size, dtype='U5')
ecolor[:] = 'limegreen'
ecolor[rise] = 'red'

#绘制线条
mp.bar(dates, highest_prices - lowest_prices, 0.1, lowest_prices, color=edgecolor)
#绘制方块
mp.bar(dates, closeing_prices - opening_prices, 0.8, opening_prices, color=color, edgecolor=edgecolor)

运行结果:
在这里插入图片描述

平均值

算术平均值

算术平均值:
m = (s1 + s2 + … + sn) / n
算术平均值表示对真值的无偏估计。

m = np.mean(array)
m = array.mean()

案例:计算收盘价的算术平均值。

import numpy as np
closing_prices = np.loadtxt(
    'C:/Users/ADMIN/Desktop/DATASCIENCE/day03/da_data/aapl.csv', delimiter=',',
    usecols=(6), unpack=True)
mean = 0
for closing_price in closing_prices:
    mean += closing_price
mean /= closing_prices.size
# 相当于 mean = np.mean(closing_prices)
print(mean)
# 351.03766666666667

加权平均值

样本: S = [ s 1 , s 2 , s 3 . . . s n ] S = [s_1, s_2, s_3 ... s_n] S=[s1,s2,s3...sn]

权重: W = [ w 1 , w 2 , w 3 . . . w n ] W =[w_1, w_2, w_3 ... w_n] W=[w1,w2,w3...wn]

加权平均值: a = s 1 w 1 + s 2 w 2 + . . . + s n w n w 1 + w 2 + . . . + w n a = \frac{s_1w_1 + s_2w_2 + ... + s_nw_n}{w_1+w_2+...+w_n} a=w1+w2+...+w<

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值