python kline_关于k Line Chart (k线图)

这段代码提供了用于分析和绘制金融数据的函数,包括plot_day_summary和candlestick等,用于展示开盘价、收盘价、最高价、最低价等信息。通过matplotlib库创建垂直线和矩形条来表示数据,可用于创建K线图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

"""A collection of functions for analyzing and plotting

financial data. User contributions welcome!"""

from __future__ import(absolute_import, division, print_function,

unicode_literals)importnumpy as npimportmatplotlib.pyplot as pltfrom matplotlib importcolors as mcolorsfrom matplotlib.collections importLineCollection, PolyCollectionfrom matplotlib.lines importTICKLEFT, TICKRIGHT, Line2Dfrom matplotlib.patches importRectanglefrom matplotlib.transforms importAffine2Dfrom six.moves importxrange, zipdef plot_day_summary_oclh(ax, quotes, ticksize=3,

colorup='k', colordown='r'):"""Plots day summary

Represent the time, open, close, high, low as a vertical line

ranging from low to high. The left tick is the open and the right

tick is the close.

Parameters

----------

ax : `Axes`

an `Axes` instance to plot to

quotes : sequence of (time, open, close, high, low, ...) sequences

data to plot. time must be in float date format - see date2num

ticksize : int

open/close tick marker in points

colorup : color

the color of the lines where close >= open

colordown : color

the color of the lines where close < open

Returns

-------

lines : list

list of tuples of the lines added (one tuple per quote)"""

return _plot_day_summary(ax, quotes, ticksize=ticksize,

colorup=colorup, colordown=colordown,

ochl=True)def plot_day_summary_ohlc(ax, quotes, ticksize=3,

colorup='k', colordown='r'):"""Plots day summary

Represent the time, open, high, low, close as a vertical line

ranging from low to high. The left tick is the open and the right

tick is the close.

Parameters

----------

ax : `Axes`

an `Axes` instance to plot to

quotes : sequence of (time, open, high, low, close, ...) sequences

data to plot. time must be in float date format - see date2num

ticksize : int

open/close tick marker in points

colorup : color

the color of the lines where close >= open

colordown : color

the color of the lines where close < open

Returns

-------

lines : list

list of tuples of the lines added (one tuple per quote)"""

return _plot_day_summary(ax, quotes, ticksize=ticksize,

colorup=colorup, colordown=colordown,

ochl=False)def _plot_day_summary(ax, quotes, ticksize=3,

colorup='k', colordown='r',

ochl=True):"""Plots day summary

Represent the time, open, high, low, close as a vertical line

ranging from low to high. The left tick is the open and the right

tick is the close.

Parameters

----------

ax : `Axes`

an `Axes` instance to plot to

quotes : sequence of quote sequences

data to plot. time must be in float date format - see date2num

(time, open, high, low, close, ...) vs

(time, open, close, high, low, ...)

set by `ochl`

ticksize : int

open/close tick marker in points

colorup : color

the color of the lines where close >= open

colordown : color

the color of the lines where close < open

ochl: bool

argument to select between ochl and ohlc ordering of quotes

Returns

-------

lines : list

list of tuples of the lines added (one tuple per quote)"""

#unfortunately this has a different return type than plot_day_summary2_*

lines =[]for q inquotes:ifochl:

t, open, close, high, low= q[:5]else:

t, open, high, low, close= q[:5]if close >=open:

color=colorupelse:

color=colordown

vline= Line2D(xdata=(t, t), ydata=(low, high),

color=color,

antialiased=False, #no need to antialias vert lines

)

oline= Line2D(xdata=(t, t), ydata=(open, open),

color=color,

antialiased=False,

marker=TICKLEFT,

markersize=ticksize,

)

cline= Line2D(xdata=(t, t), ydata=(close, close),

color=color,

antialiased=False,

markersize=ticksize,

marker=TICKRIGHT)

lines.extend((vline, oline, cline))

ax.add_line(vline)

ax.add_line(oline)

ax.add_line(cline)

