機械学習株価予想 基礎メモ1

# Pythonでチャート表示・分析基礎
株価のチャート、ローソク足、移動平均線表示させてみます。


# 機械学習・データサイエンス・株価予想基礎編
何かと話題になるテスラの株価比較のため主要自動車メーカーと比較します。
TESLA GM FORD読み込んでいきます。最後にはローソク足表示します。

```stock1.py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
import pandas_datareader
import datetime
import pandas_datareader.data as web

start = datetime.datetime(2013,1,1)
end = datetime.datetime(2018,1,1)

tesla = web.DataReader('TSLA','yahoo',start,end)
ford = web.DataReader('F','iex',start,end)
gm = web.DataReader('GM','iex',start,end)
```
※googleだと読めない。yahooだかiexでOK。結構状況が変わるようなのでyahooならいいというわけでないので注意。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260345/d7c56b5d-06f5-e6d7-26ea-2be175ea838a.png)

続いて可視化

```stock1.py
tesla['Open'].plot(label='Tesla',figsize=(12,8),title='Opening Prices')
gm['Open'].plot(label='GM')
ford['Open'].plot(label='Ford')
plt.legend();
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/260345/da305b8f-f537-f161-6114-4f93bf565207.png)
テスラ高いなｗ
始値で表示してます。日本語化してないので文字化けするのは面倒なので直してないです。

出来高みます

```stock1.py
tesla['Volume'].plot(label='Tesla',figsize=(12,8),title='Volume')
gm['Volume'].plot(label='GM')
ford['Volume'].plot(label='Ford')
plt.legend()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260345/39b53e30-5c14-f5e3-593b-82bef6bb92d7.png)

フォードでめっちゃ跳ねてるところあります。突発的なことを分析に含めてもしょうがないことは多いです。

```stock1.py
ford['Volume'].idxmax()
```
=>Timestamp('2013-12-18 00:00:00')
どの日かよくわかるかと。

フォードの株価見てみると出来高大きいから大きく変化するとも限らない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260345/eae69854-c522-e3fd-8877-28a288a030cf.png)

2014年の終わりごろ、2015年中盤より少し後の下落の方が酷いように見えます。
出来高なので多くても買いと売りが拮抗していたら価格全然変わらないということもあるわけです。
ということで出来高比較的小さくても、買いしかいなければ超上がるし、売りしかいなければ超下がるということ。

## 移動平均線
テクニカル的なことも表示してみます。

```stock1.py
tesla['MA25'] = tesla['Close'].rolling(25).mean()
tesla['MA50'] = tesla['Close'].rolling(50).mean()
tesla['MA200'] = tesla['Close'].rolling(200).mean()
tesla[['Close','MA25','MA50','MA200']].plot(figsize=(16,8))
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260345/7017eb2e-439a-11b2-081f-ad012a41f12f.png)

ごちゃごちゃしてますが単純移動平均線(SMA)で一般的なものを表示。

### 補足：テクニカル的な知識
MA25なら1か月分。MA50なら2か月分の平均を何となく表してることになります。（土日休みなので1週間5日分）
そして移動平均より上で角度ついていたら上昇トレンド、下で角度ついていたら下降トレンド。行き来していたらレンジ相場。
あとボリンジャーバンドも似たようなものなので（ミドルバンドがSMAなので）特徴量に使えなくもないかもしれないのかな？

短期線が長期線を下から上に抜いたらゴールデンクロスで買い。逆がデッドクロスなどもある。

## 車業界の関係性
3社を比較します。
3つを1つにくっつけて表示。

```stock1.py
from pandas.plotting import scatter_matrix

comp = pd.concat([tesla['Open'],ford['Open'],gm['Open']],axis=1)
comp.columns = ['Tesla Open','GM Opne','Ford Open']
comp.head()
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260345/77c04bab-1761-619d-4f11-13ccd9d78aa8.png)

## ローソク足(4本値)を描く
matplotlibでは標準で入っていないのでインストールします。

