绘制折线图分析股票涨跌
利用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<