In [1]:
# プログラムの書き方の様式編
# if文:条件分岐を実行する。
a=['x','y']
if 'x' in a:# もし文字xがリストaに含まれればOKと表示する。
    print("OK")
OK
In [2]:
# for文:for文ではループカウンターではなく、各要素に対して処理を最後まで繰り返す。
a=[1,2,3]
for i in a:
    print(i),#print文の最後にカンマ(,)を置くと改行されない。
1
2
3
In [3]:
# Python標準ライブラリー編
# 変更不可能なシーケンス型 文字列メソッド:x.split(y)
x="a,b,c d e" # 文字列xを","で区切る。
x.split(",")
Out[3]:
['a', 'b', 'c d e']
In [4]:
# 変更不可能なシーケンス型 in演算子
a="vwxyz" #リストaの文字列vwxyzに文字列vwがふくまれればTrueを返す。
'vw' in a
Out[4]:
True
In [5]:
# 変更不可能なシーケンス型 in演算子
a=["x","y","z"] # 文字xがaの要素に含まれればTrueを返す。
'x' in a
Out[5]:
True
In [6]:
# 変更可能なシーケンス型 リスト
a=[1,2,3,4,5]
a            # aと書くだけでaに保存されているデータが表示される。
Out[6]:
[1, 2, 3, 4, 5]

リストはインデックス化したり、スライスしたり新たな値(要素)を追加したり、ネストを作ることができる。

In [7]:
a[1] #要素の位置の姉弟は左端から始まり、左端はゼロであるので、#1は左端から2番目を表す。
Out[7]:
2
In [8]:
a[-3] #数字にマイナスをつけた場合は右端からの位置を表すので、#右から3番目の要素の内容が表示。
Out[8]:
3
In [9]:
a[-3:] #右端から3番目の右端までの要素をスライス(切り取って)して表示。
Out[9]:
[3, 4, 5]
In [10]:
a+[10,11,12] #これはリストaに10、11、12を加えている。
Out[10]:
[1, 2, 3, 4, 5, 10, 11, 12]

データベースの作り方は多数考えられる。

In [11]:
data1=['2013/1/1',1] #日付、価格
data2=['2014/1/1',2]
data3=data1+data2
data3
Out[11]:
['2013/1/1', 1, '2014/1/1', 2]

上記の結果と比較

In [12]:
data4=['2013/1/1',1] #日付、価格
data5=['2014/1/1',2]
data6=[data4+data5]
data6
Out[12]:
[['2013/1/1', 1, '2014/1/1', 2]]

さらに別の形でも可能

In [13]:
data7=['2013/1/1','20141/1'] #日付
data8=[1,2] #価格
data9=[data7,data8]
data9
Out[13]:
[['2013/1/1', '20141/1'], [1, 2]]
In [14]:
data10=['2013/1/1',1] #日付、価格
data11=['2014/1/1',2]
data12=[data10,data11]
data13=zip(*data12) #行と列を入れ替える。それぞれ2つのリストはタプルとなる。
data13
Out[14]:
<zip at 0x27713140188>

リストはさらに幾つかのメゾットをもっている。xは要素、項目等であり、値、文字、文字列、リスト(タプル、辞書)でもよい。

1、append(x):xをリストの最後に加える。

2、count(x):リストに含まれるxの数を数える。

3、index(x):値がxである最初のxを返す。

4、insert(i,x):i番目のポジションにxを挿入する。

5、pop(i):i番目のポジションのxを削除してその値を返す。

6、remove(x):Xである最初の値を削除する。

7、reverse(x):リストの中にある値、要素等の順番を逆にする。

In [16]:
data14=['2011/1/1']
data4.append('2012/1/1')# 日付の追加
data14
Out[16]:
['2011/1/1']
In [17]:
#IN[16]修正分
data14=['2011/1/1']
data14.append('2012/1/1')# 日付の追加
data14
Out[17]:
['2011/1/1', '2012/1/1']

日付と価格をペアとしてデータを更新

In [18]:
data15=['2013/1/1',1] #日付、価格
data16=['2014/1/1',2]
data17=['2015/1/1',2]
data18=[data15,data16]
data18.append(data17)
data18
Out[18]:
[['2013/1/1', 1], ['2014/1/1', 2], ['2015/1/1', 2]]

新たな列(要素)を加えていることに注意。

In [19]:
data19=['2013/1/1','2014/1/1'] #日付
data20=[1,2] #価格
data21=[data15,data16]
data21.append([100,200])
data21
Out[19]:
[['2013/1/1', 1], ['2014/1/1', 2], [100, 200]]
In [20]:
#IN[19]修正分
data19=['2013/1/1','2014/1/1'] #日付
data20=[1,2] #価格
data21=[data19,data20]
data21.append([100,200])
data21
Out[20]:
[['2013/1/1', '2014/1/1'], [1, 2], [100, 200]]

1つ1つの列(要素)についてデータを更新している。

In [21]:
data22=['2013/1/1','2014/1/1'] #日付
data23=[1,2] #価格
data24=[data22,data23]
data24[0].append('2015/1/1') #日付
data24[1].append(3) #価格
data24
Out[21]:
[['2013/1/1', '2014/1/1', '2015/1/1'], [1, 2, 3]]

重要箇所 データベース構築に知っておくと便利な方法