ax.autoscale_view()returnlinesdef candlestick_ochl(ax, quotes, width=0.2, colorup='k', colordown='r',

alpha=1.0):"""Plot the time, open, close, high, low as a vertical line ranging

from low to high. Use a rectangular bar to represent the

open-close span. If close >= open, use colorup to color the bar,

otherwise use colordown

Parameters

----------

ax : `Axes`

an Axes instance to plot to

quotes : sequence of (time, open, close, high, low, ...) sequences

As long as the first 5 elements are these values,

the record can be as long as you want (e.g., it may store volume).

time must be in float days format - see date2num

width : float

fraction of a day for the rectangle width

colorup : color

the color of the rectangle where close >= open

colordown : color

the color of the rectangle where close < open

alpha : float

the rectangle alpha level

Returns

-------

ret : tuple

returns (lines, patches) where lines is a list of lines

added and patches is a list of the rectangle patches added"""

return _candlestick(ax, quotes, width=width, colorup=colorup,

colordown=colordown,

alpha=alpha, ochl=True)def plt_KLineChart(data,stockCode,step=20,fontSize=13,figsize=(12,6)):''':param data: type for DataFrame

:param stockCode: stock code

:param step: xticks step

:param fontSize: font size

:param figsize: window size

:return:'''prices= data[['open', 'high', 'low', 'close']]

fig= plt.figure(figsize=figsize)

ax= fig.add_axes([0.06, 0.15, 0.9, 0.75]) #margin_left margin_bottom width height

candlestick_ohlc(ax, prices, width=0.5, colorup='r', colordown='b')

dataIndex= [str(i).split(' ')[0] for i indata.iloc[::step, :].index]

location=list(range(0,len(data.iloc[:,0]),step))

plt.xticks(location,dataIndex,rotation=45)

font_size= {'size': fontSize}

plt.ylabel('prices',font_size)

plt.title('stock:%s'%(stockCode),font_size)

plt.rcParams['font.sans-serif'] = ['SimHei'] #设置字体为SimHei显示中文

plt.rcParams['axes.unicode_minus'] = False #设置正常显示符号

def candlestick_ohlc(ax, quotes, width=0.2, colorup='k', colordown='r',

alpha=1.0):"""Plot the time, open, high, low, close as a vertical line ranging

from low to high. Use a rectangular bar to represent the

open-close span. If close >= open, use colorup to color the bar,

otherwise use colordown

Parameters

----------

ax : `Axes`

an Axes instance to plot to

quotes : sequence of (time, open, high, low, close, ...) sequences

As long as the first 5 elements are these values,

the record can be as long as you want (e.g., it may store volume).

time must be in float days format - see date2num

width : float

fraction of a day for the rectangle width

colorup : color

the color of the rectangle where close >= open

colordown : color

the color of the rectangle where close < open

alpha : float

the rectangle alpha level

Returns

-------

ret : tuple

returns (lines, patches) where lines is a list of lines

added and patches is a list of the rectangle patches added"""

return _candlestick(ax, quotes, width=width, colorup=colorup,

colordown=colordown,

alpha=alpha, ochl=False)def _candlestick(ax, quotes, width=0.2, colorup='k', colordown='r',

alpha=1.0, ochl=True):"""Plot the time, open, high, low, close as a vertical line ranging

from low to high. Use a rectangular bar to represent the

open-close span. If close >= open, use colorup to color the bar,

otherwise use colordown

Parameters

----------

ax : `Axes`

an Axes instance to plot to

quotes : sequence of quote sequences

data to plot. time must be in float date format - see date2num

(time, open, high, low, close, ...) vs

(time, open, close, high, low, ...)

set by `ochl`

width : float

fraction of a day for the rectangle width

colorup : color

the color of the rectangle where close >= open

colordown : color

the color of the rectangle where close < open

alpha : float

the rectangle alpha level

ochl: bool

argument to select between ochl and ohlc ordering of quotes

Returns

-------

ret : tuple

returns (lines, patches) where lines is a list of lines

added and patches is a list of the rectangle patches added"""OFFSET= width / 2.0lines=[]

patches=[]

quotes=np.column_stack([list(range(len(quotes))), quotes])for q inquotes:ifochl:

t, open, close, high, low= q[:5]else:

