達成したいこと・問題点
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番目のコードの結果(何回繰り返しても最初は必ずマイナスになる。)
2番目のコードの結果(何回繰り返しても最初は必ずプラスになる。)
分からないことがあれば、できるだけ情報を追加したいと思います。