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

これみた。

おそらくperiodv_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()

結果 f:id:iiiiikamirin:20200204233237p:plain

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