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)

エクセルの検算と一致。