本益比河流圖|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
進化後的本益比|本益成長比選股策略
2021-09-24
ADL指標幫你判斷台股盤勢|順勢為王|教你走出拉G盤的迷霧|
2021-04-30
FinLab量化平台入門者操作指南
2021-10-30
Python財報月報股價爬蟲,台股資料庫終極解決之道!
2021-11-08
本益比選股策略|產業因子分析
2021-09-23
Plotly&Dash初體驗|已實現損益儀表板|DashBoard製作教學(1)
2021-05-03
每週收到新知識
只要有新文章,立刻用Email通知你
加入
Emailisrequired.
Emailnotvalid.
Thanksforyoursubscription.
Failedtosubscribe,pleasecontactadmin.
關於網站
FinLab財經實驗室
股票如何選擇?要怎麼學習量化投資?財報、技術指標如何看?FinLab利用股票分析、財經python教學,讓你在在茫茫股海中,找到專屬於自己的投資方法。
Facebook粉絲專頁
FinLabYouTube頻道
Opensinanewtab
近期文章
加密貨幣的貪婪與恐懼
2021-12-10/
0Comments
5個步驟設定選股條件,股票爆發力更上一層樓!
2021-11-22/
0Comments
Python財報月報股價爬蟲,台股資料庫終極解決之道!
2021-11-08/
0Comments
文章分類
AI看股票(14)
FinLabYouTube(4)
Python新手教學(17)
PYTHON財經(11)
Uncategorized(2)
加密貨幣(18)
基本面分析(18)
大盤漲跌(9)
實價登入(3)
技術面(12)
投資新手(2)
生產力(7)
籌碼面(5)
股票策略(19)
財報狗分析(5)
財經PYTHON教學(44)
選股策略(24)
量子電腦(1)
Python理財入門課程Python理財進階課程Python加密貨幣實戰課程
延伸文章資訊
- 1台積電(2330) - 本益比河流圖- 台股 - 玩股網
- 2本益比河流圖怎麼看?如何用來選股? - Mr.Market市場先生
本益比河流圖的計算方式?
- 3想請教一下本益比河流圖的倍數怎麼來的呢? - Mobile01
這是財報狗的本益比河流圖,像這樣的倍數是怎樣計算出來的呢? 知道本益比後,為什麼會有這些倍數的呈現,而且每檔股票倍數也都不同有人了解嗎?
- 4本益比河流圖如何使用?文章完整解析本益比河流圖的優缺點
什麼是本益比河流圖? ... 把過去幾年的本益比分成5個區間,分別為低估、偏低、合理、偏高、高估本益比,乘以近12個月(或近4季)的EPS,取得了低估價、偏低價 ...
- 5本益比河流圖|Plotly-Filled Area Plot應用教學 - FinLab
高成長股或獲利不夠穩定的企業不適用,本益比河流圖趨勢變化會太過劇烈。