今はベンチャーと提携してAIファンドをプロジェクトとして進めながら、同時に自分でも武器の一つにしたいと思いディープラーニングを勉強している。

 

参考にさせてもらっているのは以下のページ。
Tensorflowで株価予想
http://qiita.com/akiraak/items/b27a5616a94cd64a8653

 

pythonも初めて、tensorflowも初めてで四苦八苦だが、なんとか日経225の銘柄と他国の指数の、終値・高値・安値・出来高を使って、翌日の寄りから引けまでを3段階に分類し、ロングショートを組むモデルを作るところまではいった。

 

python3.5やtensorflowのver.upで載っているコードはそのまま使えず、その改変を苦労したのと、俺はYahooではなくBloombergから直接、csvでなくxlsxでとってくるのでそこの扱いの違い等も苦労した。。本質的なところじゃないけども。

 

とりあえず、上に紹介している方のコードからの変更点は以下の通り。
・種々のpython3.5の様式変更
・Yahooからとってくるのではなく、すでにあるxlsxデータファイルからの読み込み
・ロングショートどちらも行う
・手数料体系を実際のファンド運用での体系に変更
・銘柄ごとの最低購入金額を始値×単元株式数にして、実際に購入・売却できる金額に変更
・225すべての銘柄を学習データに加えられるようにする

 

225すべて使うよりも、代表指数とその銘柄のみでやったほうが、代表30銘柄のシミュレーションはリターンが出る。(まぁ、代表指数のみでやったら0.6%、225すべて使うと-2.5%年率というカスのような結果。上の人と最終的に数値が違うのが、二つ大きなところがあって、手数料が10bspと一律高めに設定しているのと、単元株式数を考慮しているところと、ロングショートで組んでいるところ。ロングだけでやってもそこまで成績変わらないので、単元株式数を導入しているところが多分大きい。)

 

とりあえず、いろいろと変更しながらモデルを回さないといけないので、早くGPUの入ったパソコンを購入させねば、、

 

これはデイ用で、うちみたいな資金量だとマーケットインパクトがでかすぎて使えない(まぁ、ぶっちゃけ平均日次売買代金20億円以上とかで切ればできなくもないが、リターンがみこめないのは見えている)ので、今後は1週間、もしくは1ヶ月先の株価の上下を分類問題にして、横串、縦串のPBR,PER,ROE、出来ればコンセンサスのOPの成長率なども加えて回して行きたいと考えている。

 

まぁ、とりあえず少しずつ進捗しているということで、ご報告。

 

FXでもこれをやりたいのと、DNNだけではなく、高速フーリエ変換したり、システマティックにやりたいことは結構目白押し。そこにDNNもかけれたら面白そうだ。。

 

ただ、まだまだプログラミング技術と、そこらへんの概念への理解が乏しい。

 

年内には実用に足るモデルを株でも為替でも1つか2つは作るのが目標ってことで、頑張っていこうと思う。

 

さて、以下素人ながら、メインの部分のソースコードを公開。上に載せてあるページのコードでエラーが出たりする人の参考にもなるかなと。下手すぎて参考にならんかな。
他の.pyも結構変更しているんだが、そこは想像しながらやってくれ。

 

from __future__ import print_function

import datetime
import os
import shutil
import xlrd
import math
import operator as op
from collections import namedtuple
import numpy as np
import pandas as pd
import tensorflow as tf
import argparse
from fetchstock import BloomIn, BloomJp
from nikkei225 import nikkei225, nikkei225_s, brand_name, brand_unit
from layer_log import LayerLog
from feed_cache import FeedCache
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'

TEST_COUNT = 200 # テスト日数
TRAIN_MIN = 800 # 学習データの最低日数
TRAIN_MAX = None # 学習データの最大日数
DAYS_BACK = 3 # 過去何日分を計算に使用するか
STEPS = 10000 # 学習回数
CHECKIN_INTERVAL = 100 # 学習の途中結果を表示する間隔
REMOVE_NIL_DATE = True # 計算対象の日付に存在しないデータを削除する
PASS_DAYS = 10 # 除外する古いデータの日数
DROP_RATE = 0.1 # 学習時のドロップアウトの比率
UP_RATE = 0.07 # 上位何パーセントを買いと判断するか
STDDEV = 1e-4 # 学習係数
REMOVE_NEWEST_DAYS = 200 * 0 # 除外する最新のデータ日数

CLASS_LABELS = ['DOWN', 'NEUTRAL', 'UP']
CLASS_DOWN = 0
CLASS_NEUTRAL = 1
CLASS_UP = 2
CLASS_COUNT = len(CLASS_LABELS)

# 学習データに使用するパラメータのラベル
PARAM_LABELS = ['Close', 'High', 'Low', 'Volume']

# 銘柄情報の入れ物
class Stock(object):
def __init__(self, downloadClass, code, start_days_back):
self.downloadClass = downloadClass
self.code = code
self.download = self.downloadClass(self.code)
self.start_days_back = start_days_back

