前提
価格の時系列データ
実現したいこと
プログラムの最初に任意の時間間隔での変数を設定して、それに伴って始値等を出力するプログラムを作りたいのですが、どうコードで表現すれば良いのか分からない状態です。
発生している問題・エラーメッセージ
(追記)
回答していただいた内容を元に、プログラムを書いてみました。
実行はされますが、問題点が1つあります。
①時刻の出力がおかしい。
試したこと
とにかく頭の中の考えを紙に書き出したのですが、うまくまとまらないです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/12/22 05:45 編集
2022/12/22 05:45

回答2件
0
②については、
案1:10進数の足し算の繰り上がりの応用で、
1桁目が100万進数、2桁目が60進数、3桁目も60進数であるような変則的な数値の加算だとして処理する。
案2:hh mm ss tttttt にそれぞれの数値が入っているとすると、
((hh*60+mm)*60+ss)*1000000+tttttt でマイクロ秒単位に変換して内部処理は全部これで行い、
最後に文字として出力する時点で逆の変換を行って hh mm ss tttttt を得る。
①については、「DBMSを使わないマスタートランザクション処理(バッチ処理)」の様な感じですね。
マスターデータ自体が無いのでちょっと面倒か。
また、「データが終わっても目標の時刻に達していないときにどうするか?」と言う問題があります。
例えば、午前中のデータで終わってしまったが、17時の分まで出力したい(最終の値をずっと出力し続ける)とか。
下記の「データを読む」でEOFに達していたら、t
にどんな時刻よりも大きい値をセットして処理を続けます。
これで、最後の区間のデータを特別扱いして出力する必要も無くなります。
あと、いきなり9:00からデータが無い場合は前日終値を使うんでしょうね。
text
1データ有り = 偽 2データを読む 3開始時刻 bgn と時間間隔を加算した終了時刻 end をセット 4四本値には前日終値をセット 5繰り返し 6 読んだデータの時刻 t が、 7 bgn<=t<endの時 8 データ有りが真の時 9 読んだ値を終値にセットし、高値、低値にも大小判断でセット 10 データ有りが偽の時 11 読んだ値を四本値すべてにセット 12 データ有り = 真 13 どちらの場合も 14 次のデータを読んで繰り返し先頭へ 15 t>=endの時 16 データ有りが真の時 17 bgn,始値,髙値,低値,終値を出力 18 データ有りが偽の時 かつ bgnが開始時刻ではないとき 19 bgn,終値,終値,終値,終値を出力 20 どちらの場合も 21 データ有り = 偽 22 bgnとendを更新 23 bgnが目標の時刻に達していたら終了 24 (次のデータは読まずにループ先頭に戻る) 25繰り返し終わり
実装例(Ruby)
上記の日本語説明で、Fortranプログラムは書けると思いますが、稼働確認のためにコードを書きました(Rubyを知らなくても読めるように書きました)。
細かいテストはしてないです。
他のデータで確認したいときは、ウェブ上でRubyプログラムを実行できるサイトがあると思うので、そこで実行してみてください。
Ruby
1def read_data 2# 時刻と値のペアを返す 3 # __END__行以降のデータを読む 4 line = DATA.gets 5 if line # EOFでない時 6 # 空白で分割して整数値に変換 7 line.split.map(&:to_i) 8 else # EOFの時 9 [999999,0] # 時刻として999999を返す 10 end 11end 12 13data_flag = false 14t, v = read_data 15t_int = 10 # 時間間隔 16t_first = 0 # 開始時刻 17t_last = 100 # 終了時刻 18 19t_bgn = t_first 20t_end = t_bgn + t_int 21 22# 始値 髙値 低値 終値 23v_b = v_h = v_l = v_e = 101 # 前日終値 24 25loop do # 無条件ループ 26 if t < t_end 27 if data_flag 28 v_e = v 29 if v > v_h then v_h = v end 30 if v < v_l then v_l = v end 31 else 32 v_b = v_h = v_l = v_e = v 33 data_flag = true 34 end 35 t, v = read_data 36 else 37 if data_flag 38 puts [t_bgn,v_b,v_h,v_l,v_e].join(" ") 39 elsif t_bgn > t_first 40 puts [t_bgn,v_e,v_e,v_e,v_e].join(" ") 41 end 42 data_flag = false 43 t_bgn = t_end 44 t_end = t_bgn + t_int 45 if t_bgn > t_last 46 break # ループから抜け出す 47 end 48 end 49end 50# この先がデータとして読まれる 51__END__ 5220 100 5321 110 5422 101 5540 102 5651 107
結果:
text
110 101 101 101 101 220 100 110 100 101 330 101 101 101 101 440 102 102 102 102 550 107 107 107 107 660 107 107 107 107 770 107 107 107 107 880 107 107 107 107 990 107 107 107 107 10100 107 107 107 107
投稿2022/12/22 06:46
編集2022/12/22 07:17総合スコア86295
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
時系列データには時刻がとんでいる場合もあり、その場合でも始値等を出力したいです。
「最後に読んだデータの時刻と価格」 = ファイルを読む 「開始時刻」 を 適切に初期化 (どうするか書いてない、最初のデータからスタート?) ファイル最後まで繰り返し 始値、高値、安値、終値 =「最後に読んだデータの価格」 「終了時刻」 = 「開始時刻」 + 「時間間隔」 「最後に読んだデータの時刻」が「終了時刻」を超えるまで繰り返し 「最後に読んだデータの時刻と価格」 = ファイルを読む 高値、安値を「最後に読んだデータの価格」で適宜更新 終値 =「最後に読んだデータの価格」 「開始時刻」 = 「開始時刻」 + 「時間間隔」
12桁の整数で表される時刻を、任意の時間間隔でどのように更新していく
マイクロ秒単位で表されてたら楽なので、マイクロ秒単位に変換します。
hhmmssttttt
形式の整数ですからhh部分は
1000000000
で割った整数部分ですし、mm部分は
1000000000
で割った余りを
10000000
で割った整数部分ですし、sstttttt部分は
10000000
で割った余りです。
投稿2022/12/22 04:37
総合スコア13553
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。