예제) mplfinance marketcolor_overrides 적용 방법

작성자: [관리자] 하얀설표

2024.11.24 15:44 (KST) 작성됨






marketcolor_overrides 설정 방법(일부 캔들의 색상을 변경하는 방법)

개인적으로 양봉이더라도 주가가 하락한 경우에는 몸통이 하얀색인 양봉을, 음봉이지만 주가가 상승한 경우에는 몸통이 하얀색인 음봉을 설정해서 사용하는 것을 좋아한다.
나와 같은 사람들을 위한 옵션이 존재하고, 안내 문서도 존재하지만.. 문서대로 따라하면 에러만 발생할 뿐, 실제 적용이 되지 않는다.
(dict style이 아닌 str 색상 지정은 정상 작동한다.)

 

문서 : https://github.com/matplotlib/mplfinance/blob/master/examples/marketcolor_overrides.ipynb

 

str이 아닌 dict 형식의 스타일 오브젝트 적용을 시도했다면 아마도 다음과 같은 에러를 맞이하게 될 것이다.

Traceback (most recent call last):
  File "c:\seolpyo\mplfinance\test.py", line 159, in <module>
    fig, ax = mpf.plot(
              ^^^^^^^^^
  File "C:\seolpyo\site-packages\mplfinance\plotting.py", line 412, in plot
    config = _process_kwargs(kwargs, _valid_plot_kwargs())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\seolpyo\site-packages\mplfinance\_arg_validators.py", line 350, in _process_kwargs
    raise TypeError('kwarg "'+key+'" validator returned False for value: "'+str(value)+'"\n    '+v)
TypeError: kwarg "marketcolor_overrides" validator returned False for value: "[None, None, {style variable}, None, None]"
    def _mco_validator(value):        # marketcolor overrides validator
    if isinstance(value,dict):    # not yet supported, but maybe we will have other
        if 'colors' not in value: # kwargs related to mktcolor overrides (ex: `mco_faceonly`)
            raise ValueError('`marketcolor_overrides` as dict must contain `colors` key.')
        colors = value['colors']
    else:
        colors = value
    if not isinstance(colors,(list,tuple,np.ndarray)):
        return False
    return all([(c is None or
                 _mpf_is_color_like(c) or
                 _is_marketcolor_object(c) ) for c in colors])

 

이것을 해결하기 위해 상당히 많은 시간을 들여야 했는데, 문제는 깃헙에서 잘못된 방식을 가르쳐주고 있는 것이 원인이었다.
아마도 패키지 업데이트 과정에서 적용 방식이 변경된 것으로 인한 것으로 생각된다.

영어 문서에서는 이 해결방법을 찾을 수 없고, 중국어로 된 문서에서 문제 해결 방법을 찾을 수 있었다.

참고 링크 : https://blog.csdn.net/aobulaien001/article/details/135277426

 

다음과 같이 개별로 적용할 style variable(list)을 생성한 다음, 개별 스타일을 적용하지 않는 index에는 None을, 개별 스타일을 적용할 index에는 dict 형식으로 작성된 style variable을 넣어준다.
그리고 이렇게 생성한 mco variable을 marketcolor_overrides arg로 전달해주면 된다.

...

mco = [None] * len(df)
style_empty = {k: {'up': 'w', 'down': 'w'} if k in {'candle'} else v for k, v in marketcolor.items()}
# 색상 override
for n, (index, v) in enumerate(df.iterrows()):
    # 양봉 and 종가 < 전일종가
    if v['Open'] < v['Close'] and v['Close'] < pre: mco[n] = [style_empty]
    # 음봉 and 전일종가 < 종가
    if v['Close'] < v['Open'] and pre < v['Close']: mco[n] = [style_empty]
    pre = v['Close']

# 캔들스틱 차트 생성
mpf.plot(
    df,
    type='candle', # 차트 형식
    style=style, # 차트 스타일
    title='주가 차트', # 이름
    ylabel='가격[원]', # 주가 y축 라벨
    volume=True, # 거래량 표시
    ylabel_lower='거래량[주]', # 거래량 y축 라벨
    mav=(5, 10, 20, 60, 120), # 가격이동평균선
    marketcolor_overrides=mco, # 캔들 색상 덮어쓰기
)

 

marketcolor overrides 적용 전후 비교

marketcolor_overrides 옵션 설정 전후(좌: 설정 전, 우: 설정 후)






추천 (0)


글 목록

댓글을 달 수 없는 게시물입니다.


"분류없음" 카테고리의 #Python, #예제 관련 게시물