テストエンジニアが機械学習してみた備忘録

広島とジト目が好きなテストエンジニアが機械学習に手を出した備忘録。

仮想通貨とごまだれ

今年に入ってZaifで口座を開き、退職した同期がTwitterで「NEMはいいぞ(意訳)」と言っていたのを聞き、NEMを買おうと思っていた矢先に例の事件で価格が下がったので、これ幸いと仮想通貨に参入したのがつい最近のお話です。BTCでのマイニングにあたる行為がNEMではハーベスティングと言うそうなのですが、これは「NEMを使う人ほど報酬を得やすい」という仕組みのようなので、長期保有ハーベスティングしつつ、そのうちNEM使って経済活動できたらなー、とか思ってます。コーヒーも買えるとこあるし。在庫復活はよ。

で、仮想通貨の取引所は、株の証券口座に比べるとAPIが充実してなんだか楽しそうな気がします。 例えばZaifhttps://api.zaif.jp/api/1/last_price/xem_jpyにアクセスするだけで、その時点でのNEMの価格が取得できます。他の仮想通貨もしかり。

qiita.com

例えばここを参考に音を鳴らすようにすれば、閾値を超えた時に音を鳴らして知らせるといったこともできます。

と、いうわけで1円単位で価格があがるとゼルダの「ごまだれ〜」が鳴るようなスクリプト作って遊んでました。*1 下がったときはなんか残念なSEにしたかったのですが、思いつかなかったのとめんどくさかったのとでとりあえずゼルダの子守唄で。

import math
import requests
from time import sleep

import matplotlib.pyplot as plt
from synthesizer import Player, Synthesizer, Waveform


last_prices = []
alert = {'upr': 0, 'lwr': 100000}
sleep_time = 120

# オーディオデバイス出力用クラス
player = Player()
player.open_stream()
synth = Synthesizer(osc1_waveform=Waveform.sine, osc1_volume=1.0, use_osc2=False)

def gomadare():
    player.play_wave(synth.generate_constant_wave(440.0, 0.2))
    sleep(0.2)
    player.play_wave(synth.generate_constant_wave(466.164, 0.2))
    sleep(0.2)
    player.play_wave(synth.generate_constant_wave(493.883, 0.2))
    sleep(0.2)
    player.play_wave(synth.generate_constant_wave(523.251, 0.5))

def zelda():
    player.play_wave(synth.generate_constant_wave(493.883, 0.6))
    sleep(0.6)
    player.play_wave(synth.generate_constant_wave(587.330, 0.3))
    sleep(0.3)
    player.play_wave(synth.generate_constant_wave(440.0, 0.9))

try:
    while True:
        response = requests.get("https://api.zaif.jp/api/1/last_price/xem_jpy")
        last_price = response.json()['last_price']
        print(last_price)
        last_prices.append(last_price)

        if last_price > alert['upr']:
            gomadare()
            plt.plot(last_prices)
            alert['upr'] = math.ceil(last_price)
            alert['lwr'] = math.floor(last_price)
            print(f"upr: {alert['upr']}, lwr: {alert['lwr']}")
        elif last_price < alert['lwr']:
            zelda()
            alert['upr'] = math.ceil(last_price)
            alert['lwr'] = math.floor(last_price)
            plt.plot(last_prices)
        sleep(sleep_time)
finally:
    plt.plot(last_prices)

高速で回すとサーバに負荷かけちゃうのでご注意を…(上記スクリプトでは2分に1回の確認にとどめています)

*1:以外と「ごまだれ〜」ってなんやねんという人が多いのですが、ぐぐれば出るのでご存じない方は是非