@property
def dataframe(self):
return self.download.dataframe

Dataset = namedtuple('Dataset','training_predictors training_classes test_predictors test_classes')
Environ = namedtuple('Environ', 'sess model actual_classes training_step dataset feature_data keep_prob saver')

def load_exchange_dataframes(stocks, target_exchange):
#株価を読み込む
datas = {}

for (name, stock) in stocks.items():
datas[name] = stock.dataframe

#計算対象の日付に存在しないデータを削除する
if REMOVE_NIL_DATE:
target_indexes = datas[target_exchange].index
for (exchange, data) in datas.items():
for index in data.index:
if not index in target_indexes:
datas[exchange] = datas[exchange].drop(index)

return datas

def get_using_data(dataframes, target_exchange):
using_data = pd.DataFrame()
datas = [(target_exchange, dataframes[target_exchange])]
datas.extend([(exchange, dataframe) for exchange, dataframe in dataframes.items() if exchange != target_exchange])#特定の指標がデータ数足りなくても学習できるようにする
for exchange, dataframe in datas:
using_data['{}_OPEN'.format(exchange)] = dataframe['Open']
using_data['{}_CLOSE'.format(exchange)] = dataframe['Close']
using_data['{}_High'.format(exchange)] = dataframe['High']
using_data['{}_Low'.format(exchange)] = dataframe['Low']
using_data['{}_Volume'.format(exchange)] = dataframe['Volume']
using_data = using_data.fillna(method='ffill')
return using_data

def zscore(np_array):
'''配列の標準化を行う
'''
a1 = np_array.replace(0, 1.).replace(np.inf, 1.).replace(np.nan, 1.)#エラー出そうなものは、すべて前日からの変化なしと考える
a2 = a1 - a1.mean()
a3 = a2 / a2.std()
return a3

def get_log_return_data(stocks, using_data):
log_return_data = pd.DataFrame()
for (name, stock) in stocks.items():
open_column = '{}_OPEN'.format(name)
close_column = '{}_CLOSE'.format(name)
high_column = '{}_High'.format(name)
low_column = '{}_Low'.format(name)
volume_column = '{}_Volume'.format(name)

# 学習データの「終値/始値」を取得
train_close_rates = (using_data[close_column]/using_data[close_column].shift()).values[:len(using_data[close_column]) - TEST_COUNT]
# 小さい順にソートする
train_close_rates.sort()
# 何%以上上昇した場合に購入するかの閾値を得る
up_index = int(len(train_close_rates) * (1. - UP_RATE))
up_rate = train_close_rates[up_index] - 1.

# np.log(当日終値 / 前日終値) で前日からの変化率を算出
# 前日よりも上がっていればプラス、下がっていればマイナスになる
log_return_data['{}_Close_RATE'.format(name)] = zscore(using_data[close_column]/using_data[close_column].shift())
# 当日高値 / 当日始値
log_return_data['{}_High_RATE'.format(name)] = zscore(using_data[high_column]/using_data[open_column])
# 当日安値 / 当日始値
log_return_data['{}_Low_RATE'.format(name)] = zscore(using_data[low_column]/using_data[open_column])
# 当日出来高 / 前日出来高
log_return_data['{}_Volume_RATE'.format(name)] = zscore(using_data[volume_column]/using_data[volume_column].shift())

# 答を求める
answers = []
# 下がる/上がると判断する変化率
change_rate = up_rate
for value in (using_data[close_column] / using_data[open_column]).values:
if value < (1 - change_rate): # 下がる answers.append(CLASS_DOWN) elif value > (1 + change_rate):
# 上がる
answers.append(CLASS_UP)
else:
# 変化なし
answers.append(CLASS_NEUTRAL)
log_return_data['{}_RESULT'.format(name)] = answers

return log_return_data

def build_training_data(stocks, log_return_data, target_exchange, max_days_back=DAYS_BACK):

columns = ['answer_{}'.format(label) for label in CLASS_LABELS]

# 答を詰める
for i in range(CLASS_COUNT):
column = columns[i]
log_return_data[column] = 0
indices = op.eq(log_return_data['{}_RESULT'.format(target_exchange)], i)
log_return_data.ix[indices, column] = 1

# 各指標のカラム名を追加
for colname, _, _ in iter_exchange_days_back(stocks, target_exchange, max_days_back):
for date_type in PARAM_LABELS:
columns.append('{}_{}'.format(colname, date_type))

# データ数をもとめる
max_index = len(log_return_data)

# 学習データを作る
training_test_data = pd.DataFrame(columns=columns)
for i in range(max_days_back + PASS_DAYS, max_index):
# 先頭のデータを含めるとなぜか上手くいかないので max_days_back + PASS_DAYS で少し省く
values = {}
# 答を入れる
for answer_i in range(CLASS_COUNT):
column = columns[answer_i]
values[column] = log_return_data[column].ix[i]
# 学習データを入れる
for colname, exchange, days_back in iter_exchange_days_back(stocks, target_exchange, max_days_back):
for date_type in PARAM_LABELS:
col = '{}_{}'.format(colname, date_type)
values[col] = log_return_data['{}_{}_RATE'.format(exchange, date_type)].ix[i - days_back]
training_test_data = training_test_data.append(values, ignore_index=True)

