前言
关注股市行情的朋友应该都在其他软件上见过或者使用过K线图,不关注的小伙伴或多或少也都有所耳闻。这篇文章中,我们主要介绍如何使用 python 来绘制股票的 K 线图。掌握方法以后,我们就可以随心所欲地绘制我们想要查看的股票的行情了,先批量绘制,然后再使用图像浏览软件逐一查看,非常方便。
准备好用于绘制 K 线图的数据
在绘图之前,我们需要先准备好各项数据(如每日的开盘价、收盘价、最高阶、最低价、交易量等等)。这些我事先已经准备好了,这里只需从文件中读取即可。
我们使用如下代码来从文件中读取数据:
CSV_FILE_PATH = "./csv_data/csv/1/000001XSHE_平安银行_2022-11-14_1_9.53_14.csv"
data = pd.read_csv(CSV_FILE_PATH)
row_0 = list(data.loc[0])
data_len = len(row_0)
row_num = data.iloc[:,0].size
print("column number: {}".format(data_len))
print("row number: {}".format(row_num))
print("==================== Column Name ====================")
print(list(data.columns))
print("==================== Row 0 Value ====================")
print(row_0)
print("----- Finished -----")
从下图可以看到,我这批数据总共有 21 列,61 行:
编写绘图函数
接下来我们要根据数据来编写对应的绘图函数了,代码如下:
def data_normalization(src_data, amplify_val, y_offset):
'''
src_data : 原始数据序列
amplify_val: 放大系数
y_offset : 在 y 轴上的平移
'''
normalize_data = src_data
min_data = min(src_data)
max_data = max(src_data)
data_len = len(src_data)
for idx in range(data_len):
normalize_data[idx] = ( (src_data[idx]-min_data)/(max_data-min_data) )*amplify_val + y_offset
if (max_data-min_data) == 0:
normalize_data[idx] = amplify_val + y_offset
return normalize_data
def mac_normalization(mac5, mac10, mac20, amplify_val, y_offset):
'''
mac5 : mac5 原始数据序列
mac10 : mac10 原始数据序列
mac20 : mac20 原始数据序列
amplify_val: 放大系数
y_offset : 在 y 轴上的平移
'''
src_data = []
for data in mac5:
src_data.append(data)
for data in mac10:
src_data.append(data)
for data in mac20:
src_data.append(data)
mac5_normalize_data = mac5
mac10_normalize_data = mac10
mac20_normalize_data = mac20
min_data = min(src_data)
max_data = max(src_data)
data_len = len(mac5)
for idx in range(data_len):
if (max_data-min_data) == 0:
mac5_normalize_data[idx] = amplify_val + y_offset
mac10_normalize_data[idx] = amplify_val + y_offset
mac20_normalize_data[idx] = amplify_val + y_offset
else:
mac5_normalize_data[idx] = ( (mac5[idx]-min_data)/(max_data-min_data) )*amplify_val + y_offset
mac10_normalize_data[idx] = ( (mac10[idx]-min_data)/(max_data-min_data) )*amplify_val + y_offset
mac20_normalize_data[idx] = ( (mac20[idx]-min_data)/(max_data-min_data) )*amplify_val + y_offset
return mac5_normalize_data,mac10_normalize_data,mac20_normalize_data
def price_normalization(open_price, close_price, low_price, high_price, amplify_val, y_offset):
'''
open_price : open_price 原始数据序列
close_price : close_price 原始数据序列
low_price : low_price 原始数据序列
high_price : high_price 原始数据序列
amplify_val : 放大系数
y_offset : 在 y 轴上的平移
'''
src_data = []
for data in open_price:
src_data.append(data)
for data in close_price:
src_data.append(data)
for data in low_price:
src_data.append(data)
for data in high_price:
src_data.append(data)
open_price_normalize = open_price
close_price_normalize = close_price
low_price_normalize = low_price
high_price_normalize = high_price
min_data = min(src_data)
max_data = max(src_data)
data_len = len(open_price)
for idx in range(data_len):
if (max_data-min_data) == 0:
open_price_normalize[idx] = amplify_val + y_offset
close_price_normalize[idx] = amplify_val + y_offset
low_price_normalize[idx] = amplify_val + y_offset
high_price_normalize[idx] = amplify_val + y_offset
else:
open_price_normalize[idx] = ( (open_price[idx]-min_data)/(max_data-min_data) )*amplify_val + y_offset
close_price_normalize[idx] = ( (close_price[idx]-min_data)/(max_data-min_data) )*amplify_val + y_offset
low_price_normalize[idx] = ( (low_price[idx]-min_data)/(max_data-min_data) )*amplify_val + y_offset
high_price_normalize[idx] = ( (high_price[idx]-min_data)/(max_data-min_data) )*amplify_val + y_offset
return open_price_normalize,close_price_normalize,low_price_normalize,high_price_normalize
def draw_picture(csv_path, image_path):
data = pd.read_csv(csv_path)
row_0 = list(data.loc[0])
column_num = len(row_0)
row_num = data.iloc[:,0].size
'''
'Code', 'DisplayName', 'Name', 'Date', 'OpenPrice', 'LowPrice', 'HighPrice', 'ClosePrice', 'ChangePercent',
'MACD', 'MACD_DIF', 'MACD_DEA', 'DMA_DIF', 'DMA_DIFMA', 'DMA_DIF_2', 'turnover_ratio', 'MAC5', 'MAC10', 'MAC20', 'MAC60', 'MAC120'
'''
x_date = np.arange(0, row_num)
# 价格
y_OpenPrice = list(data.iloc[:,4])
y_LowPrice = list(data.iloc[:,5])
y_HighPrice = list(data.iloc[:,6])
y_ClosePrice = list(data.iloc[:,7])
# 均线
y_MAC5 = list(data.iloc[:,16])
y_MAC10 = list(data.iloc[:,17])
y_MAC20 = list(data.iloc[:,18])
# 还原均线的实际价格
for idx,mac5 in enumerate(y_MAC5):
y_MAC5[idx] = mac5 * y_ClosePrice[idx]
for idx,mac10 in enumerate(y_MAC10):
y_MAC10[idx] = mac10 * y_ClosePrice[idx]
for idx,mac20 in enumerate(y_MAC20):
y_MAC20[idx] = mac20 * y_ClosePrice[idx]
# 涨跌幅,换手率
y_ChangePercent = list(data.iloc[:,8])
y_TurnoverRatio = list(data.iloc[:,15])
# MACD
y_MACD = list(data.iloc[:,9])
# 将数据进行归一化处理
y_OpenPrice,y_ClosePrice,y_LowPrice,y_HighPrice = price_normalization(y_OpenPrice, y_ClosePrice, y_LowPrice, y_HighPrice, 10, 10)
y_MAC5,y_MAC10,y_MAC20 = mac_normalization(y_MAC5, y_MAC10, y_MAC20, 8, 2)
y_TurnoverRatio = data_normalization(y_TurnoverRatio, 2, 2)
# 对 ChangePercent 的数据进行缩放, 使其在 [-2, 2] 范围内
min_ChangePercent = min(y_ChangePercent)
max_ChangePercent = max(y_ChangePercent)
max_ChangePercent_abs = max_ChangePercent
if (0-min_ChangePercent) > max_ChangePercent_abs:
max_ChangePercent_abs = 0 - min_ChangePercent
ChangePercent_coefficient = 2/max_ChangePercent_abs
for idx in range(len(y_ChangePercent)):
y_ChangePercent[idx] *= ChangePercent_coefficient
# 对 MACD 的数据进行缩放, 使其在 [-2, 2] 范围内
min_macd = min(y_MACD)
max_macd = max(y_MACD)
max_macd_abs = max_macd
if (0-min_macd) > max_macd_abs:
max_macd_abs = 0 - min_macd
macd_coefficient = 2/max_macd_abs
for idx in range(len(y_MACD)):
y_MACD[idx] *= macd_coefficient
#设置图像大小
plt.figure(figsize=(15,10), dpi=100, facecolor='white', frameon=False)
plt.plot(x_date, y_ClosePrice, label="close price", color='black', linewidth=1)
plt.plot(x_date, y_MAC5, label="MAC5", color='red', linewidth=2)
plt.plot(x_date, y_MAC10, label="MAC10", color='green', linewidth=2)
plt.plot(x_date, y_MAC20, label="MAC20", color='blue', linewidth=2)
plt.plot(x_date, y_ChangePercent, label="ChangePt", color='purple', linewidth=2)
plt.plot(x_date, y_TurnoverRatio, label="TurnRatio", color='gray', linewidth=2)
plt.plot(x_date, y_MACD, label="MACD", color='gray')
# 画 价格 竖线
for idx in range(len(x_date)):
linewidth_val = 10
color_val = "red"
if y_OpenPrice[idx] > y_ClosePrice[idx]:
color_val = "green"
plt.vlines(idx, y_OpenPrice[idx], y_ClosePrice[idx], color=color_val,alpha=1,linestyle='solid',linewidth=linewidth_val)
plt.vlines(idx, y_LowPrice[idx], y_HighPrice[idx], color=color_val,alpha=1,linestyle='solid',linewidth=1)
# 画 MACD 竖线
for idx in range(len(x_date)):
linewidth_val = 1
last_idx = idx - 1
if last_idx < 0:
last_idx = 0
if y_MACD[idx] >= 0:
plt.vlines(idx, 0, y_MACD[idx], color='red',alpha=1,linestyle='solid',linewidth=linewidth_val)
plt.fill_between(x=x_date[last_idx:idx+1], y1=0, y2=y_MACD[last_idx:idx+1], facecolor='red', alpha=0.3)
else:
plt.vlines(idx, 0, y_MACD[idx], color='green',alpha=1,linestyle='solid',linewidth=linewidth_val)
plt.fill_between(x=x_date[last_idx:idx+1], y1=0, y2=y_MACD[last_idx:idx+1], facecolor='green', alpha=0.3)
# 画 TurnoverRatio 竖线
for idx in range(len(x_date)):
linewidth_val = 1
plt.vlines(idx, 2, y_TurnoverRatio[idx], color='gray',alpha=1,linestyle='solid',linewidth=linewidth_val)
# 填充 TurnoverRatio 曲线下的区域
plt.fill_between(x=x_date, y1=2, y2=y_TurnoverRatio, facecolor='gray', alpha=0.5)
plt.legend(loc=2) #左上角
plt.grid(True)
plt.grid(color='black',alpha=0.5,linestyle='dashed',linewidth=0.5)
# 保存图像
plt.savefig(image_path, dpi=100)
plt.close()
print("---------- Finished ----------")
调用编写好的绘图函数绘制 K 线图
前面我们把代码都写好了,这里只需简单调用一下即可,记得设置最终 K 线图的保存路径。
image_path = "./backup/stock_k_line.jpg"
draw_picture(CSV_FILE_PATH, image_path)
print("---------- Finished ----------")
结语
以上就是使用 Python 来绘制股票 K 线图的方法了。如需添加其他参数,可以在此基础上稍作修改即可。如果感觉有所收获,可以帮忙点个赞哦,感谢各位支持。
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ15101117,本站将立刻清除。