前提・実現したいこと
売買アルゴリズムを作りたい
n・・・売り買いできる回数
arr・・・株価データ
例)n = 2, arr = [100, 20, 45, 60, 120, 300]
上記の場合答えは20の時に買って300の時に売るのが最適解
発生している問題・エラーメッセージ
どのようにアルゴリズムを組めば良いのかわからない。
ナップサック問題に近いとも思うのですが・・・
エラーメッセージ
該当のソースコード
ソースコード
試したこと
売買回数を気にせず最適解を出すことはできたがどのように売買回数を保持すれば良いのかわからない
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/06 08:02
回答1件
0
問題設定
1次元配列 array
及び売買を行う回数 n
が与えられたとき、
利益が最大になるパターンを見つける。
ただし、購買と売却を同じ時刻にはできないものとする。
例:
array = [100, 20, 45, 60, 120, 300], n = 1
の場合、
20 の時に買って、300 の時に売るのが最も利益が大きくなる。
問題を解く解法
全探索の方法を以下に記載します。
combination(len(array), n) 通りのすべてのパターンを試します。
効率的に解くアルゴリズムがあるかはわかりません。
python
1import numpy as np 2import itertools 3 4array = [100, 20, 45, 60, 120, 300, 100] 5num_trades = 1 # 売買を行う回数 6 7# すべての売買の組み合わせを作成する。[buy, sell, buy, sell, ...] 8comb = [v for v in itertools.combinations(range(len(array)), num_trades * 2)] 9comb = np.array(comb) 10print(comb) 11# [[0 1] 12# [0 2] 13# [0 3] 14# [0 4] 15# [0 5] 16# [0 6] 17# [1 2] 18# [1 3] 19# [1 4] 20# [1 5] 21# [1 6] 22# [2 3] 23# [2 4] 24# [2 5] 25# [2 6] 26# [3 4] 27# [3 5] 28# [3 6] 29# [4 5] 30# [4 6] 31# [5 6]] 32 33patterns = [] 34for c in comb: 35 # [buy, sell, buy, sell, ...] -> [buy, sell], [buy, sell], ... 36 intervals = np.split(c, num_trades) 37 38 reward = 0 39 for begin, end in intervals: 40 reward += array[end] - array[begin] # 差額が報酬 41 42 patterns.append({'intervals': intervals, 'reward': reward}) 43 44# 結果表示 45################################################## 46 47# 報酬が高い順に昇順ソート 48patterns = sorted(patterns, key=lambda p : p['reward'], reverse=True) 49 50for p in patterns: 51 tmp = '' 52 for begin, end in p['intervals']: 53 tmp += '{} ~ {} '.format(begin, end) 54 55 print('intervals: {}, reward: {}'.format(tmp, p['reward']))
n=1
のとき
intervals: 1 ~ 5 , reward: 280 intervals: 2 ~ 5 , reward: 255 intervals: 3 ~ 5 , reward: 240 intervals: 0 ~ 5 , reward: 200 intervals: 4 ~ 5 , reward: 180 intervals: 1 ~ 4 , reward: 100 intervals: 1 ~ 6 , reward: 80 intervals: 2 ~ 4 , reward: 75 intervals: 3 ~ 4 , reward: 60 intervals: 2 ~ 6 , reward: 55 intervals: 1 ~ 3 , reward: 40 intervals: 3 ~ 6 , reward: 40 intervals: 1 ~ 2 , reward: 25 intervals: 0 ~ 4 , reward: 20 intervals: 2 ~ 3 , reward: 15 intervals: 0 ~ 6 , reward: 0 intervals: 4 ~ 6 , reward: -20 intervals: 0 ~ 3 , reward: -40 intervals: 0 ~ 2 , reward: -55 intervals: 0 ~ 1 , reward: -80 intervals: 5 ~ 6 , reward: -200
n=2
のとき
intervals: 1 ~ 2 3 ~ 5 , reward: 265 intervals: 1 ~ 3 4 ~ 5 , reward: 220 intervals: 1 ~ 2 4 ~ 5 , reward: 205 intervals: 2 ~ 3 4 ~ 5 , reward: 195 intervals: 0 ~ 2 3 ~ 5 , reward: 185 intervals: 0 ~ 1 2 ~ 5 , reward: 175 intervals: 0 ~ 1 3 ~ 5 , reward: 160 intervals: 0 ~ 3 4 ~ 5 , reward: 140 intervals: 0 ~ 2 4 ~ 5 , reward: 125 intervals: 0 ~ 1 4 ~ 5 , reward: 100 intervals: 1 ~ 2 3 ~ 4 , reward: 85 intervals: 1 ~ 2 3 ~ 6 , reward: 65 intervals: 1 ~ 3 4 ~ 6 , reward: 20 intervals: 0 ~ 2 3 ~ 4 , reward: 5 intervals: 1 ~ 2 4 ~ 6 , reward: 5 intervals: 0 ~ 1 2 ~ 4 , reward: -5 intervals: 2 ~ 3 4 ~ 6 , reward: -5 intervals: 0 ~ 2 3 ~ 6 , reward: -15 intervals: 0 ~ 1 3 ~ 4 , reward: -20 intervals: 0 ~ 1 2 ~ 6 , reward: -25 intervals: 0 ~ 1 3 ~ 6 , reward: -40 intervals: 0 ~ 3 4 ~ 6 , reward: -60 intervals: 0 ~ 1 2 ~ 3 , reward: -65 intervals: 0 ~ 2 4 ~ 6 , reward: -75 intervals: 0 ~ 1 4 ~ 6 , reward: -100 intervals: 1 ~ 4 5 ~ 6 , reward: -100 intervals: 2 ~ 4 5 ~ 6 , reward: -125 intervals: 3 ~ 4 5 ~ 6 , reward: -140 intervals: 1 ~ 3 5 ~ 6 , reward: -160 intervals: 1 ~ 2 5 ~ 6 , reward: -175 intervals: 0 ~ 4 5 ~ 6 , reward: -180 intervals: 2 ~ 3 5 ~ 6 , reward: -185 intervals: 0 ~ 3 5 ~ 6 , reward: -240 intervals: 0 ~ 2 5 ~ 6 , reward: -255 intervals: 0 ~ 1 5 ~ 6 , reward: -280
投稿2018/10/06 09:56
編集2018/10/06 09:59総合スコア21956
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/06 11:54
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。