# index(日付ラベル)を引き継ぐ
training_test_data.index = log_return_data.index[max_days_back + PASS_DAYS: max_index]
return training_test_data

def iter_exchange_days_back(stocks, target_exchange, max_days_back):
for (exchange, stock) in stocks.items():
end_days_back = stock.start_days_back + max_days_back
for days_back in range(stock.start_days_back, end_days_back):
colname = '{}_{}'.format(exchange, days_back)
yield colname, exchange, days_back

def split_training_test_data(num_categories, training_test_data):

# 最新のデータを除外する
if REMOVE_NEWEST_DAYS:
training_test_data = training_test_data[:-REMOVE_NEWEST_DAYS]
# 学習とテストに使用するデータ数を絞る
if TRAIN_MAX:
training_test_data = training_test_data[:TRAIN_MAX+TEST_COUNT]

# 先頭いくつかより後ろが学習データ
predictors_tf = training_test_data[training_test_data.columns[num_categories:]]
# 先頭いくつかが答えデータ
classes_tf = training_test_data[training_test_data.columns[:num_categories]]

# 学習用とテスト用のデータサイズを求める
training_set_size = len(training_test_data) - TEST_COUNT

return Dataset(
training_predictors=predictors_tf[:training_set_size],
training_classes=classes_tf[:training_set_size],
test_predictors=predictors_tf[training_set_size:],
test_classes=classes_tf[training_set_size:],
)

def smarter_network(stocks, dataset, layer1, layer2):
sess = tf.Session()

num_predictors = len(dataset.training_predictors.columns)
num_classes = len(dataset.training_classes.columns)

feature_data = tf.placeholder("float", [None, num_predictors])
actual_classes = tf.placeholder("float", [None, num_classes])
keep_prob = tf.placeholder(tf.float32)

layer_counts = [layer1, layer2, CLASS_COUNT]
weights = []
biases = []
model = None

for i, count in enumerate(layer_counts):
# 重み付けの変数定義
if i == 0:
weights = tf.Variable(tf.truncated_normal([num_predictors, count], stddev=STDDEV))
else:
weights = tf.Variable(tf.truncated_normal([layer_counts[i - 1], count], stddev=STDDEV))
# バイアスの変数定義
biases = tf.Variable(tf.ones([count]))

if model == None:
# 一番最初のレイヤー
model = tf.nn.relu(tf.matmul(feature_data, weights) + biases)
else:
if (i + 1) < len(layer_counts):
# 最後ではないレイヤー
model = tf.nn.relu(tf.matmul(model, weights) + biases)
else:
# 最終レイヤーの前には dropout を入れる
model = tf.nn.dropout(model, keep_prob)
model = tf.nn.softmax(tf.matmul(model, weights) + biases)

# 予測が正しいかを計算(学習に使用する)
cost = -tf.reduce_sum(actual_classes*tf.log(model))
training_step = tf.train.AdamOptimizer(learning_rate=STDDEV).minimize(cost)

saver = tf.train.Saver()

# 変数の初期化処理
init = tf.global_variables_initializer()
sess.run(init)

return Environ(
sess=sess,
model=model,
actual_classes=actual_classes,
training_step=training_step,
dataset=dataset,
feature_data=feature_data,
keep_prob=keep_prob,
saver = saver
)

def save_sess_dir_path(target_exchange):
return os.path.join('sess_save', target_exchange)

def save_sess_file_path(target_exchange):
return os.path.join(save_sess_dir_path(target_exchange), 'sess.ckpt')

def save_sess(saver, sess, target_exchange):
dir_path = save_sess_dir_path(target_exchange)
# 既存のファイル(保存ディレクトリ)あったら削除
if os.path.exists(dir_path):
shutil.rmtree(dir_path)
os.makedirs(dir_path)
file_path = save_sess_file_path(target_exchange)
# 保存
saved_path = saver.save(sess, file_path)

def restore_sess(saver, sess, target_exchange):
file_path = save_sess_file_path(target_exchange)
# 読み出し
saver.restore(sess, file_path)

def train(load_sess, env, target_prices, target_exchange, target_unit):
if load_sess:
# 学習済みのファイルを読み込む
restore_sess(env.saver, env.sess, target_exchange)
money, trues, falses, actual_count, deal_logs, up_expectation_dates, down_expectation_dates = gamble(env, target_prices, target_unit)
score = (0., money, trues, falses, actual_count, deal_logs, up_expectation_dates, down_expectation_dates)
return score
else:

