我在使用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
改后的效果图: