1. 首页 > 基金定投

股市走势分析图用什么软件画(如何使用 Python 绘制股票 K 线图)

前言

关注股市行情的朋友应该都在其他软件上见过或者使用过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,本站将立刻清除。

联系我们

在线咨询:点击这里给我发消息

微信号:666666