1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Python】2資産ポートフォリオのリスクリターンマップを作る

Posted at

TwitterでSPXLとTMFを組み合わせたポートフォリオのリスクリターンマップを紹介しました。

ここに、そのグラフを作るためのコードを保存しておきます。

あらかじめ以下のサイトからTMF,SPXL,VTIのcsvファイルを取得しておきます(期間はMAX)。
(本当は、取得するcodeをかければ良いのですが・・・)

TMF: https://www.nasdaq.com/market-activity/funds-and-etfs/tmf/historical
SPXL: https://www.nasdaq.com/market-activity/funds-and-etfs/spxl/historical
VTI: https://www.nasdaq.com/market-activity/funds-and-etfs/vti/historical

それぞれ、"TMF.csv", "SPXL.csv", "VTI.csv"というファイル名で保存しておきます。

#1. ライブラリの読み込み。

#Invite frends to the party...
import numpy as np
import pandas as pd
from datetime import datetime
import seaborn as sns
sns.set()
import matplotlib.pyplot as plt
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()

#2. csvファイルを1つのDataFrameにまとめる関数

def make_df(etfs):
    df = pd.DataFrame()
    for etf in etfs:
        csvfile = etf +'.csv'
        csv_data = pd.read_csv(csvfile)
        csv_data.Date = pd.to_datetime(csv_data.Date)
        csv_data = csv_data.set_index('Date')
        csv_data= csv_data.rename(columns={' Close/Last': etf})
        df[etf] = csv_data[etf]
        df = df.sort_index().dropna()
    return df

#3. 分散ポートフォリオ指数をDataFrameに追加する関数

def make_port_df(df):
    #リターン算出
    rtn = (df /  df.shift(1) -1).fillna(0)

    #各比率のポートフォリオデータを作成
    for w in [9, 8, 7, 6, 5, 4, 3, 2, 1]:
        rtn['SPXL'+str(w)+' : TMF'+str(10-w)] =rtn['SPXL']*(w/10) + rtn['TMF']*(1-w/10)
    
    rtn += 1
    df = rtn.cumprod()
    
    return df 

#4. リスクリターンマップを作成する関数

def rr_map(df):
    #月次リターン算出
    dfm = df.resample('M').ffill()
    m_rtn = (dfm /  dfm.shift(1) -1).dropna()

    #リスク算出
    std = (m_rtn.std())*(12**0.5)
    
    #年率リターン算出
    cum = m_rtn+1
    a_rtn = (cum.product())**(12/len(m_rtn))-1
    
    #リスクリターンマップ作成
    plt.figure(figsize=(6, 6))
    for asset in list(a_rtn.index):
        plt.scatter(x = std[asset], y = a_rtn[asset],label = asset)
    plt.xlabel('Risk')
    plt.ylabel('Return')
    plt.xlim(0,std.max()*1.1)
    plt.ylim(0,a_rtn.max()*1.1)
    plt.legend(loc = 'best')
    plt.title('Risk Return Map')
    
    plt.savefig('rr_map.png',bbox_inches="tight")

#4. 上記関数を実行する

etfs = ['SPXL','TMF','VTI']
df = make_df(etfs)
df = make_port_df(df)
rr_map(df)

↓このグラフが表示される。
rr_map.png

#5. まとめ
SPXLとTMFをだいたい半分ずつ持つことで、リスクリターン特性がVTIより優れたポートフォリオになりそうです(投資は自己責任でおねがいします)。

#6.次の課題

  • 複数資産の分散ポートフォリオ
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?