# 予測(model)と実際の値(actual)が一致(equal)した場合の配列を取得する
# 結果の例: [1,1,0,1,0] 1が正解
correct_prediction = tf.equal(
tf.argmax(env.model, 1),
tf.argmax(env.actual_classes, 1))
# 結果(例:[1,1,0,1,0] 1が正解)を float にキャストして
# 全ての平均(reduce_mean)を得る
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

max_train_accuracy = 0
lastScore = None

for i in range(1, 1 + STEPS):
env.sess.run(
env.training_step,
feed_dict=feed_dict(env, test=False, keep_prob = (1.0 - DROP_RATE)),
)
if i % CHECKIN_INTERVAL == 0:
train_accuracy = env.sess.run(
accuracy,
feed_dict=feed_dict(env, test=False),
)
money, trues, falses, actual_count, deal_logs, up_expectation_dates, down_expectation_dates = gamble(env, target_prices, target_unit)
true_count = trues[CLASS_UP] + falses[CLASS_UP]
true_rate = 0.
if true_count:
true_rate = float(trues[CLASS_UP]) / float(true_count)
# テストデータの開始と終了の日付を取得
test_dates = env.dataset.test_predictors.index
test_from_date = test_dates[0]
test_to_date = test_dates[-1]

print(i, '{:,d}円 {:.3f} {:.3f} {}-{}'.format(money, true_rate, train_accuracy, test_from_date, test_to_date))
if train_accuracy < 0.5:
break
else:
max_train_accuracy = train_accuracy
# 学習済みのデータを保存
save_sess(env.saver, env.sess, target_exchange)
lastScore = (max_train_accuracy, money, trues, falses, actual_count, deal_logs, up_expectation_dates, down_expectation_dates)

return lastScore

# 売買シミュレーション
def gamble(env, target_prices, target_unit):
# 予想
expectations = env.sess.run(
tf.argmax(env.model, 1),
feed_dict=feed_dict(env, test=True),
)

# 元金
money = 10000 * 1000
# 売買履歴
deal_logs = []
# 予想が当たった数
trues = np.zeros(CLASS_COUNT, dtype=np.int64)
# 予想が外れた数
falses = np.zeros(CLASS_COUNT, dtype=np.int64)
# 実際の結果の数
actual_count = np.zeros(CLASS_COUNT, dtype=np.int64)
# 実際の結果
actual_classes = getattr(env.dataset, 'test_classes')

up_expectation_dates = []
down_expectation_dates = []

# 結果の集計と売買シミュレーション
for (i, date) in enumerate(env.dataset.test_predictors.index):
expectation = expectations[i]
if expectation == CLASS_UP:
up_expectation_dates.append(date)
# 上がる予想なので買う
price = target_prices.download.price(date)
if price.all():
# 始値
open_value = float(price['Open'])
# 終値
close_value = float(price['Close'])
# 購入可能な株数
value = int(money / (open_value * float(target_unit)))
# 購入金額
buy_value = int(open_value * float(target_unit) * value)
# 売却金額
sell_value = int(close_value * float(target_unit) * value)
# 購入
money -= buy_value
# 購入手数料の支払い
money -= buy_charge(buy_value)
# 売却
money += sell_value
# 売却手数料の支払い
money -= buy_charge(sell_value)

if expectation == CLASS_DOWN:
down_expectation_dates.append(date)
# 下がる予想なので売る
price = target_prices.download.price(date)
if price.all():
# 始値
open_value = float(price['Open'])
# 終値
close_value = float(price['Close'])
# 売却可能な株数
value = int(money / (open_value * float(target_unit)))
# 購入金額
buy_value = int(close_value * float(target_unit) * value)
# 売却金額
sell_value = int(open_value * float(target_unit) * value)
# 購入
money -= buy_value
# 購入手数料の支払い
money -= buy_charge(buy_value)
# 売却
money += sell_value
# 売却手数料の支払い
money -= buy_charge(sell_value)

actual = np.argmax(actual_classes.ix[date].values)
if expectation == actual:
# 当たった
trues[expectation] += 1
else:
# 外れた
falses[expectation] += 1
actual_count[actual] += 1
deal_logs.append([date, CLASS_LABELS[expectation], CLASS_LABELS[actual], money])

return money, trues, falses, actual_count, deal_logs, up_expectation_dates, down_expectation_dates

def feed_dict(env, test=False, keep_prob=1.):
prefix = 'test' if test else 'training'
predictors = getattr(env.dataset, '{}_predictors'.format(prefix))
classes = getattr(env.dataset, '{}_classes'.format(prefix))
return {
env.feature_data: predictors.values,
env.actual_classes: classes.values.reshape(len(classes.values), len(classes.columns)),
env.keep_prob: keep_prob
}

def buy_charge(yen):
# GOMクリック証券現物手数料
charge = int(yen * 0.001)
return charge

def save_deal_logs(target_exchange, deal_logs):
save_dir = 'deal_logs'
if not os.path.exists(save_dir):
os.mkdir(save_dir)
with open('{}/{}.csv'.format(save_dir, target_exchange), 'w') as f:
f.write('\n'.join([','.join([str(log) for log in logs]) for logs in deal_logs]))