t, open, high, low, close= q[:5]if close >=open:

color=colorup

lower=open

height= close -openelse:

color=colordown

lower=close

height= open -close

vline=Line2D(

xdata=(t, t), ydata=(low, high),

color=color,

linewidth=0.5,

antialiased=True,

)

rect=Rectangle(

xy=(t -OFFSET, lower),

width=width,

height=height,

facecolor=color,

edgecolor=color,

)

rect.set_alpha(alpha)

lines.append(vline)

patches.append(rect)

ax.add_line(vline)

ax.add_patch(rect)

ax.autoscale_view()returnlines, patchesdef _check_input(opens, closes, highs, lows, miss=-1):"""Checks that *opens*, *highs*, *lows* and *closes* have the same length.

NOTE: this code assumes if any value open, high, low, close is

missing (*-1*) they all are missing

Parameters

----------

ax : `Axes`

an Axes instance to plot to

opens : sequence

sequence of opening values

highs : sequence

sequence of high values

lows : sequence

sequence of low values

closes : sequence

sequence of closing values

miss : int

identifier of the missing data

Raises

------

ValueError

if the input sequences don't have the same length"""

def _missing(sequence, miss=-1):"""Returns the index in *sequence* of the missing data, identified by

*miss*

Parameters

----------

sequence :

sequence to evaluate

miss :

identifier of the missing data

Returns

-------

where_miss: numpy.ndarray

indices of the missing data"""

return np.where(np.array(sequence) ==miss)[0]

same_length= len(opens) == len(highs) == len(lows) ==len(closes)

_missopens=_missing(opens)

same_missing= ((_missopens == _missing(highs)).all() and(_missopens== _missing(lows)).all() and(_missopens==_missing(closes)).all())if not (same_length andsame_missing):

msg= ("*opens*, *highs*, *lows* and *closes* must have the same"

"length. NOTE: this code assumes if any value open, high,"

"low, close is missing (*-1*) they all must be missing.")raiseValueError(msg)def plot_day_summary2_ochl(ax, opens, closes, highs, lows, ticksize=4,

colorup='k', colordown='r'):"""Represent the time, open, close, high, low, as a vertical line

ranging from low to high. The left tick is the open and the right

tick is the close.

Parameters

----------

ax : `Axes`

an Axes instance to plot to

opens : sequence

sequence of opening values

closes : sequence

sequence of closing values

highs : sequence

sequence of high values

lows : sequence

sequence of low values

ticksize : int

size of open and close ticks in points

colorup : color

the color of the lines where close >= open

colordown : color

the color of the lines where close < open

Returns

-------

ret : list

a list of lines added to the axes"""

returnplot_day_summary2_ohlc(ax, opens, highs, lows, closes, ticksize,

colorup, colordown)def plot_day_summary2_ohlc(ax, opens, highs, lows, closes, ticksize=4,

colorup='k', colordown='r'):"""Represent the time, open, high, low, close as a vertical line

ranging from low to high. The left tick is the open and the right

tick is the close.

*opens*, *highs*, *lows* and *closes* must have the same length.

NOTE: this code assumes if any value open, high, low, close is

missing (*-1*) they all are missing

Parameters

----------

ax : `Axes`

an Axes instance to plot to

opens : sequence

sequence of opening values

highs : sequence

sequence of high values

lows : sequence

sequence of low values

closes : sequence

sequence of closing values

ticksize : int

size of open and close ticks in points

colorup : color

the color of the lines where close >= open

colordown : color

the color of the lines where close < open

Returns

-------

ret : list

a list of lines added to the axes"""_check_input(opens, highs, lows, closes)

rangeSegments= [((i, low), (i, high)) for i, low, high inzip(xrange(len(lows)), lows, highs)if low != -1]#the ticks will be from ticksize to 0 in points at the origin and

#we'll translate these to the i, close location

openSegments = [((-ticksize, 0), (0, 0))]#the ticks will be from 0 to ticksize in points at the origin and

#we'll translate these to the i, close location

closeSegments =[((0, 0), (ticksize, 0))]

offsetsOpen= [(i, open) for i, open inzip(xrange(len(opens)), opens)if open != -1]

