このディレクトリの索引

# 出典 :: 今はじめるプログラミング言語をさがすスレ #284 # 過去の株価を利用したシミュレーションプログラム。 # 具体的には、データとして興味のある某銘柄の日柄(日別に始値、高値、安値、終値、出来高) # を10年分オープンオフィスの表計算calcにyahooファイナンスから入手しました。 # 例えば、このデータを使って特定の日にその株を1000株買い、以降10円上がれば売り、売り値から # 10円下がればまた買い、その買値より10円下がれば買い増し(仮の現金残高がなくなるまで)し、 # それぞれは買値より10円上がると売る。 # 持ち株がなくなると、高値から1割下がったところからまた始める。 # というようなことを繰り返すと、いくらの利益でいくらの買値ので # どれぐらい持ち株になった状態かを結果としてだすものです。 株式売買シミュレーション(_CSVファイル,_開始日,_日付/N,_初期現金残高,_現金残高,_持株数) :- 'CSVファイルを株価情報ならびとして読み取る'(_CSVファイル,_株価情報ならび), '開始日の前日からの情報を切り取り、シミュレーション'(_株価情報ならび,_開始日,_日付/N,_初期現金残高,_現金残高,_持株数). 'CSVファイルを株価情報ならびとして読み取る'(_CSVファイル,_株価情報ならび) :- 'CSVファイルを項目区切り行ならびとして読み取る'(_CSVファイル,_株価情報ならび). '開始日の前日からの情報を切り取り、シミュレーション'(_株価情報ならび,_開始日,_日付,N,_初期現金残高,_現金残高,_持株数) :- append(_,[_開始日の前日情報,[_開始日,_始,_高,_安,_終,_出来]|R2],_株価情報ならび), シミュレーション([_開始日の前日情報,[_開始日,_始,_高,_安,_終,_出来]|R2],_日付,N,_始,_売買値,_初期現金残高,_現金残高,0,_持株数). シミュレーション([[_,_,_,_,_前終,_],[_日付,_始,_高,_安,_終,_]|R],_日付,N,_売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数) :- 売買の契機(_前終,_始,_高,_安,_終,_契機ならび), 一日のシミュレーション(1,N,_契機ならび,_売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数). シミュレーション([[_,_,_,_,_前終,_],[_日付,_始,_高,_安,_終,_]|R],_日付,N, _売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数) :- 売買の契機(_前終,_始,_高,_安,_終,_契機ならび), 一日のシミュレーションの二(_契機ならび,_売買値1,_売買値2,_現金残高1,_現金残高2,_持株数1,_持株数2), シミュレーション([[_日付,_始,_高,_安,_終,_]|R],_日付,N,_売買値2,_売買値,_現金残高2,_現金残高,_持株数2,_持株数). 一日のシミュレーション(M,M,[_値|R],_売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数) :- オペ(_売買値1,_売買値,_値,_現金残高1,_現金残高,_持株数1,_持株数). 一日のシミュレーション(M,N,[_値|R],_売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数) :- オペ(_売買値1,_売買値2,_値,_現金残高1,_現金残高2,_持株数1,_持株数2), M2 is M + 1, 一日のシミュレーション(M2,N,R,_売買値2,_売買値,_現金残高2,_現金残高,_持株数2,_持株数). 一日のシミュレーションの二([],_売買値,_売買値,_現金残高,_現金残高,_持株数,_持株数) :- !. 一日のシミュレーションの二([_値|R],_売買値1,_売買値,_現金残高1,_現金残高,_持株数1,_持株数) :- オペ(_売買値1,_売買値2,_値,_現金残高1,_現金残高2,_持株数1,_持株数2), 一日のシミュレーションの二(R,_売買値2,_売買値,_現金残高2,_現金残高,_持株数2,_持株数). 売買の契機(_前終,_始,_高,_安,_終,[_始,_高,_安,_終]) :- _安 = _終,!. 売買の契機(_前終,_始,_高,_安,_終,[_始,_安,_高,_終]) :- _高 = _終,!. 売買の契機(_前終,_始,_高,_安,_終,[_始,_高,_安,_終]) :- _始 > _前終,!. 売買の契機(_前終,_始,_高,_安,_終,[_始,_安,_高,_終]) :- _始 < _前終,!. 売買の契機(_前終,_始,_高,_安,_終,[_始,_安,_高,_終]) :- _始 = _前終,_終 > _始,!. 売買の契機(_前終,_始,_高,_安,_終,[_始,_高,_安,_終]) :- _始 = _前終,_終 < _始,!. 売買の契機(_前終,_始,_高,_安,_終,[_始,_高,_安,_終]) :- _始 = _前終,_終 = _始,!. オペ(_前回値,_売買値,_値,_現金残高1,_現金残高,_持株数1,_持株数) :- _買値 is _前回値 - 10, _値 =< _買値, '1000株買い'(_買値,_現金残高1,_現金残高2,_持株数1,_持株数2), オペ(_買値,_売買値,_値,_現金残高2,_現金残高,_持株数2,_持株数). オペ(_前回値,_売買値,_値,_現金残高1,_現金残高,_持株数1,_持株数) :- _売値 is _前回値 + 10, _値 >= _売値, '1000株売り'(_売値,_現金残高1,_現金残高2,_持株数1,_持株数2), オペ(_売値,_売買値,_値,_現金残高2,_現金残高,_持株数2,_持株数). オペ(_売買値,_売買値,_値,_現金残高,_現金残高,_持株数,_持株数). '1000株売り'(_売値,_現金残高1,_現金残高2,_持株数1,_持株数2) :- _持ち株数 >= 1000, _持株数2 is _持株数1 - 1000, _現金残高2 is _現金残高1 + _売値 * 1000,!. '1000株売り'(_売値,_現金残高,_現金残高,_持株数,_持株数) :- _持ち株数 < 1000,!. '1000株買い'(_売値,_現金残高1,_現金残高2,_持株数1,_持株数2) :- _現金残高1 >= _売値 * 1000, _持株数2 is _持株数1 + 1000, _現金残高2 is _現金残高1 - _売値 * 1000,!. '1000株買い'(_売値,_現金残高,_現金残高,_持株数,_持株数) :- _持ち株数 < 1000,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'CSVファイルを項目区切り行ならびとして読み取る'(_CSVファイル,_項目区切りされた行ならび) :- open(_CSVファイル,read,_入力), 項目区切り行ならび(_入力,_項目区切りされた行ならび), close(_入力). 項目区切り行ならび(_入力,_項目区切りされた行ならび) :- findall(_項目区切りされた行,( repeat, (at_end_of_stream(_入力),!,fail; 行入力(_入力,_行), 項目区切り(_行,[',',' '],_項目区切りされた行))),_項目区切りされた行ならび). 行入力(_入力,_行) :- read_line_to_codes(_入力,_文字コードならび), atom_codes(_行,_文字コードならび). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび_1), 文字列ならびの中で数値に変換可能なものは変換する(_区切られた文字列ならび_1,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列).