python + API(bitflyer ,Cryptowatch)で、ビットコイン価格情報をsqliteに毎日収集する
こんな感じで、一日一回収集する。sqliteとjsonファイルの2つに保存しておく
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
import requests from datetime import datetime import time import json import sqlite3 chart_sec = 60 # 保存したいローソク足の時間軸 # 保存するファイル名 file = "./chart/"+ datetime.now().strftime('%Y%m%d_%H%M%S') +".json" # Cryptowatchのデータを単に保存するだけの関数 def accumulate_data(min, path, before=0, after=0): # APIで価格データを取得 params = {"periods" : min } if before != 0: params["before"] = before if after != 0: params["after"] = after response = requests.get("https://api.cryptowat.ch/markets/bitflyer/btcfxjpy/ohlc",params) data = response.json() conn = sqlite3.connect("chart.db") cur = conn.cursor() # テーブル作成。quote_volumeは BTC/JPYのJPY換算 cur.execute('create table IF NOT EXISTS chart(close_time integer, open_price integer, high_price integer, low_price integer, close_price integer, volume REAL, quote_volume REAL, primary key(close_time))') # sqliteにupsert for item in data["result"]["60"]: cur.execute("INSERT OR REPLACE INTO chart(close_time, open_price, high_price, low_price, close_price, volume, quote_volume ) values(?,?,?,?,?,?,?)", [item[0], item[1], item[2], item[3], item[4], item[5], item[6]]) conn.commit() cur.close() conn.close() #ファイルにも書き込む file = open( path,"w",encoding="utf-8") json.dump(data,file) return data # メイン処理 accumulate_data(chart_sec, file ,after=1483228800) |
DB Browser for SQLiteを使うとphpMyAdminみたいにGUIでレコードが見れる。
https://sqlitebrowser.org/dl/
jsonファイルからsqliteにUPSERTする
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import sqlite3 import json json_files = [ '20220121_103059.json','20220124_092559.json','20220125_100637.json', ...... ] conn = sqlite3.connect("chart.db") cur = conn.cursor() # テーブル作成。quote_volumeは BTC/JPYのJPY換算 cur.execute('create table IF NOT EXISTS chart(close_time integer, open_price integer, high_price integer, low_price integer, close_price integer, volume REAL, quote_volume REAL, primary key(close_time))') for json_file in json_files: json_open = open('chart/'+json_file, 'r') data = json.load(json_open) # sqliteにupsert for item in data["result"]["60"]: cur.execute("INSERT OR REPLACE INTO chart(close_time, open_price, high_price, low_price, close_price, volume, quote_volume ) values(?,?,?,?,?,?,?)", [item[0], item[1], item[2], item[3], item[4], item[5], item[6]]) conn.commit() cur.close() conn.close() |
【2023/10/04 追記】
Cryptowatchが終了してしまったので、CryptoCompareで作り直し。
最大2000件までなので、1分足だと過去33時間くらいしか取得できない…。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
import requests from datetime import datetime import time import json import sqlite3 # CryptoCompareの価格データを取得する関数 def accumulate_data(): price = [] params = {"fsym":"BTC","tsym":"JPY","e":"bitflyerfx","limit":2000 } response = requests.get("https://min-api.cryptocompare.com/data/histominute",params, timeout = 10) data = response.json() conn = sqlite3.connect("chart.db") cur = conn.cursor() # テーブル作成。quote_volumeは BTC/JPYのJPY換算 cur.execute('create table IF NOT EXISTS chart(close_time integer, open_price integer, high_price integer, low_price integer, close_price integer, volume REAL, quote_volume REAL, primary key(close_time))') # sqliteにupsert for item in data["Data"]: cur.execute("INSERT OR REPLACE INTO chart(close_time, open_price, high_price, low_price, close_price, volume, quote_volume ) values(?,?,?,?,?,?,?)", [item['time'], item['open'], item['high'], item['low'], item['close'], item['volumefrom'], item['volumeto']]) conn.commit() cur.close() conn.close() #ファイルにも書き込む file = open( "./chart/"+ datetime.now().strftime('%Y%m%d_%H%M%S') +".json", "w",encoding="utf-8") json.dump(data,file) return data # メイン処理 accumulate_data() |