2015年1月25日日曜日

遺伝的アルゴリズムでカブロボ制作② 評価関数の設計その1

今回は遺伝的アルゴリズムの肝でもある評価関数を設計しようと思います。
ひょっと複雑になりそうなので、前半後半の2つに分けて整理しながら作っていきます。

まず、評価関数の大枠としまして、どんな情報を使っていくかといいますと、
株価の時間変異データ(300日分以上)
遺伝子配列(前回作りました、買い遺伝子と売り遺伝子のことです)
の2つをインプットデータとして配列に入れていきます。
また、最初に遺伝子に元金を上げたいと思いますので、それも最初に入れておきます。

与えられたインプットデータを処理して、最終的にどのくらいの金額になったかをアウトプットしていきます。
肝心の処理としては、
ある時間地点において、遺伝子で指定した時間分だけさかのぼり、その地点との差を出します。
その差を0と1に変換して、ある時間地点における回答配列を作り、それを遺伝子の配列と比較して、売るか、買うか、なにもしないかを決めていきます。

今回はそのうち回答配列を作るまでを書いてみようと思います。

import sys
from dataload_class import vstr2date
from dataload_class import dataload

def predata_init():
    code = 1305
    data = dataload(code)
    data = data.loadfile()
    if data != 0:
      t = vstr2date(data)
#      print data[dataload.hajimene]
    return [t, data[dataload.hajimene]]

def main():
    stockPrice = [] #株価
    date = []   #日付
    popGrope =[]
    date,stockPrice = predata_init()
#    print date,stockPrice
    popGrope = [[[0, 1, 0, 0, 1, 0, 0, 1, 0, 1], [1, 0, 0, 1, 1, 0, 1, 1, 1, 1]], [[1, 1, 1, 1, 1, 0, 0, 1, 1, 1], [1, 1, 0, 1, 1, 1, 1, 1, 0, 0]], [[1, 1, 1, 0, 0, 0, 0, 0, 1, 1], [0, 1, 1, 1, 0, 1, 0, 0, 1, 1]], [[0, 1, 1, 1, 0, 0, 1, 1, 0, 0], [0, 0, 0, 1, 1, 0, 1, 0, 0, 0]], [[0, 0, 1, 0, 1, 0, 1, 1, 0, 1], [1, 1, 0, 0, 1, 1, 0, 1, 0, 0]], [[0, 1, 0, 0, 1, 1, 1, 1, 1, 1], [0, 1, 0, 1, 0, 1, 1, 1, 0, 1]], [[1, 1, 1, 1, 1, 1, 0, 1, 0, 0], [1, 0, 1, 1, 0, 1, 0, 0, 0, 0]], [[1, 0, 0, 0, 1, 0, 0, 0, 1, 0], [1, 0, 0, 1, 0, 0, 1, 0, 1, 1]], [[0, 1, 1, 1, 0, 1, 0, 0, 1, 1], [1, 0, 0, 0, 0, 1, 0, 1, 1, 1]], [[1, 0, 1, 0, 0, 0, 1, 0, 0, 1], [0, 0, 1, 1, 1, 1, 1, 0, 0, 1]]]
    popnum = 0
    pop = popGrope[popnum]
    kaiGean = pop[0]
    uriGean = pop[1]
    principal = 1000000 #元金(¥100万)
    #評価ループ
    lenStockprice = len(stockPrice)
#    print lenStockprice
    fluctuationArry =[] #現在時間の評価配列を作る
    today = lenStockprice - 100
    agoArry =[0,1,2,3,5,8,13,21,35,56,89]
    n=0
    m=0
    for j in range(300):
#        print date[today]
        for i in range(10):
            n = agoArry[i]
            m = agoArry[i+1]
#            print n,m
            ndayagoPrice = stockPrice[today + n]    #n日前の株価
            mdayagoPrice = stockPrice[today + m]    #m日前の株価
            changeValue =ndayagoPrice - mdayagoPrice
#            print mdayagoPrice, date[today + m]
            if changeValue<=0:
                fluctuationArry.append(0)#小さかったら評価配列に0追加
            else:
                fluctuationArry.append(1)
#        print fluctuationArry
        #ある地点での評価に使う配列完成
        #評価配列と遺伝子の一致度を見る

        fluctuationArry = []
        today = today -1    #日付を進める

    #評価ループ

if __name__ == '__main__':
    main()

インプットデータに使用した遺伝子は適当です。
前回作成した遺伝子の初期化コードで10この個体群を作りコピペしました。
だいぶ前に作りましたdataload_classクラスを使用しています。
次回は評価配列と遺伝子の一致度を見る以下に評価のためのコードを書いていこうと思います。

以前作成したdataload_classクラス
pythonで保存したファイルをロードする
読み込んだ日付をdatetime形式にする -poython 

0 件のコメント:

コメントを投稿