デジタル通貨市場の定量分析

作者: リン・ハーンリディア, 作成日:2023-01-06 10:28:01, 更新日:2023-09-20 10:27:27

img

デジタル通貨市場の定量分析

デジタル通貨の投機分析に対するデータに基づくアプローチ

ビットコインの価格はどうでしょう? デジタル通貨の価格の上昇と減少の理由は? 異なるアルトコインの市場価格は密接に関連しているか,またはほとんど独立していますか? 次に何が起こるかを予測するにはどうすればよいですか?

ビットコインやイーサリアムなどのデジタル通貨に関する記事は,現在,憶測に満ちている.何百人もの自称の専門家が,彼らが期待する傾向を支持している.これらの分析の多くは,基本的なデータと統計モデルのための堅固な基盤がない.

この記事の目的は,Python を使用してデジタル通貨分析に簡潔な紹介を提供することです.私たちは,異なるデジタル通貨のデータを取得,分析,視覚化するために単純なPythonスクリプトを使用します.このプロセスでは,これらの変動の市場行動とそれらの発展の興味深い傾向を見つけます.

img

これはデジタル通貨を説明する記事でもなく,どの通貨が上昇し,どの通貨が減少するかの意見でもありません.その反対に,このチュートリアルで注目しているのは,元のデータを取得し,数字に隠された物語を見つけることです.

ステップ1: データ作業環境を設定する

このチュートリアルは,すべてのスキルレベルのエキスパート,エンジニア,データサイエンティスト向けです.業界リーダーでもプログラミング初心者でも,必要な唯一のスキルは,Pythonプログラミング言語の基本的な理解とコマンドライン操作の十分な知識です (データサイエンスのプロジェクトを設定することが十分です).

1.1 FMZ Quant ドッカーをインストールして Anaconda を設定する

  • FMZ 量子プラットフォームのドッカーシステム FMZ 量子プラットフォームFMZ.COMこのインターフェースは,データ分析を完了した後,自動取引を行うのに役立つ豊富な API インターフェースのセットを提供します.このインターフェースのセットには,アカウント情報をクエリする,高,オープン,低,領収書価格,取引量,および様々な主流取引所の一般的に使用される技術分析指標などの実践的なツールが含まれています.特に,実際の取引プロセスで主要な主流取引所を接続する公開 API インターフェースに強力な技術的サポートを提供します.

上のすべての機能は Docker のようなシステムに収縮されています. 必要なのは,独自のクラウドコンピューティングサービスを購入またはリースして Docker システムを展開することです.

FMZ Quantプラットフォームの公式名称では,このDockerシステムはDockerシステムと呼ばれています.

ドッカーとロボットの展開について 私の前の記事を参照してください:https://www.fmz.com/bbs-topic/9864.

ドーカーを展開するために独自のクラウドコンピューティングサーバを購入したい読者は,この記事を参照してください:https://www.fmz.com/digest-topic/5711.

次に,Pythonの現在の最大のアーティファクトをインストールします. Anaconda.

この記事で要求されるすべての関連するプログラム環境 (依存ライブラリ,バージョン管理など) を実現するために,最も簡単な方法は Anaconda を使用することです.これはパッケージ化された Python データサイエンスエコシステムと依存ライブラリマネージャです.

Anacondaをクラウドサービスにインストールするので,クラウドサーバーに Linux システムと Anaconda のコマンドラインバージョンをインストールすることをお勧めします.

アナコンダのインストール方法については,アナコンダの公式ガイドを参照してください.https://www.anaconda.com/distribution/.

経験豊富な Python プログラマーで,Anaconda を使用する必要がないと感じている場合は,全く問題ありません.必要な依存環境をインストールする際に助けを必要としないと仮定します.このセクションを直接スキップできます.

1.2 アナコンダのデータ分析プロジェクト環境を作成する

Anaconda がインストールされると,依存パッケージを管理するための新しい環境を作成する必要があります. Linux コマンドラインインターフェースで,

conda create --name cryptocurrency-analysis python=3

アナコンダの新しい環境を作りました

次に入力:

source activate cryptocurrency-analysis (linux/MacOS operating system)
or
activate cryptocurrency-analysis (windows operating system)

環境を活性化します

次に入力:

conda install numpy pandas nb_conda jupyter plotly

このプロジェクトに必要な様々な依存パッケージをインストールします

