はじめに
株を分析するPythonのパッケージをまとめていきます(自分用)。
ここで紹介するパッケージはGithubからダウンロードできます。
パッケージの説明や使い方を現在も執筆中です。
パッケージの構成
パッケージの構成は以下の通りです。
.
├── trade_package_1.0
│ ├── __init__.py
│ ├── dl.py
│ ├── get.py
| ├── output.py
│ ├── tech.py
│ └── data
│ ├── balance_sheet
│ ├── cashflow
│ ├── finance
│ ├── market_info
│ ├── price
│ └── stock_info
└── sample.py
準備
カレントディレクトリ(今現在のフォルダ)にtrade_package_1.0というディレクトリを作成します。そのディレクトリにパッケージを構成する5つのプログラム(__init__.py,dl.py,get.py,output.py,tech.py)を追加します。それぞれのプログラムの中身や説明は以下で紹介します。
次に、ディレクトリtrade_package_1.0の下に、ディレクトリdataを作成してください。その下に、6つのディレクトリ(balance_sheet、cashflow、finance、market_info、price、stock_info)をさらに作成します。これらのディレクトリの中に株価の時系列データや各銘柄の情報が保存されます。あらかじめ作成しておかないと実行エラーになる場合があります。
market_infoの中に、nikkei225_all_code.csv、mothers_all_code.csv、tokyo_all_code.csv、topix500_all_code.csvというCSVファイルを作成してください.例えば、nikkei225_all_code.csvには以下のように日経平均採用銘柄の株価一覧の情報を入れます。
1332.T,日本水産(株)
1333.T,マルハニチロ(株)
1605.T,国際石油開発帝石(株)
1721.T,コムシスホールディングス(株)
1801.T,大成建設(株)
1802.T,(株)大林組
1803.T,清水建設(株)
1808.T,(株)長谷工コーポレーショ
...
9532.T,大阪ガス(株)
9602.T,東宝(株)
9613.T,(株)NTTデータ
9735.T,セコム(株)
9766.T,コナミホールディングス(株)
9983.T,(株)ファーストリテイリング
9984.T,ソフトバンクグループ(株)
証券コードと銘柄名の順になっています。
tokyo_all_code.csvはその他統計資料 | 日本取引所グループ - 東京証券取引所のエクセルファイルdata_j.xlsをもとに作成します。
エクセルでdata_j.xlsを開き、CSVファイル形式に保存しなおだけです。
日付,コード,銘柄名,市場・商品区分,33業種コード,33業種区分,17業種コード,17業種区分,規模コード,規模区分
20201230,1301.T,極洋,市場第一部(内国株),50,水産・農林業,1,食品 ,7,TOPIX Small 2
20201230,1305.T,ダイワ上場投信-トピックス,ETF・ETN,-,-,-,-,-,-
20201230,1306.T,NEXT FUNDS TOPIX連動型上場投信,ETF・ETN,-,-,-,-,-,-
20201230,1308.T,上場インデックスファンドTOPIX,ETF・ETN,-,-,-,-,-,-
20201230,1309.T,NEXT FUNDS ChinaAMC・中国株式・上証50連動型上場投信,ETF・ETN,-,-,-,-,-,-
20201230,1311.T,NEXT FUNDS TOPIX Core 30連動型上場投信,ETF・ETN,-,-,-,-,-,-
20201230,1312.T,NEXT FUNDS ラッセル野村小型コア・インデックス連動型上場投信,ETF・ETN,-,-,-,-,-,-
20201230,1313.T,サムスンKODEX200証券上場指数投資信託[株式],ETF・ETN,-,-,-,-,-,-
20201230,1319.T,NEXT FUNDS 日経300株価指数連動型上場投信,ETF・ETN,-,-,-,-,-,-
20201230,1320.T,ダイワ上場投信-日経225,ETF・ETN,-,-,-,-,-,-
...
20201230,9993.T,ヤマザワ,市場第一部(内国株),6100,小売業,14,小売 ,7,TOPIX Small 2
20201230,9994.T,やまや,市場第一部(内国株),6100,小売業,14,小売 ,7,TOPIX Small 2
20201230,9995.T,グローセル,市場第一部(内国株),6050,卸売業,13,商社・卸売 ,7,TOPIX Small 2
20201230,9996.T,サトー商会,JASDAQ(スタンダード・内国株),6050,卸売業,13,商社・卸売 ,-,-
20201230,9997.T,ベルーナ,市場第一部(内国株),6100,小売業,14,小売 ,6,TOPIX Small 1
パッケージの初期化処理をするプログラム(__init__.py)
パッケージをimportする時の初期化処理を行うファイルになります。
from . import dl
from . import get
from . import tech
from . import output
データ取得プログラム(dl.py)
データ取得に関する関数をまとめています。株価時系列データ,損益計算書,キャッシュフロー計算書,貸借対照表(バランスシート),銘柄のサマリー,株価(分足)が取得できます。以下では各関数の簡単な説明を書いていきます。
データ取得する際に必要なモジュールをimportします。
import pandas as pd
import requests
from io import StringIO
import json
from datetime import datetime,date
import glob
import pandas_datareader.data as web
import yfinance as yf
Yahoo!ファイナンスから,指定した銘柄の株価時系列データ(日足)取得します。関数の引数からデータ取得期間が設定できます。返り値として、ダウンロードしたデータが返されます。
# 新規で株価取得(日足, 1銘柄)
def price(stock_code,start=None,end=None):
data = web.DataReader(stock_code,"yahoo",start,end)
return data
ダウンロードしたデータをCSVファイルとしてtrade_package/data/priceに保存します。
# 新規で株価取得、csv保存(日足,1銘柄)
def price_csv(stock_code,start=None,end=None):
data = web.DataReader(stock_code,"yahoo",start,end)
data.to_csv('./trade_package/data/price\\'+stock_code+'.csv')
上の関数と同様に、ダウンロードしたデータをCSVファイルとしてtrade_package/data/priceに保存します。すでに株価データ取得済みの銘柄に関して、Yahooファイナンスからデータをダウンロードする処理はスキップします。最新の株価データが取得されていない場合は最新の株価データをYahooファイナンスからダウンロードします。
# 新規株価の取得と既存株価の更新(日足,銘柄リスト)
def price_update(stock_code:list,day=date.today()):
list_file_exist = glob.glob("./trade_package/data/price/*")
print("update_day:", end='')
print(day)
for code in stock_code:
filename = './trade_package/data/price\\'+code+'.csv'
if filename in list_file_exist:
df = pd.read_csv(filename,index_col=0,parse_dates=True)
if(df.index[-1]==day):
pass
else:
print(code, 'UPDATE... ', end='')
try:
new_df = price(code, start=df.index[-1].date())
df = pd.concat([df, new_df.iloc[1:,:]])
df.to_csv(filename)
print('SUCCESS')
except Exception as e:
print('FAIL:', e)
else:
print(code, 'GET... ', end='')
try:
price_csv(code, start='2015-1-1')
print('SUCCESS')
except Exception as e:
print('FAIL:', e)
損益計算書データをダウンロードし、CSVファイルとして保存する。
# 損益計算書データ取得 csv保存
def balance_sheet_csv(stock_code):
data = yf.Ticker(stock_code).balance_sheet
data.to_csv("./trade_package/data/balance_sheet/"+stock_code+".csv")
キャッシュフロー計算書データをダウンロードし、CSVファイルとして保存する。
# キャッシュフロー計算書取得 csv保存
def cashflow_csv(stock_code):
data = yf.Ticker(stock_code).cashflow
data.to_csv("./trade_package/data/cashflow/"+stock_code+".csv")
貸借対照表(バランスシート)データをダウンロードし、CSVファイルとして保存する。
# 貸借対照表(バランスシート)取得 csv保存
def finance_csv(stock_code):
data = yf.Ticker(stock_code).financials
data.to_csv("./trade_package/data/finance/"+stock_code+".csv")
銘柄のサマリー取得データをダウンロードし、CSVファイルとして保存します。
# 銘柄のサマリー取得 csv保存
def stock_info_csv(stock_code):
data = yf.Ticker(stock_code).info
with open(f"./trade_package/data/stock_info/{stock_code}.json", mode="w") as f:
d = json.dumps(data)
f.write(d)
指定した銘柄の損益計算書、キャッシュフロー計算書、貸借対照表(バランスシート)、銘柄のサマリーをダウンロードし、jsonファイルとして保存します。
# finance, stock_info, cashflow,balance_sheetを指定した銘柄で保存する
def fundamental_csv(stock_code):
balance_sheet_csv(stock_code)
cashflow_csv(stock_code)
finance_csv(stock_code)
stock_info_csv(stock_code)
引数で指定した銘柄のリストの株価データと損益計算書、キャッシュフロー計算書、貸借対照表(バランスシート)、銘柄のサマリーをダウンロードし、CSVファイルとして保存する。
# price, finance, stock_info, cashflow,balance_sheetを指定した銘柄すべて保存する
def all_csv(stock_code:list):
price_update(stock_code)
print("Next:Download Fundamental")
for code in stock_code:
print(code)
fundamental_csv(code)
株価データを分足で取得する。返り値として、ダウンロードしたデータが返されます。
# 株価取得(分足)
# 最大:直近7日分
# やりすぎるとIPアドレスをbanされるリスクあり(1銘柄1分程度のインターバルが必要らしい)
def get_price_m(stock_name,day=1):
if(day>7):
print("day≦7")
day = 1
URL="https://query1.finance.yahoo.com/v7/finance/chart/"+stock_name+"?range="+str(day)+"d&interval=1m&indicators=quote&includeTimestamps=true"
r = requests.get(URL)
s = StringIO(r.text)
j = json.load(s)
df = pd.DataFrame()
df['Date'] = [datetime.fromtimestamp(ts) for ts in j['chart']['result'][0]['timestamp']]
df['Open'] = j['chart']['result'][0]['indicators']['quote'][0]['open']
df['Low'] = j['chart']['result'][0]['indicators']['quote'][0]['low']
df['High'] = j['chart']['result'][0]['indicators']['quote'][0]['high']
df['Close'] = j['chart']['result'][0]['indicators']['quote'][0]['close']
df['Volume'] = j['chart']['result'][0]['indicators']['quote'][0]['volume']
return df
データ読み込みプログラム(get.py)
dl.pyで取得したデータ(CSVファイル)を読み込むのに必要な関数をまとめています。
データ取得する際に必要なモジュールをimportします。
import pandas as pd
import json
import numpy as np
代表的な指数の構成銘柄などが取得できます。日経平均株価、TPIX500、Mothers、東証全銘柄の構成銘柄取得にはCSVファイルが必要となります。
# NYダウ
def dj():
DJ=['AAPL','AXP','BA','CAT','CSCO','CVX','DIS','GS','HD',
'IBM','INTC','JNJ','JPM','KO','MCD','MMM','MRK','MSFT','NKE',
'PFE','PG','TRV','UNH','UTX','V','VZ','WBA','WMT','XOM']
return DJ
# 代表的な指数
def index():
INDEX=["^DJI","^DJT","^DJU","^BANK","^IXCO","^NDX","^NBI",
"^NDXT","^INDS","^INSR","^OFIN","^IXTC","^TRAN","^NYY","^NYI","^NY",
"^NYL","^XMI","^OEX","^GSPC","^HSI","^FCHI","^BVSP","^N225","^RUA","^XAX"]
return INDEX
# 日経平均株価(csvファイル必須)
def n225():
n225 = pd.read_csv("./trade_package/data/market_info/nikkei225_all_code.csv", engine="python", names=("code","name"))
return n225
# TPIX500(csvファイル必須)
def topix500():
topix500 = pd.read_csv("./trade_package/data/market_info/topix500_all_code.csv", engine="python", names=("code","name"),usecols=[0,1])
return topix500
# Mothers上場銘柄(csvファイル必須)
def mothers():
mothers = pd.read_csv("./trade_package/data/market_info/mothers_all_code.csv", engine="python", names=("code","name"))
return mothers
# 東証全銘柄
def tokyo():
tokyo = pd.read_csv("./trade_package/data/market_info/tokyo_all_code.csv", engine="python", names=("date","code", "name","market", "CodeIndustry33", "ClassificationIndustry33", "CodeIndustry17", "ClassificationIndustry17", "CodeScale", "ClassificationScale"), skiprows=1, usecols=[1,2], encoding="utf-8")
return tokyo
# sp100
def sp100():
SP100=["AAPL","ABBV","ABT","ACN","AGN","AIG","ALL","AMGN","AMZN","AXP","BA","BAC","BIIB",
"BK","BLK","BMY","BRKB","C","CAT","CHTR","CL","CMCSA","COF","COP","COST","CSCO",
"CVS","CVX","DHR","DIS","DUK","EMR","EXC","F","FB","FDX","FOX","FOXA","GD","GE",
"GILD","GM","GOOG","GOOGL","GS","HAL","HD","HON","IBM","INTC","JNJ","JPM","KHC","KMI",
"KO","LLY","LMT","LOW","MA","MCD","MDLZ","MDT","MET","MMM","MO","MRK","MS","MSFT",
"NEE","NKE","ORCL","OXY","PEP","PFE","PG","PM","PYPL","QCOM","RTN","SBUX",
"SLB","SO","SPG","T","TGT","TXN","UNH","UNP","UPS","USB","UTX","V","VZ","WBA",
"WFC","WMT","XOM"]
return SP100
# 暗号通貨
def cc():
CCURRENCY=["BTC-USD","XRP-USD","ETH-USD","LTC-USD","BCH-USD","BNB-USD",
"EOS-USD","USDT-USD","LINK-USD","TRX-USD","ADA-USD",
"XLM-USD","XMR-USD","DASH-USD","NEO-USD","IOT-USD",
"VEN-USD","ETC-USD","XEM-USD","ZEC-USD","XRB-USD","QTUM-USD",
"BTG-USD","BAT-USD","DOGE-USD"]
return CCURRENCY
./trade_package/data/priceに保存されている株価データのCSVファイルを読み込みます。関数の返り値はpandasのDataFrame型です。
# 株価取得
def price(code, start=None, end=None):
df = pd.read_csv("./trade_package/data/price/"+code+".csv",index_col=0, parse_dates=True)
return df[start:end]
# 日足→〇足/分足→〇足
# [freq] W-MON:週足 MS:月足 30T:30分足 4H:4時間足
def change(df,freq):
d_ohlcv = {'Open': 'first',
'High': 'max',
'Low': 'min',
'Close': 'last',
'Volume': 'sum'}
df = df.resample(freq, closed='left', label='left').agg(d_ohlcv)
return df
./trade_package/data/stock_info/に保存されている銘柄情報データのjsonファイルを読み込みます。関数の返り値はpandasのDataFrame型です。
# 銘柄情報
def stock_info(stock_code :list):
info = {} # 銘柄情報
for code in stock_code:
# print(stock_name, 'SEACH... ', end='')
try:
with open(f"./trade_package/data/stock_info/{code}.json", mode="r") as f:
d = json.load(f)
info[code]={'sharesOutstanding':d["sharesOutstanding"], # 発行株式数
'forwardPER': d["forwardPE"], # 予測PER
'marketCap': d["marketCap"], # 時価総額
'dividendYield': d['dividendYield'], # 配当利回り
'profitMargins':d['profitMargins'], # 純利益比率
} # dataframeにinfoの項目を追加するにはここを追加する
# print('SUCCESS')
except Exception as e:
info[code]=np.nan
print('FAIL:', e)
info = pd.DataFrame(info)
return info
./trade_package/data/financeに保存されている損益計算書のCSVファイルを読み込みます。関数の返り値はpandasのDataFrame型です。
# 損益計算書
def finance(stock_code:list, item):
# dummy作成
dummy = pd.read_csv('./trade_package/data/finance/'+stock_code[0]+'.csv', index_col=0).T[item]
dummy[:] = np.nan
earnings = {}
for code in stock_code:
try:
earnings[code] = pd.read_csv('./trade_package/data/finance/'+code+'.csv', index_col=0).T[item]
except:
earnings[code] = dummy # エラー発生時はダミーを入れる
return pd.DataFrame(earnings)
./trade_package/data/balance_sheetに保存されているバランスシートのCSVファイルを読み込みます。関数の返り値はpandasのDataFrame型です。
# バランスシート
def bs(stock_code:list, item):
equity = {} # 自己資本
dummy = pd.read_csv('./trade_package/data/balance_sheet/'+stock_code[0]+'.csv', index_col=0).T[item]
dummy[:] = np.nan
for code in stock_code:
try:
equity[code] = pd.read_csv('./trade_package/data/balance_sheet/'+code+'.csv', index_col=0).T[item]
except:
equity[code] = dummy # エラー発生時はダミーを入れる
return pd.DataFrame(equity)
出力に関するプログラム(output.py)
出力に関する関数をまとめています。
データ出力する際に必要なモジュールをimportします。
import mplfinance as mpf
ローソク足でプロット
# ローソク足でプロット(panel="lower"で下のグラフにプロット)
# パネルに複数のデータを追加可能だが、未対応(暇なときにする)
def plot(df, add = None, volume=False,panel =None,title="", figratio=(16,9)):
if(add is None):
mpf.plot(df, figratio=(16,9), volume=volume, style='yahoo', type='candle',title="\n"+title)
else:
if(panel is None):
apd = mpf.make_addplot(add)
else:
apd = mpf.make_addplot(add, panel=panel)
mpf.plot(df,addplot=apd, figratio=(16,9), volume=volume, style='yahoo', type='candle', title="\n"+title)
表を出力(引数:df,列の幅)
# 表を出力(引数:df,列の幅)
def table(df,col_width):
import plotly.graph_objects as go
from datetime import datetime
headerColor = 'grey'
rowEvenColor = 'lightgrey'
rowOddColor = 'white'
rowColorList = []
for i in range(len(df.index)):
if(i%2 == 0):
rowColorList.append(rowOddColor)
else:
rowColorList.append(rowEvenColor)
fig = go.Figure(data=[go.Table(
columnwidth = col_width,
header=dict(values=["<b>"+i+"</b>" for i in df.columns], align='center', line_color='darkslategray',\
fill_color=headerColor, font=dict(color='white', size=16), height=40),
cells=dict(values=df.values.T, align='center', line_color='darkslategray',\
fill_color = [rowColorList*len(df.columns)],font = dict(color = 'black', size = 14), height=28)
)])
fig.update_layout(margin = dict( # グラフ領域の余白設定
l = 1, r = 1, t = 0, b = 0,
pad = 0, # グラフから軸のラベルまでのpadding
autoexpand = True, # LegendやSidebarが被ったときに自動で余白を増やすかどうか
))
# fig.update_layout(title={'text': title,'y':0.85,'x':0.5,'xanchor': 'center'})#タイトル位置の調整
# fig.layout.title.font.size= 24 #タイトルフォントサイズの変更
now = datetime.now().strftime('%Y%m%d%H%M%S')
fig.write_image("table_"+now+".jpg",height=(len(df.index))*28+40+1)#, width=sum(col_width))
テクニカル分析(tech.py)
テクニカル分析で使う関数をまとめています。
テクニカル分析する際に必要なモジュールをimportします。
import talib as ta
import numpy as np
移動平均
# 移動平均
# 代表値:分足(5,25,75), 日足(25,50,75), 週足(12,26,52), 月足(9,24,60)
def sma_temp(df, period=(25,50,75)):
df["sma_s"]= df["Close"].rolling(period[0]).mean().round(2)
df["sma_m"]= df["Close"].rolling(period[1]).mean().round(2)
df["sma_l"]= df["Close"].rolling(period[2]).mean().round(2)
移動平均(単一)
# 移動平均(単一)
def sma(df,period=9):
df["sma_"+str(period)]= df["Close"].rolling(period).mean().round(2)
ボリンジャーバンド
# ボリンジャーバンド
def bb(df,period=25, sigma=2):
df["bb_u"],df["bb_m"],df["bb_l"] = ta.BBANDS(df['Close'], timeperiod=period, nbdevup=sigma, nbdevdn=sigma, matype=0)
MACD
# MACD
def macd(df,fastperiod=12, slowperiod=26, signalperiod=9):
df['macd'], df['signal'], df['hist'] = ta.MACD(df['Close'], fastperiod=fastperiod, slowperiod=slowperiod, signalperiod=signalperiod)
RSI
# RSI
def rsi(df,period=14):
df["rsi"]=ta.RSI(df['Close'], timeperiod=period)
変化率
# 変化率:rate of change (percentage) (period=1,日足なら前日から何%増減したか)
def roc(df,period=9):
df["roc"]=ta.ROC(df['Close'],timeperiod=period)
モーメンタム
# モーメンタム
def mom(df,period=10):
df["mom"]=ta.MOM(df['Close'],timeperiod=period)
加重移動平均
# 加重移動平均
def wma(df,period=9):
df["wma_"+str(period)]=ta.WMA(df['Close'],timeperiod=period)
指数移動平均
# 指数移動平均
def ema(df,period=9):
df["ema_"+str(period)]=ta.EMA(df['Close'],timeperiod=period)
スローストキャスティクス
# スローストキャスティクス
def stoch(df,fastK=14,slowK=3,slowD=3):
df["slowk"],df["slowd"]=ta.STOCH(df['High'],df['Low'],df['Close'],fastk_period=fastK, slowk_period=slowK, slowd_period=slowD)
ファーストストキャスティクス
# ファーストストキャスティクス
def stochf(df,K=14,D=3):
df["fastk"],df["fastd"]=ta.STOCHF(df['High'],df['Low'],df['Close'],fastk_period=K, fastd_period=D)
分散
# 分散
def var(df,period=5):
df["var"]=ta.VAR(df["Close"],timeperiod=period)
相関
# 相関 correlation corefficient
def cc(df,symbol,period=20):
cor = [np.nan]*(period-1)
for i in range(len(df["Close"])-period+1):
x = np.array(df["Close"][i:i+period])
y = np.array(symbol[i:i+period])
cor.append(np.corrcoef(x,y)[0,1])
df["cc"] = cor
モジュールの使い方
株価データのダウンロード
TOPIX500構成銘柄の株価データを取得する場合
- get.topix500()で、TOPIX500の銘柄リストを取得します。
- dl.price_update()で株価データのダウンロードと株価データ取得済みの銘柄については最新のデータを追加します。
import trade_package.get as get
import trade_package.dl as dl
# list_stock_name = get.tokyo() # 東証上場銘柄リスト
list_stock_name = get.topix500() # TOPIX500銘柄リスト
dl.price_update(list_stock_name.code)
ダウンロードした株価データを読み込む
TOPIX500構成銘柄の株価データを読み込む場合
- get.topix500()で、TOPIX500の銘柄リストを取得します。
- dl.price()で株価データの読み込みを行います。
- 読み込んだ株価データの終値(Close)のみをデータフレームに追加しています。
import trade_package.get as get
import pandas as pd
list_stock_name = get.topix500() # TOPIX500銘柄リスト
df = pd.DataFrame()
for stock_name in list_stock_name.code:
df_new = get.price(stock_name)['Close']
df_new.name = stock_name
df = pd.concat([df, df_new], axis=1)
print(df)
実行例
3382.T 4063.T 4452.T ... 9962.T 9987.T 9989.T
2015-01-05 4321.0 7888.0 4764.5 ... 1330.000000 3040.909912 2412.5
2015-01-06 4245.0 7642.0 4640.5 ... 1288.329956 2959.090088 2365.0
2015-01-07 4259.5 7706.0 4650.5 ... 1275.000000 2972.729980 2362.5
2015-01-08 4335.0 7765.0 4695.0 ... 1303.329956 2954.550049 2377.5
2015-01-09 4366.5 7758.0 4709.0 ... 1291.670044 2972.729980 2392.5
... ... ... ... ... ... ...
2021-02-08 4248.0 18075.0 7517.0 ... 3600.000000 4305.000000 4380.0
2021-02-09 4245.0 18115.0 7564.0 ... 3565.000000 4265.000000 4425.0
2021-02-10 4228.0 17925.0 7636.0 ... 3575.000000 4285.000000 4405.0
2021-02-12 4141.0 18285.0 7486.0 ... 3520.000000 4330.000000 4155.0
2021-02-15 4225.0 18740.0 7450.0 ... 3555.000000 4355.000000 4145.0
[1515 rows x 498 columns]
最後に(記事の紹介)
この分析ツールを利用して、テクニカル分析、分散投資の効果を検証しています。以下は実際に検証してみた記事の一部です。今後も同様な検証を行っていきます。興味ある方はご覧いただけると幸いです!
<あらすじ>
テクニカル分析の初歩「ゴールデンクロス」が実際にはどれだけ役に立つのか?
TOPIX500銘柄を対象に5年分のデータを使って検証しました。<結論>
・様々な条件での実験で上昇している確率は約50%
・ゴールデンクロス単体だけで買いタイミングを判断してはいけない
<あらすじ>
「買われすぎ」や「売られすぎ」といった相場の勢いを表す過熱感
その過熱感を数値で判断できるRSIについて検証しました。TOPIX500銘柄の過去5年分のデータを使って
RSIの買いサインの数日後に、株価が上がっているのかを調査します。<結論>
・RSIの使い方次第で確実に勝率を上げられる
・投資タイミングの判断材料として有効である
株式投資における投資によるリターン(株価収益率),投資に伴うリスク(収益率の分散),リスクに対するリターン(シャープ・レシオ)の計算方法について紹介し,2020年8月1日から2020年10月31日の期間における日経225全銘柄を対象にPythonプログラムを用いて,この3つの指標について計算しました.
リスク回避的な投資家の中でも,ある程度リスクに寛容な投資家,リスクを最重視する投資家,ある程度のリスクを取り,リスクに対する収益率を重視する投資家に分類し,それぞれが選ぶべき銘柄について以下のように考察しました.
リスクに寛容で収益率を重視する投資家:日本製鋼所
リスクを重視する投資家:日本たばこ産業
リスクに対する収益率を重視する投資家:ファーストリテイリング,デンソー,東海カーボン
今回はTOPIX500構成銘柄の2銘柄に投資するとき,どの銘柄にどんな比率で投資すればリスクを抑えながら収益が得られるかを検証してみました.
その結果,レーザーテックに0.475,エムスリーに0.53の比率で投資したときがリスクに対して最も収益が得られることがわかりました.このときの投資効率の高さ(シャープレシオ)は1銘柄投資では実現できなかった値の高さとなりました.