【再出発】貧乏だし文系だけどpythonで自動売買bot作りたい7日目

こんにちは~。
 
再出発7日目に入って参りました。
 
私はさらに何日にも分けて書いてるので、前回何したか忘れることもありますが、
文系初心者が挑戦しても1日1時間ペースで7日間くらいで追いつける分量くらいだと推測しています。
 
前回は取得した価格データを直感的に分かりやすい形にしました。

 
今回は「取得したビットコインの価格データをファイルにダウンロードする」をやっていきます。
目的は、自動売買botを作成した後で試験を行うときのデータを集めてファイルに溜めておくことです。
価格データは取得できる上限が決まっているので、自動売買botの作成に着手した段階からファイル化して溜めておくのが良いと考えています。
 
前回は分量が多めだったので、今回は少なめに。
 

取得したビットコインの価格データをファイルにダウンロードする

 
まず取得したデータをファイルに書き込むときの基礎知識をおさらいします。
今日の記事はこれが全てですが。
 
ファイルへの書き込みは、open関数とwrite、closeメソッドを組み合わせて使います。
 
具体的には、
 

変数 = open("ファイル名", "書き込みモード")
変数.write(書き込みたいデータ)
変数.close()

 
こんな感じです。
 
open関数は、ファイルの読み込みにも書き込みにも利用できます。
今回のように書き込みを行いたい時は、openの後に続く()の中の2番目の”書き込みモード”を指定してあげると、ファイルに書き込むということをやってくれます。
よく使われるのは”w”(ファイルが無ければ新規作成。あれば内容書き換え)、”a”(ファイルが無ければ新規作成。あれば追記)とのことです。
 
なので、1行目でやっていることは、指定した名称のファイルを作って、それを変数にぶち込んでいます。
そして2行目に、その変数(=ファイル)に対して書き込みを行い、
3行目でファイルを閉じています。
ファイルを閉じないと、パソコンのファイルを開ける上限数に関わってきて、いつか他のファイルが開けないみたいなことが起きうるらしいので要注意です。
 
ここで、かつて私が疑問に思っていたことを1つ。
 
それは、
 
・なぜファイルを一旦変数にぶち込んで操作するのか?
・ファイルに直接writeメソッドやcloseメソッドを使えば良いじゃん。
 
てな疑問でした。
 
つまり、
 