```
pip install mpl_finace
```

```stock1.py
import mpl_finance
from matplotlib.dates import DateFormatter,date2num,WeekdayLocator,DayLocator,MONDAY
```
2017年1月テスラの株価表示するならこんな感じ
.reset_index() は途中のもの抜きだすとインデックスおかしくなるので使ってます。

```stock1.py
tesla_17 =tesla.loc['2017-01'].reset_index() 
```

matplotlibのdate形式date2num変換。値を入れる

```stock1.py
tesla_17['date_conv'] = tesla_17['Date'].apply(lambda date: date2num(date))

cols = ['date_conv', 'Open', 'High', 'Low', 'Close']
tesla_val = [tuple(val) for val in tesla_17[cols].values]
```

週またいだりするときに変換必要なのと、x方向（時間軸）の変換。そして、ローソク足表示。

```stock1.py
mondays = WeekdayLocator(MONDAY)       
alldays = DayLocator()              
weekFormatter = DateFormatter('%b %d')  
dayFormatter = DateFormatter('%d')      

fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2)
ax.xaxis.set_major_locator(mondays)
ax.xaxis.set_minor_locator(alldays)
ax.xaxis.set_major_formatter(weekFormatter)

mpl_finance.candlestick_ohlc(ax, tesla_val, width=0.2,colorup='g',colordown='r');
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260345/7f4fe19c-85a8-1ee8-140a-6d27ec694df9.png)

細くてスカスカで気持ち悪いので増やす。

```stock1.py
from pylab import rcParams
rcParams['figure.figsize'] = 20,10
mondays = WeekdayLocator(MONDAY)       
alldays = DayLocator()              
weekFormatter = DateFormatter('%b %d')  
dayFormatter = DateFormatter('%d')      

fig, ax = plt.subplots()
fig.subplots_adjust(bottom=0.2)
ax.xaxis.set_major_locator(mondays)
ax.xaxis.set_minor_locator(alldays)
ax.xaxis.set_major_formatter(weekFormatter)

mpl_finance.candlestick_ohlc(ax, tesla_val, width=0.3,colorup='g',colordown='r');
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/260345/7303adf5-2a5e-7d2c-31e2-cc0e8d93b571.png)

時間軸が汚いですが表示はできました。

気が向いたら今度続き書きます。

# memo追記
為替ですがティックデータの取得方法ありましたので追記します。
デイトレ分析とかにいいのでは。

```fx_data_dl.py

import requests
import pandas as pd
from datetime import datetime, date
import zipfile

def download_gaincap(filename, path):
    tsdflg=True
    url_gc_path = "http://ratedata.gaincapital.com/"

    for i in range(len(filename)):
        # ファイルの取得
        url_file_path = filename[i]
        url_date_path="2017/12 December/"
        url =  url_gc_path + url_date_path+url_file_path
        res = requests.get(url)

        # ファイルの保存
        hd_path = path + url_file_path
        f = open(hd_path, 'wb')
        f.write(res.content)
        f.close()

        # zipファイルからの読み込み
        file_csv = "USD_JPY_Week%d.csv" %(i+1)
        print(file_csv)
        try:
            f = zipfile.ZipFile(hd_path).open(file_csv)
            #f = zipfile.ZipFile(hd_path).open()
            dfx=pd.read_csv(f, index_col=3)[['RateBid']]
            f.close()
            if tsdflg:
                tsd=dfx.copy()
                tsdflg=False
            else:
                tsd=tsd.append(dfx)
        except Exception:
            print("Error open zip file %s. The error is" %filename[i])
    return tsd

if __name__ == '__main__':
    filename0=["USD_JPY_Week1.zip",
             "USD_JPY_Week2.zip",
             "USD_JPY_Week3.zip",
             "USD_JPY_Week4.zip"]
    # path修正すること
    path0="C:\\users\\oooooo\\gaincap\\"
    ts=download_gaincap(filename0, path0)
    print(ts[-5:])
print("end----------------------------------")
```