def save_up_expectation_dates(target_exchange, up_expectation_dates):
file_path = 'up_expectation_dates.csv'
brand_dates = []

# 既存のファイルがあれば読み込む
if os.path.exists(file_path):
with open(file_path, 'r') as f:
brand_dates = [line.split(',') for line in f.read().split('\n')]
brand_dates.append([target_exchange] + up_expectation_dates)

# 保存
with open(file_path, 'w') as f:
f.write('\n'.join([','.join([str(brand) for brand in brands]) for brands in brand_dates]))#こっちだとうまくいく
#f.write('\n'.join([','.join(str(brand)for brand in brand_dates)]))
print('Saved: {}'.format(file_path))

def save_down_expectation_dates(target_exchange, down_expectation_dates):
file_path = 'down_expectation_dates.csv'
brand_dates = []

# 既存のファイルがあれば読み込む
if os.path.exists(file_path):
with open(file_path, 'r') as f:
brand_dates = [line.split(',') for line in f.read().split('\n')]
brand_dates.append([target_exchange] + down_expectation_dates)

# 保存
with open(file_path, 'w') as f:
f.write('\n'.join([','.join([str(brand) for brand in brands]) for brands in brand_dates]))#こっちだとうまくいく
#f.write('\n'.join([','.join(str(brand)for brand in brand_dates)]))
print('Saved: {}'.format(file_path))

def main(stocks, target_exchange, layer1, layer2, load_sess, result_file=None):
# 学習データのキャッシュ
feed_cache = FeedCache(target_exchange, str(REMOVE_NEWEST_DAYS))
# 対象の銘柄名
target_brand_name = brand_name(target_exchange)
#対象の1単元
target_unit = brand_unit(target_exchange)

if not feed_cache.is_exist():
print('Make cache')
print('株価指標データを読み込む')
all_data = load_exchange_dataframes(stocks, target_exchange)

print('終値を取得')
using_data = get_using_data(all_data, target_exchange)

print('データを学習に使える形式に正規化')
log_return_data = get_log_return_data(stocks, using_data)

print('答と学習データを作る')
training_test_data = build_training_data(stocks, log_return_data, target_exchange)
feed_cache.save(training_test_data)
else:
print('Exist cache')
all_data = load_exchange_dataframes(stocks, target_exchange)
using_data = get_using_data(all_data, target_exchange)
training_test_data = feed_cache.load()
training_test_data.index = using_data.index[DAYS_BACK + PASS_DAYS: len(using_data)]

print('学習データをトレーニング用とテスト用に分割する')
dataset = split_training_test_data(CLASS_COUNT, training_test_data)
if len(dataset.training_predictors) < TRAIN_MIN:
print('[{}]{}: 学習データが少なすぎるため計算を中止'.format(target_exchange, target_brand_name))
with open('results.csv', 'a') as f:
f.write('{},{},ERROR\n'.format(target_exchange, target_brand_name))

# レイヤー検証ログに保存
brands = nikkei225_s
codes = 
layerLog = LayerLog('layer_logs', '{}_{}.csv'.format(layer1, layer2), codes)
layerLog.add(
target_exchange,
[-1, 0, 0, 0, 0, 0, 0, 0]
)

return

print('[{}]{}'.format(target_exchange, target_brand_name))

print('機械学習のネットワークを作成')
env = smarter_network(stocks, dataset, layer1, layer2)

print('学習')
train_accuracy, money, trues, falses, actual_count, deal_logs, up_expectation_dates, down_expectation_dates = train(load_sess, env, stocks[target_exchange], target_exchange, target_unit)

print('-- テスト --')
# 各クラスの正解率
rates = np.zeros(CLASS_COUNT, dtype=np.int64)
# 各クラスの正解数
counts = np.zeros(CLASS_COUNT, dtype=np.int64)
for i in range(CLASS_COUNT):
counts[i] = trues[i] + falses[i]
if counts[i]:
# 各クラスの正解率(予想数 / 正解数)
rates[i] = int(float(trues[i]) / float(counts[i]) * 100)
print('下げ正解率 : {}% 予想{}回'.format(rates[CLASS_DOWN], counts[CLASS_DOWN]))
print('変化なし正解率: {}% 予想{}回'.format(rates[CLASS_NEUTRAL], counts[CLASS_NEUTRAL]))
print('上げ正解率 : {}% 予想{}回'.format(rates[CLASS_UP], counts[CLASS_UP]))

print('-- 売買シミュレーション --')
print('売買シミュレーション結果 {:,d}円'.format(money))

