解决mplfinance绘制箱体图一字涨停k线颜色错误的情况

我在使用mplfinance绘制k线图的时候,发现在一字涨停的情况绘制出来的居然是绿色,有些误导趋势识别,如下。
在这里插入图片描述
我看了源代码,发现mpf判断颜色的依据比较简单,主要下面代码:

路径:mplfinance安装路径下的 _utils.py文件
我的是:C:\Users\10768\AppData\Local\Programs\Python\Python38\Lib\site-packages\mplfinance_utils.py

def _make_updown_color_list(key,marketcolors,opens,closes,overrides=None):
    length = len(opens)
    ups    = [marketcolors[key][ 'up' ]]*length
    downs  = [marketcolors[key]['down']]*length
    if overrides is not None:
        for ix,mco in enumerate(overrides):
            if mco is None: continue
            if mcolors.is_color_like(mco):
                ups[ix]   = mco
                downs[ix] = mco
            else: # assume it is correctly a marketcolors object (dict)
                ups[ix]   = mco[key][ 'up' ]
                downs[ix] = mco[key]['down']
    return [ups[ix] if opens[ix] < closes[ix] else downs[ix] for ix in range(length)]

修改这个函数即可。
修改后的逻辑是:
如果某天开盘价与收盘价相同,则与前一天的收盘价进行比较,来判断是上涨还是下跌。

def _make_updown_color_list(key,marketcolors,opens,closes,overrides=None):
    length = len(opens)
    ups    = [marketcolors[key][ 'up' ]]*length
    downs  = [marketcolors[key]['down']]*length
    if overrides is not None:
        for ix,mco in enumerate(overrides):
            if mco is None: continue
            if mcolors.is_color_like(mco):
                ups[ix]   = mco
                downs[ix] = mco
            else: # assume it is correctly a marketcolors object (dict)
                ups[ix]   = mco[key][ 'up' ]
                downs[ix] = mco[key]['down']
    # return [ups[ix] if opens[ix] < closes[ix] else downs[ix] for ix in range(length)]
    # # 无实体的箱体颜色根据前一天的价格来比较决定
    result = []
    for ix in range(length):
        if opens[ix] < closes[ix]:
            result.append(ups[ix])
        elif opens[ix] > closes[ix]:
            result.append(downs[ix])
        elif opens[ix] == closes[ix]:
            # 如果是第一天就出现无实体的情况,则默认阴线
            if ix == 0:
                result.append(downs[ix])
            # 其他情况跟前一天进行比较
            else:
                if opens[ix] > closes[ix-1]:
                    result.append(ups[ix])
                else:
                    result.append(downs[ix])
    return result

修改后,再绘图,效果如下,发现图中一字涨停的k线颜色正确了:
在这里插入图片描述
补充:
成交量的颜色也是有问题,修改方式类似,修改代码如下:

def _updown_colors(upcolor,downcolor,opens,closes,use_prev_close=False):
    # -----------------------------------------------------
    # Note that `nan` values result in `opn < cls` == False
    # In other words, nans don't get plotted by collections
    # but this function will choose DOWN COLOR for nans.
    # -----------------------------------------------------
    if upcolor == downcolor:
        return [upcolor]*len(opens)
    cmap = {True : upcolor, False : downcolor}
    if not use_prev_close:
        # return [ cmap[opn < cls] for opn,cls in zip(opens,closes) ]
        # 解决一字涨停成交量颜色
        result = []
        for i in range(len(opens)):
            if opens[i] == closes[i]:
                if i == 0:
                    result.append(cmap[False])
                else:
                    result.append(cmap[opens[i] > closes[i-1]])
            else:
                result.append(cmap[opens[i] < closes[i]])
        return result
    else:
        first = cmap[opens[0] < closes[0]]
        _list = [ cmap[pre < cls] for cls,pre in zip(closes[1:], closes) ]
        # TODO 这个选项我不用,用的自己修改吧,与上面类似的
        return [first] + _list

改后的效果图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值