offsetsClose= [(i, close) for i, close inzip(xrange(len(closes)), closes)if close != -1]

scale= ax.figure.dpi * (1.0 / 72.0)

tickTransform= Affine2D().scale(scale, 0.0)

colorup=mcolors.to_rgba(colorup)

colordown=mcolors.to_rgba(colordown)

colord={True: colorup, False: colordown}

colors= [colord[open < close] for open, close inzip(opens, closes)if open != -1 and close != -1]

useAA= 0, #use tuple here

lw = 1, #and here

rangeCollection =LineCollection(rangeSegments,

colors=colors,

linewidths=lw,

antialiaseds=useAA,

)

openCollection=LineCollection(openSegments,

colors=colors,

antialiaseds=useAA,

linewidths=lw,

offsets=offsetsOpen,

transOffset=ax.transData,

)

openCollection.set_transform(tickTransform)

closeCollection=LineCollection(closeSegments,

colors=colors,

antialiaseds=useAA,

linewidths=lw,

offsets=offsetsClose,

transOffset=ax.transData,

)

closeCollection.set_transform(tickTransform)

minpy, maxx=(0, len(rangeSegments))

miny= min([low for low in lows if low != -1])

maxy= max([high for high in highs if high != -1])

corners=(minpy, miny), (maxx, maxy)

ax.update_datalim(corners)

ax.autoscale_view()#add these last

ax.add_collection(rangeCollection)

ax.add_collection(openCollection)

ax.add_collection(closeCollection)returnrangeCollection, openCollection, closeCollectiondef candlestick2_ochl(ax, opens, closes, highs, lows, width=4,

colorup='k', colordown='r',

alpha=0.75):"""Represent the open, close as a bar line and high low range as a

vertical line.

Preserves the original argument order.

Parameters

----------

ax : `Axes`

an Axes instance to plot to

opens : sequence

sequence of opening values

closes : sequence

sequence of closing values

highs : sequence

sequence of high values

lows : sequence

sequence of low values

width : int

size of open and close ticks in points

colorup : color

the color of the lines where close >= open

colordown : color

the color of the lines where close < open

alpha : float

bar transparency

Returns

-------

ret : tuple

(lineCollection, barCollection)"""

return candlestick2_ohlc(ax, opens, highs, lows, closes, width=width,

colorup=colorup, colordown=colordown,

alpha=alpha)def candlestick2_ohlc(ax, opens, highs, lows, closes, width=4,

colorup='k', colordown='r',

alpha=0.75):"""Represent the open, close as a bar line and high low range as a

vertical line.

NOTE: this code assumes if any value open, low, high, close is

missing they all are missing

Parameters

----------

ax : `Axes`

an Axes instance to plot to

opens : sequence

sequence of opening values

highs : sequence

sequence of high values

lows : sequence

sequence of low values

closes : sequence

sequence of closing values

width : int

size of open and close ticks in points

colorup : color

the color of the lines where close >= open

colordown : color

the color of the lines where close < open

alpha : float

bar transparency

Returns

-------

ret : tuple

(lineCollection, barCollection)"""_check_input(opens, highs, lows, closes)

delta= width / 2.

barVerts= [((i -delta, open),

(i-delta, close),

(i+delta, close),

(i+delta, open))for i, open, close inzip(xrange(len(opens)), opens, closes)if open != -1 and close != -1]

rangeSegments=[((i, low), (i, high))for i, low, high inzip(xrange(len(lows)), lows, highs)if low != -1]

colorup=mcolors.to_rgba(colorup, alpha)

colordown=mcolors.to_rgba(colordown, alpha)

colord={True: colorup, False: colordown}

