株分析ツールの使い方（備忘録）

# はじめに
株を分析するPythonのパッケージをまとめていきます（自分用）。

ここで紹介するパッケージは[Github](https://github.com/mandt500/trade_package)からダウンロードできます。

**パッケージの説明や使い方を現在も執筆中です**。

# パッケージの構成
パッケージの構成は以下の通りです。

```
.
├── 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には以下のように日経平均採用銘柄の株価一覧の情報を入れます。

```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,(株)ＮＴＴデータ
9735.T,セコム(株)
9766.T,コナミホールディングス(株)
9983.T,(株)ファーストリテイリング
9984.T,ソフトバンクグループ(株)
```
証券コードと銘柄名の順になっています。

tokyo_all_code.csvは[その他統計資料 | 日本取引所グループ - 東京証券取引所](https://www.jpx.co.jp/markets/statistics-equities/misc/01.html)のエクセルファイルdata_j.xlsをもとに作成します。

エクセルでdata_j.xlsを開き、CSVファイル形式に保存しなおだけです。

```tokyo_all_code.csv
日付,コード,銘柄名,市場・商品区分,33業種コード,33業種区分,17業種コード,17業種区分,規模コード,規模区分
20201230,1301.T,極洋,市場第一部（内国株）,50,水産・農林業,1,食品 ,7,TOPIX Small 2
20201230,1305.T,ダイワ上場投信－トピックス,ETF・ETN,-,-,-,-,-,-
20201230,1306.T,ＮＥＸＴ　ＦＵＮＤＳ　ＴＯＰＩＸ連動型上場投信,ETF・ETN,-,-,-,-,-,-
20201230,1308.T,上場インデックスファンドＴＯＰＩＸ,ETF・ETN,-,-,-,-,-,-
20201230,1309.T,ＮＥＸＴ　ＦＵＮＤＳ　ＣｈｉｎａＡＭＣ・中国株式・上証５０連動型上場投信,ETF・ETN,-,-,-,-,-,-
20201230,1311.T,ＮＥＸＴ　ＦＵＮＤＳ　ＴＯＰＩＸ　Ｃｏｒｅ　３０連動型上場投信,ETF・ETN,-,-,-,-,-,-
20201230,1312.T,ＮＥＸＴ　ＦＵＮＤＳ　ラッセル野村小型コア・インデックス連動型上場投信,ETF・ETN,-,-,-,-,-,-
20201230,1313.T,サムスンＫＯＤＥＸ２００証券上場指数投資信託［株式］,ETF・ETN,-,-,-,-,-,-
20201230,1319.T,ＮＥＸＴ　ＦＵＮＤＳ　日経３００株価指数連動型上場投信,ETF・ETN,-,-,-,-,-,-
20201230,1320.T,ダイワ上場投信－日経２２５,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する時の初期化処理を行うファイルになります。


```python:__init__.py
from . import dl
from . import get
from . import tech
from . import output
```





# データ取得プログラム（dl.py）
データ取得に関する関数をまとめています。株価時系列データ，損益計算書，キャッシュフロー計算書，貸借対照表（バランスシート），銘柄のサマリー，株価（分足）が取得できます。以下では各関数の簡単な説明を書いていきます。

データ取得する際に必要なモジュールをimportします。

```Python:dl.py
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!ファイナンスから，指定した銘柄の株価時系列データ（日足）取得します。関数の引数からデータ取得期間が設定できます。返り値として、ダウンロードしたデータが返されます。

```python
# 新規で株価取得（日足, 1銘柄）
def price(stock_code,start=None,end=None):
    data = web.DataReader(stock_code,"yahoo",start,end)
    return data
```
ダウンロードしたデータをCSVファイルとしてtrade_package/data/priceに保存します。

```python
# 新規で株価取得、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ファイナンスからダウンロードします。


```python
# 新規株価の取得と既存株価の更新（日足,銘柄リスト）
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ファイルとして保存する。

```python                  
# 損益計算書データ取得 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ファイルとして保存する。

```python
# キャッシュフロー計算書取得 csv保存
def cashflow_csv(stock_code):
    data = yf.Ticker(stock_code).cashflow
    data.to_csv("./trade_package/data/cashflow/"+stock_code+".csv")
```
貸借対照表（バランスシート）データをダウンロードし、CSVファイルとして保存する。


```python
# 貸借対照表（バランスシート）取得 csv保存
def finance_csv(stock_code):
    data = yf.Ticker(stock_code).financials
    data.to_csv("./trade_package/data/finance/"+stock_code+".csv")
```
銘柄のサマリー取得データをダウンロードし、CSVファイルとして保存します。


```python 
# 銘柄のサマリー取得 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ファイルとして保存します。

```python
# 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ファイルとして保存する。

```python
# 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)      
```
株価データを分足で取得する。返り値として、ダウンロードしたデータが返されます。

```python
# 株価取得（分足）
# 最大：直近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&amp;interval=1m&amp;indicators=quote&amp;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します。

```python:get.py
import pandas as pd
import json
import numpy as np
```
代表的な指数の構成銘柄などが取得できます。日経平均株価、TPIX500、Mothers、東証全銘柄の構成銘柄取得にはCSVファイルが必要となります。

```python
# 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型です。

```python
# 株価取得
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型です。

```python
 # 銘柄情報       
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型です。

```python
# 損益計算書
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型です。

```python
# バランスシート
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します。

```python:output.py
import mplfinance as mpf
```
ローソク足でプロット

```python
# ローソク足でプロット(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,列の幅）

```python
# 表を出力（引数：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します。


```python:tech.py
import talib as ta
import numpy as np
```
移動平均

```python
# 移動平均
# 代表値:分足(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)
```
移動平均（単一）

```python
# 移動平均（単一）
def sma(df,period=9):
    df["sma_"+str(period)]= df["Close"].rolling(period).mean().round(2)
```
ボリンジャーバンド

```python
# ボリンジャーバンド
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

```python
# 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

```python
# RSI
def rsi(df,period=14):
    df["rsi"]=ta.RSI(df['Close'], timeperiod=period)
```
変化率

```python
# 変化率:rate of change (percentage) （period=1,日足なら前日から何%増減したか）
def roc(df,period=9):
    df["roc"]=ta.ROC(df['Close'],timeperiod=period)
```
モーメンタム

```python
# モーメンタム
def mom(df,period=10):
    df["mom"]=ta.MOM(df['Close'],timeperiod=period)
```
加重移動平均

```python
# 加重移動平均
def wma(df,period=9):
    df["wma_"+str(period)]=ta.WMA(df['Close'],timeperiod=period)
```
指数移動平均

```python
# 指数移動平均
def ema(df,period=9):
    df["ema_"+str(period)]=ta.EMA(df['Close'],timeperiod=period)
```
スローストキャスティクス

```python
# スローストキャスティクス
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)   
```
ファーストストキャスティクス

```python
# ファーストストキャスティクス
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)
```
分散

```python
# 分散
def var(df,period=5):
    df["var"]=ta.VAR(df["Close"],timeperiod=period)
```
相関

```python
# 相関 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構成銘柄の株価データを取得する場合

1. get.topix500()で、TOPIX500の銘柄リストを取得します。
2. dl.price_update()で株価データのダウンロードと株価データ取得済みの銘柄については最新のデータを追加します。

```python:sample.py
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構成銘柄の株価データを読み込む場合

1. get.topix500()で、TOPIX500の銘柄リストを取得します。
2. dl.price()で株価データの読み込みを行います。
3. 読み込んだ株価データの終値（Close）のみをデータフレームに追加しています。

```python:sample2.py
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]
```

# 最後に（記事の紹介）
この分析ツールを利用して、テクニカル分析、分散投資の効果を検証しています。以下は実際に検証してみた記事の一部です。今後も同様な検証を行っていきます。興味ある方はご覧いただけると幸いです！

- [【5年分データ分析】ゴールデンクロスの数日後に株価は上がっているのか](https://qiita.com/MandT500/items/1f2ed62922de3037fe3c)
> ＜あらすじ＞
> テクニカル分析の初歩「ゴールデンクロス」が実際にはどれだけ役に立つのか？
> TOPIX500銘柄を対象に5年分のデータを使って検証しました。
> 
> ＜結論＞
> ・様々な条件での実験で上昇している確率は約50%
> ・ゴールデンクロス単体だけで買いタイミングを判断してはいけない

- [投資タイミングを判断するときに必ず見てほしい指標RSIをデータ分析](https://qiita.com/MandT500/items/37c2d357e89ca6354d13)
> ＜あらすじ＞
> 「買われすぎ」や「売られすぎ」といった相場の勢いを表す過熱感
> その過熱感を数値で判断できるRSIについて検証しました。
> 
> TOPIX500銘柄の過去5年分のデータを使って
> RSIの買いサインの数日後に、株価が上がっているのかを調査します。
> 
> ＜結論＞
> ・RSIの使い方次第で確実に勝率を上げられる
> ・投資タイミングの判断材料として有効である

- [日経225全銘柄の投資効率を検証](https://qiita.com/MandT500/items/f4aaafa0de824dab92c2)
> 株式投資における投資によるリターン（株価収益率），投資に伴うリスク（収益率の分散），リスクに対するリターン（シャープ・レシオ）の計算方法について紹介し，2020年8月1日から2020年10月31日の期間における日経225全銘柄を対象にPythonプログラムを用いて，この3つの指標について計算しました．
> 
>  リスク回避的な投資家の中でも，ある程度リスクに寛容な投資家，リスクを最重視する投資家，ある程度のリスクを取り，リスクに対する収益率を重視する投資家に分類し，それぞれが選ぶべき銘柄について以下のように考察しました．
> 
>  リスクに寛容で収益率を重視する投資家：日本製鋼所
> リスクを重視する投資家：日本たばこ産業
> リスクに対する収益率を重視する投資家：ファーストリテイリング，デンソー，東海カーボン

- [２銘柄投資における投資効率が最も高い投資先の組み合わせ](https://qiita.com/MandT500/items/488307334c727e4c484e)
> 今回はTOPIX500構成銘柄の2銘柄に投資するとき，どの銘柄にどんな比率で投資すればリスクを抑えながら収益が得られるかを検証してみました．
> 
> その結果，レーザーテックに0.475，エムスリーに0.53の比率で投資したときがリスクに対して最も収益が得られることがわかりました．このときの投資効率の高さ（シャープレシオ）は1銘柄投資では実現できなかった値の高さとなりました．