本益比河流圖|Plotly-Filled Area Plot應用教學 - FinLab
文章推薦指數: 80 %
高成長股或獲利不夠穩定的企業不適用,本益比河流圖趨勢變化會太過劇烈。
Skiptocontent
Tags:finlab量化平台教學,Plotly
內容目錄
隱藏
1
本益比河流圖的用途
2
如何繪製?
2.1
生成資料
2.2
繪圖
3
封裝函數與多元應用
4
總結
本益比河流圖的用途
取標的一段時間內的本益比上下限,再決定要分割幾層,用來判斷獲利或成長性穩定的股票所處於的本益比區間。
高成長股或獲利不夠穩定的企業不適用,本益比河流圖趨勢變化會太過劇烈。
本益比河流圖上升或層距擴大代表獲利逐漸成長,買在河流圖中下緣是理想位置。
本益比河流圖下降或層距縮小代表獲利逐步下掉,若股價位於河流圖上緣則風險偏高。
適合使用本益比的穩定企業不適合使用本益比的不穩定企業如何繪製?
Plotly套件提供了FilledAreaPlot函數讓我們可以應用繪製本益比河流圖。
使用Scatter物件帶入fill參數就能將折線圖填充區域顏色。
importplotly.graph_objectsasgo
#設定畫布
fig=go.Figure()
#使用add_trace加入線段
fig.add_trace(go.Scatter(x=[1,2,3,4],y=[0,2,3,5],fill='tozeroy'))#filldowntoxaxis
fig.add_trace(go.Scatter(x=[1,2,3,4],y=[3,5,1,7],fill='tonexty'))#filltotrace0y
fig.show()
我們將步驟拆解為二,第一步是生成繪製所需要的資料,第二步是將資料套入繪圖function。
生成資料
pe/close先求出eps,再用split_range設定本益比上下限要分幾層河流。
河流邊界為各區間本益比倍數,與股價相乘後為該邊界本益比對應的股價序列。
fromfinlabimportdata
importpandasaspd
stock_id='2330'
#幾層河流
split_range=8
close=data.get('price:收盤價')
pe=data.get('price_earning_ratio:本益比')
df=pe[stock_id]
max_value=df.max()
min_value=df.min()
#求本益比上下限間距
quan_value=(max_value-min_value)/split_range
#求本益比各河流倍數
river_borders=[round(min_value+quan_value*i,2)foriinrange(0,split_range+1)]
#算出eps
result=(close[stock_id]/df).dropna().to_frame()
index_name='pe/close'
result.columns=[index_name]
result['close']=close[stock_id]
result['pe']=pe[stock_id]
#各本益比對應價格
forrinriver_borders:
col_name=f"{r}pe"
result[col_name]=result[index_name]*r
result=round(result,2)
資料目標範例如下列dataframe:
繪圖
fromfinlabimportdata
importpandasaspd
importplotly.graph_objectsasgo
importplotly.expressaspx
df=result.copy()
#挑出欄位有數字的來畫河流圖,過濾pe/close,close,pe
col_name_set=[iforiindf.columnsifany(map(str.isdigit,i))]
fig=go.Figure()
#執行迴圈填入資料序列
forn,cinenumerate(col_name_set):
#第一道邊界下不要填充
ifn==0:
fill_mode=None
else:
fill_mode='tonexty'
#colors.qualitative.Prism填入河流圖階層顏色
fig.add_trace(
go.Scatter(x=df.index,y=df[c],fill=fill_mode,line=dict(width=0,color=px.colors.qualitative.Prism[n]),
name=c))
#製作客製化data項目用來製作hovertemplate,顯示浮動資料
customdata=[(c,p)forc,pinzip(df['close'],df['pe'])]
hovertemplate="
date:%{x|%Y/%m/%d}
close:%{customdata[0]}"+f"
'pe'"+":%{customdata[1]}"
fig.add_trace(go.Scatter(x=df.index,y=df['close'],line=dict(width=2.5,color='#2e4391'),customdata=customdata,
hovertemplate=hovertemplate,name='close'))
#取股名製作title
security_categories=data.get('security_categories').set_index(['stock_id'])
stock_name=security_categories.loc[stock_id]['name']
fig.update_layout(title=f"{stock_id}{stock_name}{'PE'}RiverChart",
template="ggplot2",
yaxis=dict(
title='price',
),
#hovermode='xunified',
)
#顯示十字線
fig.update_xaxes(showspikes=True)
fig.update_yaxes(showspikes=True)
注意以下程式,若第一道邊界下沒設None,會變成以下形式,最低一層會被填入很大一塊區域,與河流間距不相符,有礙觀察,因此我們要讓第一道邊界以下不要填充才比較好。
forn,cinenumerate(col_name_set):
fill_mode='tonexty'
封裝函數與多元應用
除了本益比河流圖,常用的還有股價淨值比河流圖,計算和應用方式和本益比河流圖大同小異,我們可以將上面的程式封裝成函數,設定一個mode參數去選擇我們要哪一種河流圖。
完整程式如下:
fromfinlabimportdata
importpandasaspd
importplotly.graph_objectsasgo
importplotly.expressaspx
#控制資料範圍
defdf_date_filter(df,start=None,end=None):
ifstart:
df=df[df.index>=start]
ifend:
df=df[df.index<=end]
returndf
defget_pe_river_data(start=None,end=None,stock_id='2330',mode='pe',split_range=6):
ifmodenotin['pe','pb']:
print('modeerror')
returnNone
close=df_date_filter(data.get('price:收盤價'),start,end)
pe=df_date_filter(data.get('price_earning_ratio:本益比'),start,end)
pb=df_date_filter(data.get('price_earning_ratio:股價淨值比'),start,end)
df=eval(mode)
ifstock_idnotindf.columns:
print('stock_idinputisnotindata.')
returnNone
df=df[stock_id]
max_value=df.max()
min_value=df.min()
quan_value=(max_value-min_value)/split_range
river_borders=[round(min_value+quan_value*i,2)foriinrange(0,split_range+1)]
result=(close[stock_id]/df).dropna().to_frame()
index_name=f'{mode}/close'
result.columns=[index_name]
result['close']=close[stock_id]
result['pe']=pe[stock_id]
result['pb']=pb[stock_id]
forrinriver_borders:
col_name=f"{r}{mode}"
result[col_name]=result[index_name]*r
result=round(result,2)
returnresult
defplot_tw_stock_river(start=None,end=None,stock_id='2330',mode='pe',split_range=8):
"""PlotRiverchartfortw_stock
UsemaximumorminimumPE(PB)tocalculateRiver.
itisgoodforjudgingthehighandlowinthehistoricalinterval.
Args:
start(str):Thedateofdatastartpoint.ex:2021-01-02
end(str):Thedateofdataendpoint.ex:2021-01-05
stock_id(str):Targetidintwstockmarketex:2330.
mode(str):'pe'or'pb'.
split_range(int):thequantityofriverborders.
Returns:
figure
"""
df=get_pe_river_data(start,end,stock_id,mode,split_range)
ifdfisNone:
print('dataerror')
returnNone
col_name_set=[iforiindf.columnsifany(map(str.isdigit,i))]
fig=go.Figure()
forn,cinenumerate(col_name_set):
ifn==0:
fill_mode=None
else:
fill_mode='tonexty'
fig.add_trace(
go.Scatter(x=df.index,y=df[c],fill=fill_mode,line=dict(width=0,color=px.colors.qualitative.Prism[n]),
name=c))
customdata=[(c,p)forc,pinzip(df['close'],df[mode])]
hovertemplate="
date:%{x|%Y/%m/%d}
close:%{customdata[0]}"+f"
{mode}"+":%{customdata[1]}"
fig.add_trace(go.Scatter(x=df.index,y=df['close'],line=dict(width=2.5,color='#2e4391'),customdata=customdata,
hovertemplate=hovertemplate,name='close'))
security_categories=data.get('security_categories').set_index(['stock_id'])
stock_name=security_categories.loc[stock_id]['name']
fig.update_layout(title=f"{stock_id}{stock_name}{mode.upper()}RiverChart",
template="ggplot2",
yaxis=dict(
title='price',
),
#hovermode='xunified',
)
fig.update_xaxes(showspikes=True)
fig.update_yaxes(showspikes=True)
returnfig
#plot_tw_stock_river(stock_id='2330',mode='pe',split_range=8)
plot_tw_stock_river(stock_id='2330',mode='pb',split_range=8)
股價淨值比河流圖總結
使用finlab和plotly套件可以做出各式各樣視覺化的應用,只要學會一些小技巧,就能客製化屬於自己的看盤工具。
對本篇程式有興趣的可以參考文底連結附檔,記得要先註冊Finlab量化平台才可有權限使用程式喔!
colab程式範例
覺得我們的文章有幫助到您,就把它分享給身邊的人吧!
Sharethiscontent
Opensinanewwindow
Opensinanewwindow
Opensinanewwindow
Opensinanewwindow
Genie
FinLabeditor.
Lovemagicofpythontoexplorethetradingworld.
YouMightAlsoLike
ADL指標幫你判斷台股盤勢|順勢為王|教你走出拉G盤的迷霧|
2021-04-30
FinLab量化平台入門者操作指南
2021-10-30
本益比選股策略|產業因子分析
2021-09-23
營建業選股策略|財報指標-流動合約負債
2021-08-13
Python財報月報股價爬蟲,台股資料庫終極解決之道!
2021-11-08
進化後的本益比|本益成長比選股策略
2021-09-24
Plotly&Dash初體驗|已實現損益儀表板|DashBoard製作教學(1)
2021-05-03
每週收到新知識
只要有新文章,立刻用Email通知你
加入
Emailisrequired.
Emailnotvalid.
Thanksforyoursubscription.
Failedtosubscribe,pleasecontactadmin.
關於網站
FinLab財經實驗室
股票如何選擇?要怎麼學習量化投資?財報、技術指標如何看?FinLab利用股票分析、財經python教學,讓你在在茫茫股海中,找到專屬於自己的投資方法。
Facebook粉絲專頁
FinLabYouTube頻道
Opensinanewtab
近期文章
Finlab量化平台徵稿活動得獎作品營業利益率選股-安正
2022-02-13/
0Comments
ATR指標應用|肯特納通道
2022-02-13/
0Comments
Finlab量化平台徵稿活動得獎作品集技術面和籌碼面於一身的的AI選股策略-陳士謀
2022-02-09/
0Comments
文章分類
AI看股票(16)
FinLabYouTube(4)
Python新手教學(18)
PYTHON財經(12)
Uncategorized(3)
加密貨幣(18)
基本面分析(19)
大盤漲跌(10)
實價登入(3)
技術面(14)
投資新手(3)
生產力(7)
籌碼面(5)
股票策略(21)
財報狗分析(5)
財經PYTHON教學(45)
選股策略(27)
量子電腦(1)
Python理財入門課程Python理財進階課程Python加密貨幣實戰課程
延伸文章資訊
- 1本益比河流圖,PE比河流圖的解釋和說明-財報狗教學
利用本益比河流圖,投資人可以看出每股盈餘的成長趨勢,同時透過歷史PE倍數數據區間,股價是否過高過低。 如果股價來到本益比河流圖越下方,代表股價來到一段時間內的本益 ...
- 2判斷股票價格是否合理你要先會看本益比河流圖
富果的本益比河流圖,是以當下的股價除以(過去)近四季的EPS所得出的,根據每日的連續紀錄,以清楚的視覺呈現。紅色代表相對高、綠色代表相對低。 以 ...
- 3本益比河流圖如何使用?文章完整解析本益比河流圖的優缺點
什麼是本益比河流圖? ... 把過去幾年的本益比分成5個區間,分別為低估、偏低、合理、偏高、高估本益比,乘以近12個月(或近4季)的EPS,取得了低估價、偏低價 ...
- 4《本益比河流圖》- 從財務數據中秒懂趨勢 - PressPlay
將過去的股價與本益比兩個數據同時放在圖形之中,就是「本益比河流圖」。這個圖可以幫大家一秒判斷股票現在的價格是否來到本益比相對低的位階唷~是 ...
- 5本益比河流圖|Plotly-Filled Area Plot應用教學 - FinLab
高成長股或獲利不夠穩定的企業不適用,本益比河流圖趨勢變化會太過劇烈。