pythonでテキストファイルの数値データを取り扱う
pythonで実際のデータを使って計算を行いたいというときがある。例えば、日経平均株価のデータが1年分あって、その平均・分散、あるいはVaRを計算したい、とか。こういったときにpyhonにいかに数値を読み込ませてどう分析しますか、という話。
例えば下記のようなテキストの数値データがあるとする(これは過去1年・250日分の日経平均データ)。ここからデイリーの平均リターン、標準偏差を知りたい。
これを、下記の4ステップで行う。
1.データの読み込み
2.文字列から数値への変換
3.数値への処理
4.平均・標準偏差の計算
まず1は、テキストデータを作業ディレクトリと同じ階層において、次のコマンド。
f=open('sample.txt') line=f.readlines() f.close()
readlines()によって、全ての行の数値がlistの形で読み込まれている。
よって、line=['8870.16\n','8949.87\n',(以下...)]という形になっている。
この状態だと、それぞれの値が文字列として認識されているため、数値への変換を行う。
それを行うのがfloat(x)というもの。ただし浮動小数点の場合。精数ならint(x)でOK。これを各要素に対して行えばいいので、データ数が250個だとすると、予め別のリストを用意しておき、
kabuka=[] for i in range(0,249): kabuka.append(float(line[i]))
これがステップ2に相当し、kabukaに250個のデータが入った状態となる。
次はこれを日々のリターンにすればよいので、新たなリストr=[]を用意(*追記:"return"は使えないので"r"に修正しました)し、
for i in range(0,248): r.append(kabuka[i]-kabuka[i+1])
で、平均は、
sum=0 for i in range(0,248): sum=sum+r[i] average=sum/249.0
分散は、
r2=[] for i in range(0,248): r2.append(return[i]*return[i]) sum2+=r2[i] average2=sum2/249.0 Variance=average2-average**2
となる。
本末転倒感もあるけど検算はエクセルで。
普通はリターンはログノーマルを用いるので、下記のまとめではログノーマルを実装。
#テキストの読み出し f=open('sample.txt') line=f.readlines() f.close() #数値データに変換 kabuka=[] for i in range(0,250): kabuka.append(float(line[i])) #リターン算出 import math r=[] for i in range(0,249): r.append(math.log(kabuka[i]/kabuka[i+1])) #平均算出 sum=0 for i in range(0,249): sum+=r[i] average=sum/249.0 #分散算出 sum2=0 r2=[] for i in range(0,249): r2.append(r[i]*r[i]) sum2+=r2[i] average2=sum2/249.0 Variance=average2-average**2 stdev=math.sqrt(Variance)
エクセルの検算と一致。