注: Anaconda 環境を使用する理由は? パイソンプロジェクトを多くコンピュータで実行する場合は,紛争を避けるために異なるプロジェクトの依存パッケージ (ソフトウェアライブラリとパッケージ) を分離することが役立ちます. Ananconda は各プロジェクトの依存パッケージの特別な環境ディレクトリを作成し,すべてのパッケージを適切に管理し,区別することができます.

1.3 Jupyter ノートブックを作成する

環境と依存パッケージがインストールされた後,実行します:

jupyter notebook

iPython カーネルを起動するには,http://localhost:8888/Pythonのノートブックを作成します.

Python [conda env:cryptocurrency-analysis]

カーネル

img

1.4 輸入に依存するパッケージ

必要な依存パッケージをインポートします 必要なパッケージをインポートします

import os
import numpy as np
import pandas as pd
import pickle
from datetime import datetime

オンラインモードを有効にする必要があります.

import plotly.offline as py
import plotly.graph_objs as go
import plotly.figure_factory as ff
py.init_notebook_mode(connected=True)

ステップ2:デジタル通貨の価格情報を入手

準備が完了し,分析されるデータを入手し始めます.まずは,FMZ Quantプラットフォームの API インターフェースを使用してビットコインの価格データを入手します.

この2つの機能の使用については,以下を参照してください:https://www.fmz.com/api.

2.1 Quandl のデータ収集関数を書く

Quandl からデータをダウンロードし,同期する関数を書く必要があります (quandl.com) これは海外で高い評判を得ている無料の金融データインターフェイスです. FMZ Quantプラットフォームも同様のデータインターフェースを提供し,主に実際のボット取引に使用されています.記事は主にデータ分析に焦点を当てているため,私たちはここでQuandlデータをまだ使用しています.

リアルボットトランザクション中に,PythonでGetTickerとGetRecords関数を直接呼び出し,価格データを取得できます.それらの使用については,以下を参照してください:https://www.fmz.com/api.

def get_quandl_data(quandl_id):
    # Download and cache data columns from Quandl
    cache_path = '{}.pkl'.format(quandl_id).replace('/','-')
    try:
        f = open(cache_path, 'rb')
        df = pickle.load(f)   
        print('Loaded {} from cache'.format(quandl_id))
    except (OSError, IOError) as e:
        print('Downloading {} from Quandl'.format(quandl_id))
        df = quandl.get(quandl_id, returns="pandas")
        df.to_pickle(cache_path)
        print('Cached {} at {}'.format(quandl_id, cache_path))
    return df

パンダスデータフレームは,プログラムが実行するたびに同じデータをダウンロードしないように,データをシリアル化し,ダウンロードしたデータをファイルとして保存するために使用されます.この機能はパンダスデータフレーム形式でデータを返します.データフレームの概念に慣れていない場合は,強力なエクセルとして想像できます.

2.2 Kraken 取引所のデジタル通貨価格データへのアクセス

Bitcoinの価格から始めましょう. 価格を計算すると,

# Get prices on the Kraken Bitcoin exchange
btc_usd_price_kraken = get_quandl_data('BCHARTS/KRAKENUSD')

データボックスの最初の5行を表示するためにhead (head) メソッドを使用します.

btc_usd_price_kraken.head()

結果として

img

データの正確性を視覚化することで確認します. データを視覚化することで,

# Make a table of BTC prices
btc_trace = go.Scatter(x=btc_usd_price_kraken.index, y=btc_usd_price_kraken['Weighted Price'])
py.iplot([btc_trace])

img

ここでは,可視化部分を完了するためにPlotlyを使用します.Matplotlibなどのいくつかの成熟した Python データ可視化ライブラリを使用すると比較して,Plotlyはあまり一般的な選択肢ではありませんが,完全にインタラクティブなチャートD3.js を呼び出すことができるため,本当に良い選択です.これらのチャートには美しいデフォルト設定があり,探求し,ウェブページに埋め込むことは非常に簡単です.

ヒント:生成されたチャートは,ダウンロードされたデータが一般的に一貫しているかどうかを確認するために,OKX,BinanceまたはHuobiのチャートなどの主流の取引所のビットコイン価格チャートと比較できます.

2.3 主流のビットコイン取引所から価格データを入手する

