質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

1121閲覧

2つのpythonsコードの結果に違いが出る理由は?

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/08/17 11:45

編集2019/08/18 06:28

達成したいこと・問題点

1番目のコードと2番目のコードは流れ自体は変わりません。ただ一番目のコードは見にくく改善しようと2番目のコードに直しました。しかし、結果は同じになるはずなのですが違いが出てきてしまいます。

コードの説明

コード全体の趣旨としては、アクションは0か1のみになり前回と同様のアクションが選択されれば追加の購入(スプレッドを足す)または売り(スプレッドで引く)をstatesに追加します。
また、損切が発生している場合は、ロスカットをピップに追加し該当のstatesを削除します。
前回とアクションが異なれば利益確定をし、新しいstatesを定義します。

例えば価格が1の時購入しスプレッドが1だと仮定すれば, states = 1+1になります。
tlが4だとしても途中評価がなければ不当な利益確定になってしまいます。
そして価格が上がることが期待されるので利益確定は、現時点での価格を10とし計算式は 10-statesになります。

##変数の説明
外国為替ではPIPで報酬を決定します。

trend:報酬の決定に関する価格(その時間での始値になる)
pip:発生した報酬をためていくリスト
action:その時間での売るか買うどちらこの行動
position:前回のアクション
states:購入または売った価格が含まれたリスト
pip_cost:例えばUSDJPYでの1PIPは、10,000* .0001 = 1.のようになります。わかりにくいと思いますが、.0001のほうがtrend-statesで、それを1PIPに変化せるための数字
spread:購入または売り関する手数料、例えば購入なら価格が上がることが期待されるのでスプレッドを足すことになる。

番号2と番号3では変数rの処理が違いますが、番号2では損切(損が一定以上になった場合その時点で利益確定をする)が発生しているのかどうか、番号3でも同様ですが直接数字を計算します。

python

1''' 2重複している部分に同じ番号を振る 3以下のように多少の計算式が異なるだけでほぼ同じ処理をしている。 4''' 5def reward(trend,pip,action,position,states,pip_cost,spread): 6 if action == 0: 7 # 1 : time stepが0の時に実行 8 if position == 3: 9 states = [trend + spread] 10 position = 0 11 # 2(pの計算だけ違うがそれを除けば同じ) : 損切の確認、statesに値を追加 12 elif position == 0: 13 sub = 0 14 p = [(trend - s) * pip_cost for s in states] 15 for b in range(0,len(p)): 16 r = [-40.0, True] if p[b] <= -40 else [p[b], False] 17 if r[1]: 18 pip.append(r[0]) 19 states.pop(b-sub) 20 sub += 1 21 states.append(trend[t] + spread) 22 position = 0 23 # 3(pの計算が違うだけ) : 利益確定をし新しい状態を持つ 24 elif position == 1: 25 p = [(s - trend) * pip_cost for s in states] 26 for b in p: 27 b = -40.0 if b <= -40 else b 28 pip.append(b) 29 states = [trend + spread] 30 position = 0 31 elif action == 1: 32 # 1 33 if position == 3: 34 states = [trend - spread] 35 position = 1 36 # 2 37 elif position == 1: 38 sub = 0 39 p = [(s - trend) * pip_cost for s in states] 40 for b in range(0,len(p)): 41 r = [-40.0, True] if p[b] <= -40 else [p[b], False] 42 if r[1]: 43 pip.append(r[0]) 44 states.pop(b-sub) 45 sub += 1 46 states.append(trend - spread) 47 position = 1 48 # 3 49 elif position == 0: 50 p = [(trend - s) * pip_cost for s in states] 51 for b in p: 52 b = -40.0 if b <= -40 else b 53 pip.append(b) 54 states = [trend[t] - spread] 55 position = 1 56 return states,pip,position

python