# 結果をファイル保存
if result_file:
with open(result_file, 'a') as f:
f.write('{},{},{},{},{},{},{},{},{}\n'.format(
target_exchange,
target_brand_name,
money,
trues[CLASS_DOWN], falses[CLASS_DOWN],
trues[CLASS_NEUTRAL], falses[CLASS_NEUTRAL],
trues[CLASS_UP], falses[CLASS_UP]))
else:
print(
target_exchange,
target_brand_name,
money,
trues[CLASS_DOWN], falses[CLASS_DOWN],
trues[CLASS_NEUTRAL], falses[CLASS_NEUTRAL],
trues[CLASS_UP], falses[CLASS_UP])

# 売買履歴をファイルに保存
save_deal_logs(target_exchange, deal_logs)

# レイヤー検証ログに保存
brands = nikkei225_s
codes = 
layerLog = LayerLog('layer_logs', '{}_{}.csv'.format(layer1, layer2), codes)
layerLog.add(
target_exchange,
[
train_accuracy,
money,
trues[CLASS_DOWN], falses[CLASS_DOWN],
trues[CLASS_NEUTRAL], falses[CLASS_NEUTRAL],
trues[CLASS_UP], falses[CLASS_UP]
]
)

# 購入予想日を保存する
save_up_expectation_dates(target_exchange, up_expectation_dates)
save_down_expectation_dates(target_exchange, down_expectation_dates)

#ifの中身はスクリプトファイルとして実行された時のみ実行される。コマンドライン引数を格納するためのif文
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('target_exchange')
parser.add_argument('--load_sess', type=int, default=0)
parser.add_argument('--layer1', type=int, default=50)
parser.add_argument('--layer2', type=int, default=25)

args = parser.parse_args()