注意深い読者は,特に2014年末から2016年初旬にかけて,上記のデータにデータ欠落があることに気づいているかもしれません.特にKraken Exchangeでは,この種のデータ損失が特に明らかです.これらの欠落したデータが価格分析に影響を及ぼすことは絶対に望まないでしょう.

デジタル通貨交換の特徴は,供給と需要の関係が通貨価格を決定することである.したがって,取引価格は市場の"主流価格"になることはできません. 先ほど述べた問題とデータ損失の問題を解決するために (技術的な停電やデータエラーによる可能性があります),私たちは世界の3つの主流ビットコイン取引所からのデータをダウンロードし,その後平均ビットコイン価格を計算します.

辞書タイプからなるデータフレームに ダウンロードして始めましょう

# Download price data from COINBASE, BITSTAMP and ITBIT
exchanges = ['COINBASE','BITSTAMP','ITBIT']

exchange_data = {}

exchange_data['KRAKEN'] = btc_usd_price_kraken

for exchange in exchanges:
    exchange_code = 'BCHARTS/{}USD'.format(exchange)
    btc_exchange_df = get_quandl_data(exchange_code)
    exchange_data[exchange] = btc_exchange_df

2.4 すべてのデータを1つのデータフレームに統合する

次に,各データフレームに共通する列を新しいデータフレームにマージする特別な関数を定義します. merge_dfs_on_column関数と呼びましょう.

def merge_dfs_on_column(dataframes, labels, col):
    '''Merge a single column of each dataframe into a new combined dataframe'''
    series_dict = {}
    for index in range(len(dataframes)):
        series_dict[labels[index]] = dataframes[index][col]
        
    return pd.DataFrame(series_dict)

各データセットの"加重価格"列をベースに 統合されます.

# Integrate all data frames
btc_usd_datasets = merge_dfs_on_column(list(exchange_data.values()), list(exchange_data.keys()), 'Weighted Price')

最後に tail () 方法を使って 統合されたデータの最後の5行を表示し,データの正確性と完全性を確認します.

btc_usd_datasets.tail()

結果は以下のように示されています.

img

上記の表から このデータは 予想通りで ほぼ同じデータ範囲ですが 遅延や各交換の特徴によって 少し違います

2.5 価格データの可視化プロセス

分析論理の観点から,次のステップは,これらのデータを視覚化を通じて比較することです. そのためには,まず補助関数を定義する必要があります. 図を作成するためにデータを使用するための単行本コマンドを提供することで,それをdf_scatter関数と呼びます.

def df_scatter(df, title, seperate_y_axis=False, y_axis_label='', scale='linear', initial_hide=False):
    '''Generate a scatter plot of the entire dataframe'''
    label_arr = list(df)
    series_arr = list(map(lambda col: df[col], label_arr))
    
    layout = go.Layout(
        title=title,
        legend=dict(orientation="h"),
        xaxis=dict(type='date'),
        yaxis=dict(
            title=y_axis_label,
            showticklabels= not seperate_y_axis,
            type=scale
        )
    )
    
    y_axis_config = dict(
        overlaying='y',
        showticklabels=False,
        type=scale )
    
    visibility = 'visible'
    if initial_hide:
        visibility = 'legendonly'
        
    # Table tracking for each series
    trace_arr = []
    for index, series in enumerate(series_arr):
        trace = go.Scatter(
            x=series.index, 
            y=series, 
            name=label_arr[index],
            visible=visibility
        )
        
        # Add a separate axis to the series
        if seperate_y_axis:
            trace['yaxis'] = 'y{}'.format(index + 1)
            layout['yaxis{}'.format(index + 1)] = y_axis_config    
        trace_arr.append(trace)

    fig = go.Figure(data=trace_arr, layout=layout)
    py.iplot(fig)

この記事では,この補助機能の論理原理についてあまり議論しません.もっと知りたい場合は,Pandas と Plotly の公式ドキュメントを確認してください.

ビットコインの価格データチャートを簡単に作成できます

# Plot all BTC transaction prices
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')

img

2.6 明確で総合的な価格データ

上記のグラフからわかるように,4つのデータシリーズがほぼ同じ経路をたどっているにもかかわらず,不規則な変化が残っています.これらの不規則な変化を排除しようとします.

2012年から2017年の間 ビットコインの価格はゼロに等しくなかったので まずデータフレームの 0値をすべて削除します

# Clear the "0" value
btc_usd_datasets.replace(0, np.nan, inplace=True)

データフレームを再構築すると より明確なグラフが見えます 欠落したデータはありません

# Plot the revised data frame
df_scatter(btc_usd_datasets, 'Bitcoin Price (USD) By Exchange')

img

ビットコインの平均価格を計算できます 取引所の平均価格です

# Calculate the average BTC price as a new column
btc_usd_datasets['avg_btc_price_usd'] = btc_usd_datasets.mean(axis=1)

データを間違えているか確認するために再描きます.

# Plot the average BTC price
btc_trace = go.Scatter(x=btc_usd_datasets.index, y=btc_usd_datasets['avg_btc_price_usd'])
py.iplot([btc_trace])

img

後で,他のデジタル通貨とドルとの間の為替レートを決定するために,この総額価格シリーズデータを使用し続けます.

ステップ3: Altcoin の価格を収集する

これまでのところ,Bitcoin価格のタイムシーズのデータがあります.次に,Bitcoin以外のデジタル通貨,すなわちAltcoinsのデータを見てみましょう. もちろん,Altcoinsという用語は少し誇張されるかもしれませんが,現在のデジタル通貨の発展に関しては,市場価値でトップ10 (Bitcoin,Ethereum,EOS,USDTなど) を除く限り,それらのほとんどはAltcoinsと呼ばれます.取引時にこれらの通貨から遠ざかってみるべきです.それらはあまりにも混乱し,欺くからです.

3.1 Poloniex取引所のAPIを通じて補助機能を定義する

まず,デジタル通貨取引のデータ情報を入手するためにPoloniex取引所のAPIを使用します. Altcoinに関連するデータを入手するために2つの補助機能を定義します. これらの2つの機能は主にAPIを通じてJSONデータをダウンロードしキャッシュします.

与えられたURLからJSONデータをダウンロードしてキャッシュします. この関数で,JSONのデータをダウンロードし,キャッシュします.

def get_json_data(json_url, cache_path):
    '''Download and cache JSON data, return as a dataframe.'''
    try:        
        f = open(cache_path, 'rb')
        df = pickle.load(f)   
        print('Loaded {} from cache'.format(json_url))
    except (OSError, IOError) as e:
        print('Downloading {}'.format(json_url))
        df = pd.read_json(json_url)
        df.to_pickle(cache_path)
        print('Cached {} at {}'.format(json_url, cache_path))
    return df

次に,新しい関数を定義し,Poloniex APIの HTTP リクエストを生成し,ちょうど定義された get_json_data 関数を呼び出し,呼び出しのデータ結果を保存します.

base_polo_url = 'https://poloniex.com/public?command=returnChartData&currencyPair={}&start={}&end={}&period={}'
start_date = datetime.strptime('2015-01-01', '%Y-%m-%d') # Data acquisition since 2015
end_date = datetime.now() # Until today
pediod = 86400 # pull daily data (86,400 seconds per day)

def get_crypto_data(poloniex_pair):
    '''Retrieve cryptocurrency data from poloniex'''
    json_url = base_polo_url.format(poloniex_pair, start_date.timestamp(), end_date.timestamp(), pediod)
    data_df = get_json_data(json_url, poloniex_pair)
    data_df = data_df.set_index('date')
    return data_df

上記の関数はデジタル通貨の対応文字コード (BTC_ETHなど) を抽出し,2つの通貨の過去価格を含むデータフレームを返します.

3.2 取引価格データをポロンiexからダウンロードする

アルトコインの大部分はUSDで直接購入することはできません. これらのデジタル通貨を取得するには,個人では通常,まずビットコインを購入し,その価格比率に応じてアルトコインに変換する必要があります. したがって,各デジタル通貨の為替レートをBitcoinにダウンロードし,既存のビットコイン価格データを使ってUSDに変換する必要があります.私たちはトップ9のデジタル通貨の為替レートデータをダウンロードします. Ethereum,Litecoin,Ripple,EthereumClassic,Stellar,Dash,Siacoin,Monero,NEM.

altcoins = ['ETH','LTC','XRP','ETC','STR','DASH','SC','XMR','XEM']

altcoin_data = {}
for altcoin in altcoins:
    coinpair = 'BTC_{}'.format(altcoin)
    crypto_price_df = get_crypto_data(coinpair)
    altcoin_data[altcoin] = crypto_price_df

9つのデータフレームを 含んでいる辞書があります それぞれのフレームには AltcoinとBitcoinの 日々の平均価格が 記録されています

Ethereumの価格表の最後の数行で データの正しさを判断できます

altcoin_data['ETH'].tail()

img

3.3 すべての価格データの通貨単位をドルに統一する

BTCとアルトコインの為替レートのデータを ビットコインの価格指数と組み合わせることで それぞれのアルトコインの 過去価格 (USD) を直接計算できます

# Calculate USD Price as a new column in each altcoin data frame
for altcoin in altcoin_data.keys():
    altcoin_data[altcoin]['price_usd'] =  altcoin_data[altcoin]['weightedAverage'] * btc_usd_datasets['avg_btc_price_usd']

ここでは,それぞれのアルトコインデータフレームに新しい列を追加し,対応するUSD価格を格納します.

組み合わせたデータフレームを作成し,各デジタル通貨のUSD価格を統合できます. デジタル通貨の価格を組み合わせると,

# Combine the USD price of each Altcoin into a single data frame
combined_df = merge_dfs_on_column(list(altcoin_data.values()), list(altcoin_data.keys()), 'price_usd')

やった!

統合されたデータフレームの最後の列に ビットコインの価格を追加します

# Add BTC price to data frame
combined_df['BTC'] = btc_usd_datasets['avg_btc_price_usd']

確認している10のデジタル通貨の 日々のドル価格を含んでいる ユニークなデータフレームがあります

グラフの形式ですべてのアルトコインの対応価格を表示します グラフの形式ですべてのアルトコインの対応価格を表示します

img

このグラフは,過去数年の各デジタル通貨の為替価格の変化の完全なイメージを示しています.

注: ここでは,同じチャート上のすべてのデジタル通貨を比較するために対数式仕様のy軸を使用します.また,異なる視点からデータを理解するために,異なるパラメータ (スケール=線形など) を試してみることもできます.

3.4 関連性分析を開始

慎重な読者は,デジタル通貨の価格が関連しているように見えますが,その通貨価値は幅広く変動し,非常に不安定です.特に2017年4月の急速な上昇以来,多くの小さな変動でさえ,市場全体の変動と同時に発生しているようです.

もちろんデータに基づいた結論は 画像に基づいた直感よりも説得力があります

上記の相関仮説を検証するために,Pandas corr() 関数を用いることができる.このテスト方法は,他の列に対応するデータフレームの各列のピアソン相関係数を計算する.

2017年8月22日の修正要記: この項目は,相関係数を計算する際には,価格の絶対値ではなく,日々の利回り率を使用するために変更されました.

非固い時間列 (原価データなど) をベースとした直接計算は,相関係数の偏差を引き起こす可能性があります.この問題を解決するには,データフレーム内の各価格の絶対値を対応する日々の収益率に変換するために pct_change (pct_change) 方法を使用することです.

2016年の相関係数を計算してみましょう.

# Calculating the Pearson correlation coefficient for digital currencies in 2016
combined_df_2016 = combined_df[combined_df.index.year == 2016]
combined_df_2016.pct_change().corr(method='pearson')

img

上記のグラフは相関系数を示しています.相関系数が1または-1に近い場合,このシリーズは順に正相関または負相関であることを意味します.相関系数が0に近い場合,対応するオブジェクトが相関していないことを意味し,それらの変動は相互に独立しています.

視覚的支援機能を作りました 視覚的支援機能を作りました

def correlation_heatmap(df, title, absolute_bounds=True):
    '''Plot a correlation heatmap for the entire dataframe'''
    heatmap = go.Heatmap(
        z=df.corr(method='pearson').as_matrix(),
        x=df.columns,
        y=df.columns,
        colorbar=dict(title='Pearson Coefficient'),
    )
    
    layout = go.Layout(title=title)
    
    if absolute_bounds:
        heatmap['zmax'] = 1.0
        heatmap['zmin'] = -1.0
        
    fig = go.Figure(data=[heatmap], layout=layout)
    py.iplot(fig)
correlation_heatmap(combined_df_2016.pct_change(), "Cryptocurrency Correlations in 2016")

img