colors= [colord[open

useAA= 0, #use tuple here

lw = 0.5, #and here

rangeCollection =LineCollection(rangeSegments,

colors=colors,

linewidths=lw,

antialiaseds=useAA,

)

barCollection=PolyCollection(barVerts,

facecolors=colors,

edgecolors=colors,

antialiaseds=useAA,

linewidths=lw,

)

minx, maxx=0, len(rangeSegments)

miny= min([low for low in lows if low != -1])

maxy= max([high for high in highs if high != -1])

corners=(minx, miny), (maxx, maxy)

ax.update_datalim(corners)

ax.autoscale_view()#add these last

ax.add_collection(rangeCollection)

ax.add_collection(barCollection)returnrangeCollection, barCollectiondefvolume_overlay(ax, opens, closes, volumes,

colorup='k', colordown='r',

width=4, alpha=1.0):"""Add a volume overlay to the current axes. The opens and closes

are used to determine the color of the bar. -1 is missing. If a

value is missing on one it must be missing on all

Parameters

----------

ax : `Axes`

an Axes instance to plot to

opens : sequence

a sequence of opens

closes : sequence

a sequence of closes

volumes : sequence

a sequence of volumes

width : int

the bar width in points

colorup : color

the color of the lines where close >= open

colordown : color

the color of the lines where close < open

alpha : float

bar transparency

Returns

-------

ret : `barCollection`

The `barrCollection` added to the axes"""colorup=mcolors.to_rgba(colorup, alpha)

colordown=mcolors.to_rgba(colordown, alpha)

colord={True: colorup, False: colordown}

colors= [colord[open

delta= width / 2.

bars= [((i - delta, 0), (i - delta, v), (i + delta, v), (i +delta, 0))for i, v inenumerate(volumes)if v != -1]

barCollection=PolyCollection(bars,

facecolors=colors,

edgecolors=((0, 0, 0, 1),),

antialiaseds=(0,),

linewidths=(0.5,),

)

ax.add_collection(barCollection)

corners=(0, 0), (len(bars), max(volumes))

ax.update_datalim(corners)

ax.autoscale_view()#add these last

returnbarCollectiondefvolume_overlay2(ax, closes, volumes,

colorup='k', colordown='r',

width=4, alpha=1.0):"""Add a volume overlay to the current axes. The closes are used to

determine the color of the bar. -1 is missing. If a value is

missing on one it must be missing on all

nb: first point is not displayed - it is used only for choosing the

right color

Parameters

----------

ax : `Axes`

an Axes instance to plot to

closes : sequence

a sequence of closes

volumes : sequence

a sequence of volumes

width : int

the bar width in points

colorup : color

the color of the lines where close >= open

colordown : color

the color of the lines where close < open

alpha : float

bar transparency

Returns

-------

ret : `barCollection`

The `barrCollection` added to the axes"""

return volume_overlay(ax, closes[:-1], closes[1:], volumes[1:],

colorup, colordown, width, alpha)defvolume_overlay3(ax, quotes,

colorup='k', colordown='r',

width=4, alpha=1.0):"""Add a volume overlay to the current axes. quotes is a list of (d,

open, high, low, close, volume) and close-open is used to

determine the color of the bar

Parameters

----------

ax : `Axes`

an Axes instance to plot to

quotes : sequence of (time, open, high, low, close, ...) sequences

data to plot. time must be in float date format - see date2num

width : int

the bar width in points

colorup : color

the color of the lines where close1 >= close0

colordown : color

the color of the lines where close1 < close0

alpha : float

bar transparency

Returns

-------

ret : `barCollection`

The `barrCollection` added to the axes"""colorup=mcolors.to_rgba(colorup, alpha)

colordown=mcolors.to_rgba(colordown, alpha)

colord={True: colorup, False: colordown}

dates, opens, highs, lows, closes, volumes= list(zip(*quotes))

colors= [colord[close1 >=close0]for close0, close1 in zip(closes[:-1], closes[1:])if close0 != -1 and close1 != -1]

colors.insert(0, colord[closes[0]>=opens[0]])

right= width / 2.0left= -width / 2.0bars=[((left, 0), (left, volume), (right, volume), (right, 0))for d, open, high, low, close, volume inquotes]

sx= ax.figure.dpi * (1.0 / 72.0) #scale for points

sy = ax.bbox.height /ax.viewLim.height

barTransform=Affine2D().scale(sx, sy)

dates= [d for d, open, high, low, close, volume inquotes]

offsetsBars= [(d, 0) for d indates]

useAA= 0, #use tuple here

lw = 0.5, #and here

barCollection =PolyCollection(bars,

facecolors=colors,

edgecolors=((0, 0, 0, 1),),

antialiaseds=useAA,

linewidths=lw,

offsets=offsetsBars,

transOffset=ax.transData,

)

barCollection.set_transform(barTransform)

minpy, maxx=(min(dates), max(dates))

miny=0

maxy= max([volume for d, open, high, low, close, volume inquotes])

corners=(minpy, miny), (maxx, maxy)

ax.update_datalim(corners)#print 'datalim', ax.dataLim.bounds

#print 'viewlim', ax.viewLim.bounds

ax.add_collection(barCollection)

ax.autoscale_view()returnbarCollectiondefindex_bar(ax, vals,

facecolor='b', edgecolor='l',

width=4, alpha=1.0, ):"""Add a bar collection graph with height vals (-1 is missing).

Parameters

----------

ax : `Axes`

an Axes instance to plot to

vals : sequence

a sequence of values

facecolor : color

the color of the bar face

edgecolor : color

the color of the bar edges

width : int

the bar width in points

alpha : float

bar transparency

Returns

-------

ret : `barCollection`

The `barrCollection` added to the axes"""facecolors=(mcolors.to_rgba(facecolor, alpha),)

edgecolors=(mcolors.to_rgba(edgecolor, alpha),)

right= width / 2.0left= -width / 2.0bars=[((left, 0), (left, v), (right, v), (right, 0))for v in vals if v != -1]

sx= ax.figure.dpi * (1.0 / 72.0) #scale for points

sy = ax.bbox.height /ax.viewLim.height

barTransform=Affine2D().scale(sx, sy)

offsetsBars= [(i, 0) for i, v in enumerate(vals) if v != -1]

barCollection=PolyCollection(bars,

facecolors=facecolors,

edgecolors=edgecolors,

antialiaseds=(0,),

linewidths=(0.5,),

offsets=offsetsBars,

transOffset=ax.transData,

)

barCollection.set_transform(barTransform)

minpy, maxx=(0, len(offsetsBars))

miny=0

maxy= max([v for v in vals if v != -1])

corners=(minpy, miny), (maxx, maxy)

ax.update_datalim(corners)

ax.autoscale_view()#add these last

ax.add_collection(barCollection)return barCollection

K线图Kline chart),也称为 candlestick chart 或 OHLC 图表,是股票和交易市场常用的一种可视化工具,用于展示一段时间内资产价格的开盘价、收盘价、最高价和最低价。如果你想在K线图上修改技术指标的样式,通常是在数据可视化库如Python的Plotly、Matplotlib或JavaScript的Highcharts等中操作。 例如,在Python的`plotly.graph_objects`中,你可以这样做: ```python import plotly.graph_objects as go fig = go.Figure(data=go.Candlestick(...)) # 填充你的K线数据 # 修改MA(移动平均线)的样式 ma_line = fig.add_trace(go.Scatter(x=data.index, y=data['MA'], line=dict(dash='dash', color='red'))) # 修改其他指标如RSI(相对强弱指数)的样式 rsi_line = fig.add_trace(go.Scatter(x=data.index, y=data['RSI'], marker_color='green')) # 设置线宽、颜色、虚线等属性 ma_line.update_layout(hovermode="x unified", showlegend=False) rsi_line.update_traces(line_width=2, opacity=0.8) fig.show() ``` 在这里,你需要替换`data`、`MA`和`RSI`为实际的技术指标数据,然后通过`.update()`方法更改线条样式、颜色、宽度等属性。 如果你使用的是JavaScript的Highcharts,其API也有相应的设置选项: ```javascript Highcharts.chart('container', { series: [{ type: 'candlestick', data: ... // K线数据 }, { name: 'MA', type: 'line', data: ..., dashStyle: 'shortdot', // 更改线型 color: 'red' }, { name: 'RSI', data: ..., lineWidth: 2, pointInterval: 48 * 60 * 1000, // 如果是分钟数据,需要调整间隔 color: 'green' }], ... }); ``` 记得根据具体使用的图表库文档来查阅详细的修改指标样式的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值