【Python】ActivePosition(全建玉)計算

本ノートは有料となっておりますが、全て無料で見ることができます。
募金してくれる人がいれば嬉しいなと思い有料設定にしております。

やること

PythonでbitFlyerのAPIを使用してポジション情報を取得して計算する。
(ActivePosition計算には落とし穴があるのでその説明)

目次

● ActivePosition計算をする際の落とし穴
● ActivePosition計算のコード


● ActivePosition計算をする際の落とし穴

プログラミングで少数を使用した計算は誤差が起きる。
例えば以下のような計算をすると結果が全く意図しないものとなる。

x = [0.1 for i in range(10)]
sum = sum(x)
print(sum) # => 0.9999999999999999

上記のコードは0.1を10回(10個)足したもの
あれ?計算結果が1にならない?
そう!!
計算結果は1.0にはならず0.9999999999999999となる。

思った結果とちがうよね?
これはActivePosition計算でも同じことが起こりうるってこと。

実際にポジション情報を取得して`size`データだけを抽出して計算させても同じような現象は起こりうる。

じゃーどうすればいいの?

decimalモジュールを使って対応する(Pythonのモジュール)
以下がコード例

from decimal import *  # モジュールをインポート
x = [Decimal('0.1') for i in range(10)]
sum = sum(x)
print(sum)  # => 1.0


以上のことを注意してActivePosition計算をしていく。

● ActivePosition計算のコード

import json
import time
import requests
import hmac
import hashlib
from decimal import *

api_secret = 'ご自身のアカウントのapi_secret'
api_key = 'ご自身のアカウントのapi_key'
path = '/v1/me/getpositions?product_code=FX_BTC_JPY'
method = 'GET'
def get_position_info():
    position_size = 0
    timestamp = str(time.time())
    text = timestamp + method + path
    sign = hmac.new(bytes(api_secret, 'ascii'), bytes(text, 'ascii'), hashlib.sha256).hexdigest()
    try:
        request_data = requests.get(
            'https://api.bitflyer.com' + path,
            headers = {
                'ACCESS-KEY': api_key,
                'ACCESS-TIMESTAMP': timestamp,
                'ACCESS-SIGN': sign,
                'Content-Type': 'application/json'
            },
        )
        acquired_data = request_data.json()
        position_size_list = [Decimal(str(position.get('size'))) for position in acquired_data]
        position_size = sum(position_size_list)
        return position_size # => 計算結果を返す
    except Exception as e:
        return 'Error mssage: {0}'.format(str(e))


get_position_info() # => 関数の呼び出し

ポイントはDecimalを使用して計算しているところ。

APIの使用方法等は他の方が多くの記事を出していると思うのでそちらをご覧ください。

最後まで読んでいただきありがとうございました。
このノートがあなたのためになったのなら幸いです。

有料パートは何もございません。募金してくれる人がいれば嬉しいなと思い有料設定にしております。

BTCで送金してくれてもありがたいです。36N9ACPRyHU5dHCqRUugkgJtUnJh5SGE57


ここから先は

0字

¥ 300

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