暗黒赤の値は強い相関を表す (各通貨は明らかに自分自身と高度に相関している),暗黒青の値は逆相関を表す.中間にあるすべての色 - 淡い青/オレンジ/灰色/タウニー - は,弱相関または非相関の異なる程度を表す値を有する.

このグラフは 2016年の異なるデジタル通貨価格の変動を示しています 統計的に有意な相関はほとんどありません

デジタル通貨の相関が ここ数ヶ月間 増加したという仮説を検証するために 2017年のデータを使って 同じテストを繰り返します

combined_df_2017 = combined_df[combined_df.index.year == 2017]
combined_df_2017.pct_change().corr(method='pearson')

img

上記のデータより関連性があるか?投資の判断基準として使用するのに十分ですか?答えはノーです.

しかし,ほとんどのデジタル通貨が 相互に結びついていることに 注目すべきです.

correlation_heatmap(combined_df_2017.pct_change(), "Cryptocurrency Correlations in 2017")

img

上記のチャートからわかるように 状況はますます興味深いものになっています

なぜこんなことが起こるのか?

いい質問だけど 本当には...

私の最初の反応は,ヘッジファンドが最近デジタル通貨市場で公開取引を開始したことです. これらのファンドは通常のトレーダーよりもはるかに多くの資本を持っています. 基金が複数のデジタル通貨間で投資した資本をヘッジすると,独立した変数 (株式市場など) に基づいて各通貨に対して同様の取引戦略を使用します. この観点から,この増加する関連性の傾向が起こるのは理にかなっています.

XRPとSTRの理解を深める

例えば,上記のチャートからXRP (リップルのトークン) は他のデジタル通貨との相関性が最小であることが明らかである.しかし,STR (ステラルのトークン,公式にはルメンスとして知られている) は,XRP (相関系数:0.62) と強い相関関係を持っている.

興味深いことに,Stellar と Ripple は非常に類似した金融技術プラットフォームであり,両者は銀行間の国境を越えた転送の退屈なステップを減らすことを目指しています.Stellar と Ripple に投資するいくつかの大手プレイヤーとヘッジファンドは,ブロックチェーンサービスで使用されるトークンの類似性を考慮して,同様の取引戦略を使用することが考えられます.これがXRP が他のデジタル通貨よりも STR に関連がある理由かもしれません.

お前の番だ!

上記の説明は 概説的なもので,よりよいかもしれません. 私たちが築いた基盤に基づいて,データに含まれる物語を 探求し続けられる何百もの異なる方法があります.

私の提案の一部は以下の通りです.読者は以下の方向での研究を参照することができます.

  • デジタル通貨のデータを分析全体に追加します
  • 適正または粗粒度トレンドビューを得るため,相関分析の時間範囲と細分性を調整する.
  • 取引量またはブロックチェーンデータマイニングからトレンドを見つけます.元の価格データと比較して,将来の価格変動を予測したい場合は,購入/販売量比データが必要かもしれません.
  • 株や商品や法定通貨の価格データを追加して どれがデジタル通貨に 関連しているかを判定します (しかし古い関係が因果関係を意味しないという言葉を忘れないでください).
  • Event Registry,GDELT,Google Trends を使用して特定のデジタル通貨を囲む"ホットワード"の数を定量化します.
  • データを使って予測型機械学習モデルを訓練して 明日の価格を予測します. もっと野心的な方なら,上記のトレーニングのためにリキュランスニューラルネットワーク (RNN) を利用することも考えられます.
  • 自動取引ロボットを作成するために分析を使用して,対応するアプリケーションプログラミングインターフェース (API) を通じて,PoloniexまたはCoinbaseの取引サイトに適用できます. 注意してください:性能が悪いロボットはすぐに資産を破壊することができます. FMZ Quantプラットフォーム (FMZ.COM) が推奨されています.

ビットコインとデジタル通貨の良いところは,その分散型性であり,他の資産よりも自由で民主的なものです.あなたはあなたの分析をオープンソースで共有したり,コミュニティに参加したり,ブログを書くことができます! 将来,特にデータサポートのない投機的なデジタル通貨の記事を読むときに自己分析に必要なスキルと弁解的に考える能力を習得したことを願っています. 読んでくれてありがとう. このチュートリアルについてコメント,提案,批判がある場合は,メッセージを残してください.https://www.fmz.com/bbs.


関連性

もっと