In [1]:
#IN[22]修正分
f=[]
k=0
for i in range(2):
    f.append([])
    for j in range(2):
        f[k].append(j+k)
    k+=1
f
Out[1]:
[[0, 1], [1, 2]]

リスト内包表記 リストを生成するための表記法の1つ。多くの場合for文で生成するよりも高速

In [24]:
#リスト内容記の例
a=["abc",3]
[x*2 for x in a]
Out[24]:
['abcabc', 6]

マッピング型

辞書型(ディクショナリ、dictionary)

辞書は2つの要素から鳴りたっていて、1つはインデックスであり、もう1つはそれに関連する要素である。

Pytonの描画ソフトであるmultplotlibで用する色の姉弟に用する記号の辞書を作ってみよう。

In [25]:
c_dic={'b':'blue','g':'green','r':'red','c':'cyan'}
print(c_dic)
{'b': 'blue', 'g': 'green', 'r': 'red', 'c': 'cyan'}

上記は、プリント文によりc_dicの内容を表示している。

辞書内包記

In [31]:
#辞書内包記の例
y=[1,3,9]
{str(x):x**2 for x in y}
Out[31]:
{'1': 1, '3': 9, '9': 81}

Pythonは組み込み関数以外の必要な関数を豊富なモジュールからimport文を用して取り込み使用する。

モジュールはPythonの関数定義や文の入ったファイルである。

必要な関数を得るためにそれが書かれているモジュールを取り込んで使用するが、それをインポートするという。

パッケージはモジュールを複数含んだファイルである。

パッケージはインポートすることができるし、またパッケージの中のモジュールだけをインポートすることもできる。

その際はfrom X import Yとする。モジュールXからサブモジュールYをインポートし、パッケージ名を表す接頭語なしで利用できる。

また、import as を用いるとモジュール名を短縮して用いることができる。import XYZ as Xとすると、接頭語はXYZではなくXと書けばすむ。

Datetime Python標準ライブラリーは日付、時刻、暦に関する関数を含んでいる。datetime,time,そしてcakendarモジュールは中核をなす。

In [27]:
from datetime import datetime
now=datetime.now()
now
Out[27]:
datetime.datetime(2017, 2, 21, 11, 5, 29, 497637)

というように、容易にOSから現在の日付と時刻を取得可能である。また、時間の差はつぎのように求められる。

In [29]:
dtime=now-datetime(2014,4,1)
dtime
Out[29]:
datetime.timedelta(1057, 39929, 497637)

最初の数字は日数、その右が時間、右端が秒である。これは確認してみよう。

In [30]:
dtime.days, dtime.seconds
Out[30]:
(1057, 39929)

1949年の日経平均株価の取得 セントルイス連邦銀行のfredデータベースからは1949年からの日経平均株価が手に配流ので、それをPandasを使ってダウンロードしよう。

データベースの加工

時系列データの分析は、1変量の分析と多変量の分析に分けることができる。

株式至上の総合的な価格の動きと経済動向の関係をみたければ、株価データと経済データの多変量のデータベースを用意する必要がある。

ただし、経済データでも4本値と出来高などを服務データは多変量時列の扱いになる。

データの結合

日経平均株価とドル/円の為替レートの相関がよく話題になるので、それを調べてみよう。

ドル/円の為替レートはセントルイス連邦準備銀行のfredデータベースから取得し、

それをpandasのconcat関数を用いて、日経平均株価のデータと結合。そして、20日営業日

の価格を用いて」相関を算出しその推移をグラフに表示

In [44]:
import pandas as pd
fx = pdr.DataReader('DEXJPUS',"fred",start,end)
port=pd.concat([price.Close,fx],axis=1).dropna()
n=port.Close.pct_change().dropna()
f=port.DEXJPUS.pct_change().dropna()
f.rolling(window=20).corr(n).plot(color="yellow")
plt.ylabel('correlation')
Out[44]:
<matplotlib.text.Text at 0x7f9c28580d30>

 相関が0.8から‐0.8の間を行ったり来たりししている様子が見て取れる。 さらにゆっくり とした大きな波があるようにも思える。

相関は金融関連の多くの価格の間の関係、そしていろいろな経済指標との間の関係を把握するために用いられる。

2つの価格が同じ方向に向いて動く回数が多いとそれは相関が強いという。

最大値は1である。2つの価格が逆の方法に向いて動くとき、それは負の相関をもつという。マイナス1が最も強い負の相関を表す。 相関がゼロであれば、2つの価格の

動きにその ような規則はない。  

相関はなじみやすい概念であるために、想像を掻き立てすぎてしまうきらいがある。

次に注意点を幾つか指摘してます。

相関についての注意点

1. 相関はー1から1までの値を取る。  

2. 相関は対称性をもつ。  

3. 相関はもとの尺度とは独立である。  

4. XとYが統計的に独立であれば、これらの間の相関はゼロである。  

5. しかし、これらの間の相関がゼロであってもこれらの2つの変数が独立であることを意味しない。  

6. 相関は線形の関係のみを説明しているのであり、非線形性の関係については何も語っていない。  

7. 相関が線形の関係の測度であるとしても、原因と結果については何も 語っていない。   ( Gujarati, Basi Econometrics から 抜粋)

In [ ]: