見出し画像

Pythonでチャート分析のためループ処理に挑戦してみた

ループ処理に挑戦 

みんなが金融市場で高利益を出せば、富を均等に分配できるはずだ。そうするには、まず必ず利益を出せるロジックを考えなきゃいけない。

前回は、Pythonにpybitflyerモジュールを導入して、ビットコインの価格を表示させた。

今回は、チャート分析するためPythonの文法を復習して、ループ処理できるようにしよう。

# -*- coding: utf-8 -*- #
"""
We crush capitalism.
"""
import pybitflyer

tick = pybitflyer.API().ticker(product_code="BTC_JPY")
print("timestamp : " + str(tick["timestamp"]))
print("ltp : " + str(tick["ltp"]))
print("best_bid : " + str(tick["best_bid"]))
print("best_ask : " + str(tick["best_ask"]))

Pythonのよくあるエラー

まずは、暗号通貨イーサリアムのティッカー情報も読み込みたいから、前回のコードの下から4行を訂正した。tickからBTC_tickとETH_tickに引数が変わっているから、tickと書いているものを全てを書き直さないといけない。直さないままプログラムを起動するとSyntaxErrorという文法誤りのエラーが出る。

BTC_tick = pybitflyer.API().ticker(product_code="BTC_JPY")
print("BTC_timestamp : " + str(BTC_tick["timestamp"]))
print("BTC_ltp : " + str(BTC_tick["ltp"]))
print("BTC_best_bid : " + str(BTC_tick["best_bid"]))
print("BTC_best_ask : " + str(BTC_tick["best_ask"]))

ETH_tick = pybitflyer.API().ticker(product_code="ETH_JPY")
print("ETH_timestamp : " + str(ETH_tick["timestamp"]))
print("ETH_ltp : " + str(ETH_tick["ltp"]))
print("ETH_best_bid : " + str(ETH_tick["best_bid"]))
print("ETH_best_ask : " + str(ETH_tick["best_ask"]))

文法誤りのSyntaxErrorに次いで、よく見るエラーはindentationerrorだ。Pythonでは段落を揃えなければ、すべてエラーになる。繰り返しのwhileや、一時的にファイルなどを開いたりするwithを使う場合、段落を揃え忘れるのでエラーになりやすい。

indentationerrorとは、インデントがPythonの想定に対してズレが生じているため、Python側が正しくプログラムを実行することができない場合に発生するエラーです。
Pythonはインデントの深さでブロックを認識するため、インデントが想定と比べてずれている場合にindentationerrorが発生します。

段落があっていないと、下の画像のようなエラーが出てプログラムが止まってしまう。

withとwhile

次は関数のおさらいだ。まずは、with関数。ExcelのマクロとPythonのwith関数は違う。Excelのマクロだと文の省略だけど、Pythonでは一時的に使う場合に使う関数になる。

Pythonでは、ある一定の期間だけオブジェクトを使用したり、いろいろな設定を行って用事がすんだら元に戻したい、という処理を行うとき、with文を使用します。
たとえば、ファイルを読み込むときには、with 文を利用して作成したファイルオブジェクトを自動的に開放するようにします。

今回は、with関数を使って、CSVファイルを使うために一度開き、書き込んだ後にファイルを閉じるという命令をしたい。
まず、CSVモジュールを文頭でインポートする。

import csv

一行目でCSVファイルを開く。ファイルがなければ自動作成される。
そして、二行目でファイルを引数にする。
三行目でファイルに書き込んでいる。ちなみに、命令が終わると自動的にCSVファイルは閉じる。

with open('furture.csv','a',newline='') as files:
      writer = csv.writer(files)
   writer.writerow(['TIME',str(ETH_tick["timestamp"]),'ltp',str(ETH_tick["ltp"]),'bid',(ETH_tick["best_bid"]),'ask',str(ETH_tick["best_ask"])])

次は、ループ処理だ。チャート分析するにはデータを集める必要がある。
繰り返し処理には、forとwhileの2種類があるけど、今回はwhileを使う。

Pythonにはループ処理としてwhile文とfor文があります。ある程度処理の回数が決まっているfor文に対し、while文は「条件がある状態になるまで処理を実施する」種類のループ処理になります。

ループ処理をする前に、timeモジュールをインポートする。これを入れておかないと、スリープ処理ができないから1秒間に何回も処理をしてしまう。pybitflyerのティッカーの更新には、制限がある。1秒単位でも取得できるけど、今回は10秒程度でデータを取得する。

import time

whileのあとに条件式をtrueとすると、ずっと動き続ける。そこで、一番下にtime.sleep(10)の命令を入れて、約10秒ごとにプログラムを動かすようにした。

# -*- coding: utf-8 -*- #
"""
We crush capitalism.
"""
import pybitflyer
import csv
import time

while True:
   BTC_tick = pybitflyer.API().ticker(product_code="BTC_JPY")
   print("BTC_timestamp : " + str(BTC_tick["timestamp"]))
   print("BTC_ltp : " + str(BTC_tick["ltp"]))
   print("BTC_best_bid : " + str(BTC_tick["best_bid"]))
   print("BTC_best_ask : " + str(BTC_tick["best_ask"]))

   ETH_tick = pybitflyer.API().ticker(product_code="ETH_JPY")
   print("ETH_timestamp : " + str(ETH_tick["timestamp"]))
   print("ETH_ltp : " + str(ETH_tick["ltp"]))
   print("ETH_best_bid : " + str(ETH_tick["best_bid"]))
   print("ETH_best_ask : " + str(ETH_tick["best_ask"]))

   with open('furture.csv','a',newline=''as files:
      writer = csv.writer(files)
      writer.writerow(['TIME',str(ETH_tick["timestamp"]),'ltp',str(ETH_tick["ltp"]),'bid',(ETH_tick["best_bid"]),'ask',str(ETH_tick["best_ask"])])
   time.sleep(10)	

そして、プログラムを動かしてみると、暗号通貨イーサリアムのチャートを連続でCSVファイルに書き込んでいるのがわかる。

CSVを見ると平均して+0.3秒ほど計測時間に誤差がでてる。これは、計算している時間だ。
より正確に計測するには、コードを変える必要があるけど、今回はここまで。
チャート分析のためのPythonの復習は終わった。でも、いちばん難しいのは利益を出すためのロジックだ。さてどうしよう。

目次

次の記事

前の記事

この記事が気に入ったらサポートをしてみませんか?