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

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

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

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

Q&A

1回答

240閲覧

株価の売買アルゴリズムを作りたい(超簡易版)

KazuyaKojima

総合スコア16

Python 3.x

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

0グッド

0クリップ

投稿2018/10/06 07:01

前提・実現したいこと

売買アルゴリズムを作りたい

n・・・売り買いできる回数
arr・・・株価データ

例)n = 2, arr = [100, 20, 45, 60, 120, 300]
上記の場合答えは20の時に買って300の時に売るのが最適解

発生している問題・エラーメッセージ

どのようにアルゴリズムを組めば良いのかわからない。
ナップサック問題に近いとも思うのですが・・・

エラーメッセージ

該当のソースコード

ソースコード

試したこと

売買回数を気にせず最適解を出すことはできたがどのように売買回数を保持すれば良いのかわからない

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

tiitoi

2018/10/06 07:52 編集

質問の例で 20 のうちに買って、300 のとき売れば儲かるって結果論ですよね?実際は未来のことは予測するしかないので、それをどう予測するのかという問題になってくると思いますが。
KazuyaKojima

2018/10/06 08:02

実用性というところではもちろんそうなんですがとりあえず今は勉強の段階でしてとりあえず最初から株価データがわかってる場合で最適解を出すというものを実現したいのです。。
guest

回答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
tiitoi

総合スコア21956

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

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

KazuyaKojima

2018/10/06 11:54

すいません説明が足りませんでした。売り買いできる回数はn以下で最適解を出すようにしたいです。なので全探索だとn通りこの計算をやる事になるのでデータ量が大きくなると厳しそうです・・・・ 動的計画法を使うのかなと思うのですがどのようにやればいいのかがわからず・・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問