matplot(棒グラフ),関数定義
#-*- coding: utf-8 import numpy as np import numpy.polynomial.polynomial as pol import matplotlib.pyplot as plt #日本語フォント設定 from matplotlib.font_manager import FontProperties import sys fontpath='/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc' jpfont=FontProperties(fname=fontpath) #キャッシュフロー #データ作成 period=np.linspace(0,4,5)#時点 v_cf=np.array([[-5.0,1.5,1.5,1.5,1.5], [-7.0,2.0,2.0,2.0,2.0], [-9.0,4.0,3.0,2.0,1,0], [-9.0,1.0,2.0,3.0,4.0]]) v_title=['事業A','事業B','事業C','事業D'] #グラフ作成 fig1=plt.figure(1,facecolor='w') for fig_num in range(4): plt.subplot(2,2,fig_num+1) plt.bar(period,v_cf[fig_num],color=(0.5,0.5,0.5)) plt.title(v_title[fig_num],fontproperties=jpfont) plt.show()
26行目のsubplot
plt.subplot(図を何行に分割するか、図を何列に分割するか、このsubplotが左上から数えて何枚目のプロットなのか
らしい
ただ、これを実行すると
Traceback (most recent call last): File "pyfin_npv_irr.py", line 27, in <module> plt.bar(period,v_cf[fig_num],color=(0.5,0.5,0.5)) File "/Users/ikamihiroaki/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/matplotlib/pyplot.py", line 2775, in bar ret = ax.bar(*args, **kwargs) File "/Users/ikamihiroaki/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/matplotlib/__init__.py", line 1867, in inner return func(ax, *args, **kwargs) File "/Users/ikamihiroaki/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/matplotlib/axes/_axes.py", line 2238, in bar np.atleast_1d(x), height, width, y, linewidth) File "/Users/ikamihiroaki/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/numpy/lib/stride_tricks.py", line 252, in broadcast_arrays shape = _broadcast_shape(*args) File "/Users/ikamihiroaki/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages/numpy/lib/stride_tricks.py", line 187, in _broadcast_shape b = np.broadcast(*args[:32]) ValueError: shape mismatch: objects cannot be broadcast to a single shape
ってなんじゃこれというエラー
また、27行目を
plt.bar(period,v_cf[fig_num,:],color=(0.5,0.5,0.5))
に置き換えると、
Traceback (most recent call last): File "pyfin_npv_irr.py", line 27, in <module> plt.bar(period,v_cf[fig_num,:],color=(0.5,0.5,0.5)) IndexError: too many indices for array
ってエラー。
とりあえず、ValueError: shape mismatch: objects cannot be broadcast to a single shape
について調べていく
NumPyのブロードキャスト(形状の自動変換) | note.nkmk.me
これみた。
おそらくperiod
とv_cf[fig_num:]
の2つの次元やらがうまくいっていないんだろうと思い進めてみる。
print (period.shape) print (v_cf[0:].shape)
結果
(5,) (4,)
その後も「なんかv_cf
って配列リスト型になってね?」とか「v_cf.shape
で配列の行と列の数調べる」とか色々やってみたけどうまくいかないと思ったら、、
v_cf=np.array([[-5.0,1.5,1.5,1.5,1.5], [-7.0,2.0,2.0,2.0,2.0], [-9.0,4.0,3.0,2.0,1,0], [-9.0,1.0,2.0,3.0,4.0]])
この3行目の最後の数字、1.0じゃなくて1,0だったわ、、、
いや、気づかんよ、、、、、、、、、
まじか、、、、、、、
ということで、Numpy配列について諸々調べたのがメインになったわ
最後に今日の成果物載せる
#-*- coding: utf-8 import numpy as np import numpy.polynomial.polynomial as pol import matplotlib.pyplot as plt #日本語フォント設定 from matplotlib.font_manager import FontProperties import sys fontpath='/System/Library/Fonts/ヒラギノ角ゴシック W4.ttc' jpfont=FontProperties(fname=fontpath) #キャッシュフロー #データ作成 period=np.linspace(0,4,5)#時点 v_cf=np.array([[-5.0, 1.5, 1.5, 1.5, 1.5], [-7.0, 2.0, 2.0, 2.0, 2.0], [-9.0,4.0,3.0,2.0,1.0], [-9.0,1.0,2.0,3.0,4.0]]) v_title=['事業A','事業B','事業C','事業D'] print (v_cf[0]) #グラフ作成 fig1=plt.figure(1,facecolor='w') for fig_num in range(4): plt.subplot(2,2,fig_num+1) plt.bar(period,v_cf[fig_num],color=(0.5,0.5,0.5)) plt.title(v_title[fig_num],fontproperties=jpfont) plt.show()
結果
def NPV(r,cf): #r:割引率 #cf:キャッシュフロー #output:正味現在価値 x=1.0/(1.0+0.01*r) return pol.polyval(x,cf) V_NPV=np.zeros(4) r=5.0 for cf_num in range(4): V_NPV[cf_num]=NPV(r,v_cf[cf_num]) print (V_NPV[cf_num])
結果
0.3189257562435399 0.09190100832472048 0.08098991675279166 -0.35123739594099135
Net Present Valueを算出。
今朝は、参考書の内部収益率の説明とか読んでたら終わった、、そもそも金融の知識が乏しい、、、
内部収益率IRRの算出がこちら
def IRR(cf): roots=pol.polyroots(cf) real=np.real(roots[np.isreal(roots)]) positive=np.asscalar(real[real>0.0]) return positive V_IRR=np.zeros(4) for cf_num in range(4): V_IRR[cf_num]=IRR(v_cf[cf_num]) print (V_NPV[cf_num])
結果
7.713847295208498 5.563784636876501 5.483568972354691 3.596116208467759
関数定義のところは色々新しいメソッドみたいなのが出てきたから、まとめておく
x=pol.polyroots(v_cf[0]) print (x) y=np.isreal(x) print (y) z=x[y] print (z) p=np.real(z) print (p) q=p[p>0.0] print (q) k=np.asscalar(q) print (k)
結果
[-1.59220781+0.j -0.16808896-1.4922355j -0.16808896+1.4922355j 0.92838574+0.j ] [ True False False True] [-1.59220781+0.j 0.92838574+0.j] [-1.59220781 0.92838574] [0.92838574] 0.9283857415837412