商品"先物・先物" アルビトラージ・チャート FMZ基本データに基づく

作者: リン・ハーン優しさ, 作成日:2020-06-17 10:59:26, 更新日:2023-11-01 20:28:10

img

概要

仲裁という言葉は知らない人もいるかもしれませんが,実生活では非常に一般的です.例えば,コンビニ屋のオーナーが卸売市場からミネラルウォーターのボトルを0.5元で購入し,その後1元で店舗で販売し,最終的に0.5元の差額を得ます.このプロセスは実際には仲裁に似ている.金融市場の仲裁は,仲裁の多くの形態があることに別として,この原則に類似しています.

アブタージとは

商品先物市場では,理論上,5月に納入されたアップル契約の価格を10月に納入されたアップル契約の価格をマイナスすると,結果が0に近いまたは一定の価格範囲内で安定しているはずである.しかし,実際には天気,市場供給と需要,その他の要因により,短期契約と長期契約の価格は一定の期間で異なる程度に影響され,価格差も大きく変動する.

しかし,いずれにせよ,価格差は最終的に一定の価格範囲に戻ります.価格差がこの範囲よりも大きい場合,5月の契約を短売りし,同時期に10月の契約を長売りし,利益を得るため,価格差を短売りします.価格差がこの範囲よりも小さい場合,5月の契約を長売りし,同時期に10月の契約を短売りし,利益を得るため,長売りします. これは同じ種類を購入し,販売することによって,時間間仲介です. しかし,異なる配達月.

市場間間仲裁に加えて,輸出国から大豆を購入し,輸入国から大豆を売る,または輸出国から大豆を売り,輸入国から大豆を輸入する,上流原料,鉄鉱石を購入し,下流で完成した糸鋼を販売する,または上流の原材料鉄鉱石を販売し,下流で完成した鉄筋仲裁を購入するなど,市場間仲裁があります.

期貨・スポット・アービタージとは

上記の仲介方法は文字通り仲介であるが,純粋な仲介ではない.それらは本質的にリスクの高い投機である.この投機方法は,価格のスプレッドを長買いまたは短売りすることで利益を得ることです.スプレッドがほとんどの時間安定しているにもかかわらず,価格のスプレッドが長時間戻らない市場の状況がある可能性があります.

期貨・スポット・アービタージの基本原理は,同じ商品が同じ時点での1つの価格しか持たないことである. 期貨は配送時間に達するとスポットになるので,契約の配送時間が近づくと価格返還が強制される. これは時間間仲裁とは全く異なる. 時間間仲裁は2つの異なる配送月を持つ契約である. 期限が切ると,2つの異なる月のスポットになる. または2つの価格である可能性があります.

  • 取引先の価格 - 現金価格

フューチャー・アンド・スポット・アービトラージの最大の特徴は,理論上リスクがないことであり,主に利益範囲を計算するためのスプレッド状態に基づいている.スプレッドが大きすぎると,同時にスポットをロングし,フューチャーをショートし,スプレッドがゼロに戻るのを待って,フューチャーとスポットの両側でのポジションを閉じて,スプレッドから利益を得ることができます.主に2つの方法があります:ダブル・クローズ・ポジション・アービトラージと契約配達・アービトラージ.

コモディティ フューチャーとスポット 仲介チャネル

簡単に言うと,最も複雑なリンクは,倉庫領収書,税金など一連の問題を含む商品のスポット取引です.まずは,投資範囲に関連する会社が必要です.契約配送仲介先物口座であれば,法人必須です.ダブル閉店ポジション仲介が必要な場合は,信頼できる販売チャネルが必要です.オンラインスポット取引ウェブサイトはたくさんあります.

スポット取引には通常17%~20%の付加価値税があることに注意すべきである.したがって,もしダブル・クローズ・ポジション・アービタージである場合,スポット購入後1.2~1.25倍に先物をショートする必要があります.契約配達・アービタージの場合,スポット購入後同じ割合の先物をショートする必要があります.また,取引手数料,輸送,倉庫のコストも考慮する必要があります.もちろん,このすべての前提は,現在の価格のスプレッドが十分に大きく,十分な限界があるということです.

また,上海ゴールド取引所で黄金 (T+D) が存在しているため,現金期間の仲介はポジティブ仲介のみならず,金リースなしで逆仲介業務も可能である.上海ゴールド取引所でスポットゴールド (T+D) の先延期取引は取引に便利であるだけでなく,取引量やポジションも多く,流動性はフューチャーとスポット仲介に非常に適している.