1''' 2一番目のコードと同様に番号を振る。 3速度アップを図るためにcythonを使用しています。 4''' 5 6def reward2(double trend,list pip,int action,int position,list states,double pip_cost,double spread): 7 cdef list r 8 cdef list p 9 cdef int sub = 0 10 # 2と3 : アクションの値によって式が異なるが同じ処理(1番目のコードと) 11 if position != 3: 12 if action == 0: 13 #pipの計算 14 p = [(trend - s) * pip_cost for s in states] 15 else: 16 p = [(s - trend) * pip_cost for s in states] 17 spread *= -1 18 # positionの値をアクションと同様にしています。 19 # 2 : 前回のアクションと同様なら実行する。 20 if action == position: 21 for b in range(0, len(p)): 22 # tl = 40を超えていれば損切とみなし、-40に固定する。 23 r = True if p[b] <= -40 else False 24 # 発生している場合は該当の状態を削除する(2重評価を避けるため) 25 if r: 26 pip.append(-40) 27 states.pop(b - sub) 28 sub += 1 29 states.append(trend + spread) 30 position = action 31 # 3 : 前回のアクションと異なるなら実行する 32 else: 33 for b in p: 34 b = -40.0 if b <= -40 else b 35 pip.append(b) 36 states = [trend + spread] 37 position = action 38 39 # 1 : time stepが0の時に実行する。 40 if position == 3: 41 states = [trend + spread] if action == 0 else [trend - spread] 42 position = action 43 44 return states,pip,position
''' コードの比較 1番目のコードの1 if position == 3: # action == 0 states = [trend + spread] position = 1 if position == 3: # action == 1 states = [trend - spread] position = 2 2番目のコードの1 elif position == 3: states = [trend + spread] if action == 0 else [trend - spread] # action == 0 states = [trend + spread], action == 1 states = [trend - spread] position = action 1番目のコードの2 elif position == 1: # action == 0 sub = 0 p = [(trend - s) * pip_cost for s in states] for b in range(0,len(p)): r = True if p[b] <= -40 else False if r: pip.append(-40) states.pop(b-sub) sub += 1 states.append(trend + spread) position = 1 elif position == 2: # action == 1 sub = 0 p = [(s - trend) * pip_cost for s in states] for b in range(0,len(p)): r = True if p[b] <= -40 else False if r: pip.append(-40) states.pop(b-sub) sub += 1 states.append(trend - spread) position = 2 2番目にコードの2と3 if position != 3: if action == 0: p = [(trend - s) * pip_cost for s in states] else: p = [(s - trend) * pip_cost for s in states] spread *= -1 2番目のコードの2 if action == position: sub = 0 for b in range(0,len(p)): r = True if p[b] <= -40 else False if r: pip.append(-40) states.pop(b - sub) sub += 1 1番目のコードの3 elif position == 2: # action == 0 p = [(s - trend) * pip_cost for s in states] for b in p: b = -40.0 if b <= -40 else b pip.append(b) states = [trend + spread] states = [trend + spread] position = 1 elif position == 1: action == 1 p = [(trend - s) * pip_cost for s in states] for b in p: b = -40.0 if b <= -40 else b pip.append(b) states = [trend + spread] position = 2 2番目の3 else: for b in p: b = -40.0 if b <= -40 else b pip.append(b) states = [trend + spread] position = action '''

##画像
1番目のコードの結果(何回繰り返しても最初は必ずマイナスになる。)
1番目のコード
2番目のコードの結果(何回繰り返しても最初は必ずプラスになる。)
イメージ説明

分からないことがあれば、できるだけ情報を追加したいと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pea

2019/08/17 13:35

どういった違いが出るかを記載すると回答が得やすくなると思います
退会済みユーザー

退会済みユーザー

2019/08/17 13:52 編集

回答ありがとうございました。 情報追加しました。まだ、不足があるようでしたらぜひお願いします。どちらかが間違っているか、両方間違っているのかわからないと時間が無駄になってしまいますので、よろしくお願いします。
can110

2019/08/18 00:35

例えば「pip_cost」など、コード中の各変数が何を指しているか分かりませんのでコメントなりを追記ください。 また、専門知識がない(私のような)エンジニアにも分かるような説明にするか問題を定義しなおすと回答が得られやすくなるかと思います。
退会済みユーザー

退会済みユーザー

2019/08/18 06:26

回答ありがとうございます。 分かりにくいようで申し訳ありません
guest

回答1

0

iPhoneからで見落としも多いと思いますが。

まず、質問文に書かれている文言、コード中の変数名、コード中のコメントを統一しましょう。
その上で。
action == 0 かつ position == 3 の時の処理、その後の流れが違うようです。上のコードでは position が1になりますが、下のコードでは position = action なので0になるのではないでしょうか。

投稿2019/08/18 00:07

Q71

総合スコア995

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/18 06:26 編集

わかりにくいようで申し訳ありません。ただ、ポジションが1が0に2が1に変化しただけです。 1番目のコードでもアクションが0の時ポジションが1であれば実行すします。言い換えれば、前回とアクションが同様の時番号2の処理をします。 1番目のコードを変更します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問