# 株価指標
stocks = {
'DOW': Stock(BloomIn, 'DOW', 1),
'FTSE': Stock(BloomIn, 'FTSE', 1),
'GDAXI': Stock(BloomIn, 'GDAXI', 1),
'HSI': Stock(BloomIn, 'HSI', 1),
'N225': Stock(BloomIn, 'N225', 1),
'NASDAQ': Stock(BloomIn, 'NASDAQ', 1),
'SP500': Stock(BloomIn, 'SP500', 1),
#'SSEC': Stock(BloomIn, 'SSEC', 1),
'1332': Stock(BloomJp, '1332', 1),
'1605': Stock(BloomJp, '1605', 1),
'1721': Stock(BloomJp, '1721', 1),
'1801': Stock(BloomJp, '1801', 1),
'1802': Stock(BloomJp, '1802', 1),
'1803': Stock(BloomJp, '1803', 1),
'1808': Stock(BloomJp, '1808', 1),
'1812': Stock(BloomJp, '1812', 1),
'1925': Stock(BloomJp, '1925', 1),
'1928': Stock(BloomJp, '1928', 1),
'1963': Stock(BloomJp, '1963', 1),
'2002': Stock(BloomJp, '2002', 1),
'2269': Stock(BloomJp, '2269', 1),
'2282': Stock(BloomJp, '2282', 1),
'2432': Stock(BloomJp, '2432', 1),
'2501': Stock(BloomJp, '2501', 1),
'2502': Stock(BloomJp, '2502', 1),
'2503': Stock(BloomJp, '2503', 1),
'2531': Stock(BloomJp, '2531', 1),
'2768': Stock(BloomJp, '2768', 1),
'2801': Stock(BloomJp, '2801', 1),
'2802': Stock(BloomJp, '2802', 1),
'2871': Stock(BloomJp, '2871', 1),
'2914': Stock(BloomJp, '2914', 1),
'3086': Stock(BloomJp, '3086', 1),
'3099': Stock(BloomJp, '3099', 1),
'3101': Stock(BloomJp, '3101', 1),
'3103': Stock(BloomJp, '3103', 1),
'3105': Stock(BloomJp, '3105', 1),
'3289': Stock(BloomJp, '3289', 1),
'3382': Stock(BloomJp, '3382', 1),
'3401': Stock(BloomJp, '3401', 1),
'3402': Stock(BloomJp, '3402', 1),
'3405': Stock(BloomJp, '3405', 1),
'3407': Stock(BloomJp, '3407', 1),
'3436': Stock(BloomJp, '3436', 1),
'3861': Stock(BloomJp, '3861', 1),
'3863': Stock(BloomJp, '3863', 1),
'3865': Stock(BloomJp, '3865', 1),
'4004': Stock(BloomJp, '4004', 1),
'4005': Stock(BloomJp, '4005', 1),
'4021': Stock(BloomJp, '4021', 1),
'4042': Stock(BloomJp, '4042', 1),
'4043': Stock(BloomJp, '4043', 1),
'4061': Stock(BloomJp, '4061', 1),
'4063': Stock(BloomJp, '4063', 1),
'4151': Stock(BloomJp, '4151', 1),
'4183': Stock(BloomJp, '4183', 1),
'4188': Stock(BloomJp, '4188', 1),
'4208': Stock(BloomJp, '4208', 1),
'4272': Stock(BloomJp, '4272', 1),
'4324': Stock(BloomJp, '4324', 1),
'4452': Stock(BloomJp, '4452', 1),
'4502': Stock(BloomJp, '4502', 1),
'4503': Stock(BloomJp, '4503', 1),
'4506': Stock(BloomJp, '4506', 1),
'4507': Stock(BloomJp, '4507', 1),
'4519': Stock(BloomJp, '4519', 1),
'4523': Stock(BloomJp, '4523', 1),
'4543': Stock(BloomJp, '4543', 1),
'4568': Stock(BloomJp, '4568', 1),
'4689': Stock(BloomJp, '4689', 1),
'4704': Stock(BloomJp, '4704', 1),
'4755': Stock(BloomJp, '4755', 1),
'4901': Stock(BloomJp, '4901', 1),
'4902': Stock(BloomJp, '4902', 1),
'4911': Stock(BloomJp, '4911', 1),
'5002': Stock(BloomJp, '5002', 1),
'5020': Stock(BloomJp, '5020', 1),
'5101': Stock(BloomJp, '5101', 1),
'5108': Stock(BloomJp, '5108', 1),
'5201': Stock(BloomJp, '5201', 1),
'5202': Stock(BloomJp, '5202', 1),
'5214': Stock(BloomJp, '5214', 1),
'5232': Stock(BloomJp, '5232', 1),
'5233': Stock(BloomJp, '5233', 1),
'5301': Stock(BloomJp, '5301', 1),
'5332': Stock(BloomJp, '5332', 1),
'5333': Stock(BloomJp, '5333', 1),
'5401': Stock(BloomJp, '5401', 1),
'5406': Stock(BloomJp, '5406', 1),
'5411': Stock(BloomJp, '5411', 1),
'5413': Stock(BloomJp, '5413', 1),
'5541': Stock(BloomJp, '5541', 1),
'5631': Stock(BloomJp, '5631', 1),
'5703': Stock(BloomJp, '5703', 1),
'5706': Stock(BloomJp, '5706', 1),
'5707': Stock(BloomJp, '5707', 1),
'5711': Stock(BloomJp, '5711', 1),
'5713': Stock(BloomJp, '5713', 1),
'5714': Stock(BloomJp, '5714', 1),
'5715': Stock(BloomJp, '5715', 1),
'5801': Stock(BloomJp, '5801', 1),
'5802': Stock(BloomJp, '5802', 1),
'5803': Stock(BloomJp, '5803', 1),
'5901': Stock(BloomJp, '5901', 1),
'6103': Stock(BloomJp, '6103', 1),
'6113': Stock(BloomJp, '6113', 1),
'6301': Stock(BloomJp, '6301', 1),
'6302': Stock(BloomJp, '6302', 1),
'6305': Stock(BloomJp, '6305', 1),
'6326': Stock(BloomJp, '6326', 1),
'6361': Stock(BloomJp, '6361', 1),
'6366': Stock(BloomJp, '6366', 1),
'6367': Stock(BloomJp, '6367', 1),
'6471': Stock(BloomJp, '6471', 1),
'6472': Stock(BloomJp, '6472', 1),
'6473': Stock(BloomJp, '6473', 1),
'6479': Stock(BloomJp, '6479', 1),
'6501': Stock(BloomJp, '6501', 1),
'6502': Stock(BloomJp, '6502', 1),
'6503': Stock(BloomJp, '6503', 1),
'6504': Stock(BloomJp, '6504', 1),
'6506': Stock(BloomJp, '6506', 1),
'6508': Stock(BloomJp, '6508', 1),
'6674': Stock(BloomJp, '6674', 1),
'6701': Stock(BloomJp, '6701', 1),
'6702': Stock(BloomJp, '6702', 1),
'6703': Stock(BloomJp, '6703', 1),
'6752': Stock(BloomJp, '6752', 1),
'6758': Stock(BloomJp, '6758', 1),
'6762': Stock(BloomJp, '6762', 1),
'6770': Stock(BloomJp, '6770', 1),
'6773': Stock(BloomJp, '6773', 1),
'6841': Stock(BloomJp, '6841', 1),
'6857': Stock(BloomJp, '6857', 1),
'6902': Stock(BloomJp, '6902', 1),
'6952': Stock(BloomJp, '6952', 1),
'6954': Stock(BloomJp, '6954', 1),
'6971': Stock(BloomJp, '6971', 1),
'6976': Stock(BloomJp, '6976', 1),
'6988': Stock(BloomJp, '6988', 1),
'7003': Stock(BloomJp, '7003', 1),
'7004': Stock(BloomJp, '7004', 1),
'7011': Stock(BloomJp, '7011', 1),
'7012': Stock(BloomJp, '7012', 1),
'7013': Stock(BloomJp, '7013', 1),
'7186': Stock(BloomJp, '7186', 1),
'7201': Stock(BloomJp, '7201', 1),
'7202': Stock(BloomJp, '7202', 1),
'7203': Stock(BloomJp, '7203', 1),
'7205': Stock(BloomJp, '7205', 1),
'7211': Stock(BloomJp, '7211', 1),
'7261': Stock(BloomJp, '7261', 1),
'7267': Stock(BloomJp, '7267', 1),
'7269': Stock(BloomJp, '7269', 1),
'7270': Stock(BloomJp, '7270', 1),
'7731': Stock(BloomJp, '7731', 1),
'7733': Stock(BloomJp, '7733', 1),
'7735': Stock(BloomJp, '7735', 1),
'7751': Stock(BloomJp, '7751', 1),
'7752': Stock(BloomJp, '7752', 1),
'7762': Stock(BloomJp, '7762', 1),
'7911': Stock(BloomJp, '7911', 1),
'7912': Stock(BloomJp, '7912', 1),
'7951': Stock(BloomJp, '7951', 1),
'8001': Stock(BloomJp, '8001', 1),
'8002': Stock(BloomJp, '8002', 1),
'8015': Stock(BloomJp, '8015', 1),
'8028': Stock(BloomJp, '8028', 1),
'8031': Stock(BloomJp, '8031', 1),
'8035': Stock(BloomJp, '8035', 1),
'8053': Stock(BloomJp, '8053', 1),
'8058': Stock(BloomJp, '8058', 1),
'8233': Stock(BloomJp, '8233', 1),
'8252': Stock(BloomJp, '8252', 1),
'8253': Stock(BloomJp, '8253', 1),
'8267': Stock(BloomJp, '8267', 1),
'8303': Stock(BloomJp, '8303', 1),
'8304': Stock(BloomJp, '8304', 1),
'8306': Stock(BloomJp, '8306', 1),
'8308': Stock(BloomJp, '8308', 1),
'8309': Stock(BloomJp, '8309', 1),
'8316': Stock(BloomJp, '8316', 1),
'8331': Stock(BloomJp, '8331', 1),
'8354': Stock(BloomJp, '8354', 1),
'8355': Stock(BloomJp, '8355', 1),
'8411': Stock(BloomJp, '8411', 1),
'8601': Stock(BloomJp, '8601', 1),
'8604': Stock(BloomJp, '8604', 1),
'8628': Stock(BloomJp, '8628', 1),
'8630': Stock(BloomJp, '8630', 1),
'8725': Stock(BloomJp, '8725', 1),
'8729': Stock(BloomJp, '8729', 1),
'8750': Stock(BloomJp, '8750', 1),
'8766': Stock(BloomJp, '8766', 1),
'8795': Stock(BloomJp, '8795', 1),
'8801': Stock(BloomJp, '8801', 1),
'8802': Stock(BloomJp, '8802', 1),
'8804': Stock(BloomJp, '8804', 1),
'8830': Stock(BloomJp, '8830', 1),
'9001': Stock(BloomJp, '9001', 1),
'9005': Stock(BloomJp, '9005', 1),
'9007': Stock(BloomJp, '9007', 1),
'9008': Stock(BloomJp, '9008', 1),
'9009': Stock(BloomJp, '9009', 1),
'9020': Stock(BloomJp, '9020', 1),
'9021': Stock(BloomJp, '9021', 1),
'9022': Stock(BloomJp, '9022', 1),
'9062': Stock(BloomJp, '9062', 1),
'9064': Stock(BloomJp, '9064', 1),
'9101': Stock(BloomJp, '9101', 1),
'9104': Stock(BloomJp, '9104', 1),
'9107': Stock(BloomJp, '9107', 1),
'9202': Stock(BloomJp, '9202', 1),
'9301': Stock(BloomJp, '9301', 1),
'9412': Stock(BloomJp, '9412', 1),
'9432': Stock(BloomJp, '9432', 1),
'9433': Stock(BloomJp, '9433', 1),
'9437': Stock(BloomJp, '9437', 1),
'9501': Stock(BloomJp, '9501', 1),
'9502': Stock(BloomJp, '9502', 1),
'9503': Stock(BloomJp, '9503', 1),
'9531': Stock(BloomJp, '9531', 1),
'9532': Stock(BloomJp, '9532', 1),
'9602': Stock(BloomJp, '9602', 1),
'9613': Stock(BloomJp, '9613', 1),
'9681': Stock(BloomJp, '9681', 1),
'9735': Stock(BloomJp, '9735', 1),
'9766': Stock(BloomJp, '9766', 1),
'9983': Stock(BloomJp, '9983', 1),
'9984': Stock(BloomJp, '9984', 1)
}
print('REMOVE_NEWEST_DAYS {}'.format(REMOVE_NEWEST_DAYS))
main(stocks, args.target_exchange, args.layer1, args.layer2, args.load_sess, result_file='results.csv')
ランキングポチは必ず頼むぞ。読み逃げは厳禁だ。

人気ブログランキングへ
にほんブログ村 為替ブログへ
にほんブログ村

売買ルールを手に入れたいなら、、、
動画講座はこちら
売買ルールの実践練習に、、、
チャートブックはこちら