スポットデータとスプレッドデータを入手する方法

オンラインには多くの種類のスポットデータとスプレッドデータがありますが,そのほとんどは表形式で提示されています.これは明らかに市場分析と判断に適していません.FMZ.COM) は,スポットデータとスプレッドデータを含むコモディティ・フューチャースの基本データを組み込みています.各品種のスポットとスプレッド価格を得るために関数を呼び出すだけで,2016年から現在までの歴史的データをサポートします.

# Backtest configuration
'''backtest
start: 2020-06-01 00:00:00
end: 2020-06-02 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''

# Strategy entry
def main():
    while True:
        ret = exchange.GetData("GDP")  # Calling GDP data
        Log(ret)  # Print data
        Sleep(1000 * 60 * 60 * 24 * 30)

返済結果

{
     "Quarterly": "Q1 2006",
     "GDP": {
         "Absolute Value (100 million yuan)": 47078.9,
         "YoY Growth": 0.125
     },
     "primary industry": {
         "Absolute Value (100 million yuan)": 3012.7,
         "YoY Growth": 0.044
     },
     "Tertiary Industry": {
         "Absolute Value (100 million yuan)": 22647.4,
         "YoY Growth": 0.131
     },
     "Secondary industry": {
         "Absolute Value (100 million yuan)": 21418.7,
         "YoY Growth": 0.131
     }
}

スポット・スプレッド・チャートの実施

まず,FMZのウェブサイトに登録してログインしてください (FMZ.COM), ダッシュボード をクリックし, 戦略ライブラリ + 新しい戦略をクリックします.左上のドロップダウンメニューで Python を選択し,戦略の名前を入力します.

ステップ1: 戦略の枠組みを書き出す

# Strategy main function
def onTick():
     pass


# Strategy entrance
def main():
     while True: # Enter loop mode
         onTick() # execution strategy main function
         Sleep(1000 * 60 * 60 * 24) # Strategy sleep for one day

戦略の枠組みには2つの機能があります.main戦略の入り口であり,main取引前に,プログラムから開始されます.main繰り返して実行します. ループの動作は,onTick機能やonTick戦略の主要な機能は,主にコードを実行することです.

ステップ2:チャート関数を追加する

# Global variables
# Futures and Spots chart
cfgA = {
    "extension": {
        "layout":'single',
        "col": 6,
        "height": "500px",
    },
    "title": {
        "text": "futures and spots chart"
    },
    "xAxis": {
        "type": "datetime"
    },
    "series": [{
        "name": "Futures Price",
        "data": [],
    }, {
        "name": "Spot Price",
        "data": [],
    }
    ]
}
# Spread chart
cfgB = {
    "extension": {
        "layout":'single',
        "col": 6,
        "height": "500px",
    },
    "title": {
        "text": "Spread chart"
    },
    "xAxis": {
        "type": "datetime"
    },
    "series": [{
        "name": "Spread Price",
        "data": [],
    }]
}
chart = Chart([cfgA, cfgB]) # Create a chart object


# Strategy main function
def onTick():
    chart.add(0, []) # draw chart
    chart.add(1, []) # draw chart
    chart.add(2, []) # draw chart
    chart.update([cfgA, cfgB]) # update chart


# Strategy entrance
def main():
    LogReset() # Clear the previous log information before running
    chart.reset() # Clear the previous chart information before running
    while True: # Enter loop mode
        onTick() # execution strategy main function
        Sleep(1000 * 60 * 60 * 24) # Strategy sleep for one day

この戦略では,合計2つのチャートが作成され,並列に配置されています.cfgA左側には,先物価格と即時価格を含む現在のチャートがあり,cfgB右側にはスプレッドチャートがあります. その後,FMZプラットフォームの組み込みPythonの線描画ライブラリを呼び,チャートオブジェクトを作成します. 最後に,チャート内のデータはリアルタイムで更新されます.onTick function.

ステップ3:データを取得

last_spot_price = 0 # Save the last valid spot price
last_spread_price = 0 # Save the last valid spread price

def onTick():
    global last_spread_price, last_spot_price # import global variables
    exchange.SetContractType("i888") # Subscribe to futures varieties
    futures = _C(exchange.GetRecords)[-1] # Get the latest K line data
    futures_ts = futures.Time # Get the latest K-line futures timestamp
    futures_price = futures.Close # Get the latest K-line closing price

    spot = exchange.GetData("SPOTPRICE") # Get spot data
    spot_ts = spot.Time # Get spot timestamp
    if 'iron ore' in spot.Data:
        spot_price = spot.Data['iron ore']
        last_spot_price = spot_price
    else:
        spot_price = last_spot_price

    spread = exchange.GetData("spread") # Get spread data
    spread_ts = spread.Time # Get spread timestamp
    if 'iron ore' in spread.Data:
        spread_price = spread.Data['iron ore']
        last_spread_price = spread_price
    else:
        spread_price = last_spread_price

フューチャー価格,スポット価格,スプレッド価格です. フューチャー価格を得ることは簡単です.SetContractTypeフューチャーシンボルに直接購読し,その後GetRecordsスポットとスプレッドの価格については,前に紹介した方法,GetDataタイムスタンプを含む辞書データを返します

図表表示

img img img

戦略コードをすべて取得

# fmz@b72930603791887d7452f25f23a13bde
'''backtest
start: 2017-01-01 00:00:00
end: 2020-06-01 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
'''


# Global variables
# Futures and Spots chart
cfgA = {
    "extension": {
        "layout":'single',
        "col": 6,
        "height": "500px",
    },
    "title": {
        "text": "futures and spots chart"
    },
    "xAxis": {
        "type": "datetime"
    },
    "series": [{
        "name": "Futures Price",
        "data": [],
    }, {
        "name": "Spot Price",
        "data": [],
    }
    ]
}
# spread chart
cfgB = {
    "extension": {
        "layout":'single',
        "col": 6,
        "height": "500px",
    },
    "title": {
        "text": "spread chart"
    },
    "xAxis": {
        "type": "datetime"
    },
    "series": [{
        "name": "spread Price",
        "data": [],
    }]
}
last_spot_price = 0 # Save the last valid spot price
last_spread_price = 0 # Save the last valid spread price
chart = Chart([cfgA, cfgB]) # Create a chart object

def onTick():
    global last_spread_price, last_spot_price # import global variables
    exchange.SetContractType("i888") # Subscribe to futures varieties
    futures = _C(exchange.GetRecords)[-1] # Get the latest candlestick data
    futures_ts = futures.Time # Get the latest K-line futures timestamp
    futures_price = futures.Close # Get the latest K-line closing price
    Log('Future price:', futures_ts, futures_price)

    spot = exchange.GetData("SPOTPRICE") # Get spot data
    spot_ts = spot.Time # Get spot timestamp
    if 'iron ore' in spot.Data:
        spot_price = spot.Data['iron ore']
        last_spot_price = spot_price
    else:
        spot_price = last_spot_price
    Log('Spot price:', spot_ts, spot_price)

    spread = exchange.GetData("spread") # Get spread data
    spread_ts = spread.Time # Get spread timestamp
    if 'iron ore' in spread.Data:
        spread_price = spread.Data['iron ore']
        last_spread_price = spread_price
    else:
        spread_price = last_spread_price
    Log('spread price:', spread_ts, spread_price)

    chart.add(0, [futures_ts, futures_price]) # draw chart
    chart.add(1, [spot_ts, spot_price]) # draw chart
    chart.add(2, [spread_ts, spread_price]) # draw chart
    chart.update([cfgA, cfgB]) # update chart
    Log('---------')


# Strategy entrance
def main():
    LogReset() # Clear the previous log information before running
    chart.reset() # Clear the previous chart information before running
    while True: # Enter loop mode
        onTick() # execution strategy main function
        Sleep(1000 * 60 * 60 * 24) # Strategy sleep for one day

この戦略はFMZのプラットフォームに公開されています (FMZ.COM) 戦略スクエアでは,下記のリンクをクリックして直接使用できます.

https://www.fmz.com/strategy/211941

終わり

アルビトラージは想像するほど複雑ではない.金融理論の知識があまり必要ないし,複雑な数学や統計モデルも必要ない.アルビトラージは,本質的に不合理な価格から合理的な収益まで利益を得ることである.市場の条件は毎年変化する.トレーダーは,歴史的なデータを現在にコピーするのではなく,現在のデータを組み合わせて価格のスプレッドが合理的かどうかを研究することが最善である.


関連性

もっと