open("ファイル名", "書き込みモード")
ファイル名.write(書き込みたいデータ)
ファイル名.close()

 
てな感じで書けや、と思ってました。
思ったことある人いないかな(笑
 
最近やっと事情が呑み込めたので、偉そうに解説します。
間違ってたら教えてください。あと説明がつく人は読み飛ばしてください。
 
まずPythonで扱うものは、数値や文字列、リストやファイルだとかも全てメモリ上に展開されます。
このようにメモリ上に展開されたものはオブジェクトと呼ばれ、メモリ上のどこかしらに格納されています。
なので例えば、Pythonで100+100をして計算結果の200を表示する時も、この200という数値がメモリ上に展開されるわけです。
しかし、ここで問題なのが、この200という数値のように一度使われたオブジェクトは、二度と使うことができないことです。
200という数値だけだと、メモリ上のどこかにあるはずなんですが、他からアクセスしようとした時にその住所が分からないらしいんですね。
 
そこで登場するのが変数です。
変数は、これらオブジェクトに紐づいた案内板のようなものです。
例えば、200という数値が「メモリ上の〇〇番地の領域」に格納されていたとします。
この時、変数xを用いて「x = 200」としてあげることで、変数xが「メモリ上の〇〇番地の領域にあるオブジェクト」という意味を持ってくれるのです。
当然ここに格納されているのは200という数値なので、以降xと書けば200を指し示すように動いてくれます。
 
この理屈はファイル操作でも同じで、一度メモリ上にファイルオブジェクトを展開し、以降このファイルに操作を加えるために変数を設定しているのです。
 
ちょっと脱線した話にもなりましたが、どうしてファイル操作がこのようなコードなのかを私の理解で書いてみました。
 
さて、以上を踏まえると、ビットコインの価格データを取得してファイル化するプログラムのコードは以下のようになりました。
 

import requests
import datetime
# JSONライブラリを使うためにインポートしています。
import json

url = "https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc"
query = {"before": "1579394579", "periods": "3600"}

data = requests.get(url, params = query).json()

price = []

for i in data["result"]["3600"]:
	price.append({"close_time" : i[0],
		"close_time_dt" : datetime.datetime.fromtimestamp(i[0]).strftime('%Y/%m/%d %H:%M'),
		"open_price" : i[1],
		"high_price" : i[2],
		"low_price" : i[3],
		"close_price": i[4] })

# priceを辞書型から文字列に変換
jsondata = json.dumps(price)

# fileという変数を宣言し、price_fileというファイルをメモリ上に展開。
# 文字列化した価格データを書き込む。
file = open("price_file", "w")
file.write(jsondata)
file.close()

 
コメントを付与したところが新たに追記した箇所で、ファイル書き込みに必要な処理です。
 
これも少し補足しますと、
WebApiから提供されるJSONデータは、Pythonの形式でいうと辞書型にあたります。
一方で、open関数でファイルに書き込めるのは、文字列のみであり辞書型を書き込もうとするとエラーで怒られます。
 
なので、JSONライブラリのdumps関数を利用して取得した価格データ(price)を文字列に置換しています。
冒頭でjsonをインポートしているのはこのためです。
 
最後のファイルを書き込むところの話は、これまでにした内容ですので割愛します。
 
このプログラムを動かしてみると、下のような結果が得られます。
 

 
フォルダに指定した名称でファイルが作成されます。
 

 
ファイルを開くと価格データが書き込まれています。
 

 
はい。本日はここまでです!
 
とりあえずシンプルなファイル化のロジックを実装しましたが、これだと試験データ集めには不十分なので、次回以降、このロジックをもう少しいじっていきたいと思います。
 
差し支えなければ、twitterをフォローして頂けますと嬉しいです。

それでは~。

Commentsこの記事についたコメント

4件のコメント
  • Best SEO Services

    Awesome post! Keep up the great work! 🙂

    2020年1月28日 9:14 PM
  • Hiro

    はじめまして。過去記事含め楽しく読ませていただきました。

    ryota-trade.comのコードを実際に運用してみたとの事でしたが、うまく収益につながらなかったのでしょうか?(バックテスト的には収益があるように見えましたが)
    私もこれからbotを作り始めようと考えており、ご参考までにご教示いただけると幸いです。

    2020年2月5日 11:11 PM
  • Hiro

    うまく収益につながらなかったのでしょうか?>そのままのストラテジではうまく収益につながらなかったのでしょうか?という意味です。

    2020年2月5日 11:12 PM
    • fumitakakubo

      はじめまして!
      コメント頂きありがとうございます!

      >>うまく収益につながらなかったのでしょうか?
      ryota-trade.comのコードで運用して、トータルで見るとプラスだったと記憶しています!

      ただ、botを稼働させていた最後の方は、たまたまトレンドの無い相場が長く続いて、チャネルブレイクアウト戦略で少しずつ負けが混むようになったために止めてしまいました。
      正確な時期は思い出せませんが、あの時はチャネルブレイクアウト戦略では勝てない相場だったと思います。
      一方で、実際には検証が必要ですが、今はまた状況が変わったと考えていて、2020年1月以降のように大きく一定の方向に値動きがある状況だと、普通に収益をもたらせるbotじゃないかと個人的には考えています。
      なので、仮に今に至るまでずっとryota-trade.comのコードで運用してたとしたら、成果はプラスだったんじゃないかと推測しています。

      じゃあ同じbotを再び動かしたら?という話になるんですが、私の場合はそもそも「もっと早く、大きく利益を伸ばしたい」という気持ちがあるので、それには上のbotは馴染まないと思い再稼働させてはいません。
      適した相場を待つのではなく、どんな相場でも早く大きく利益を伸ばせるビットコイン仕様の理想戦略を追求して、それが思いつくまで手動で取り組んでいるという感じです(笑

      参考になれば嬉しいです。
      今後も引き続きよろしくお願い致します!

      2020年2月7日 3:04 AM

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

%d人のブロガーが「いいね」をつけました。