商品先物市場では,理論上,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),
# 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
戦略の主要な機能は,主にコードを実行することです.
# 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.
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
タイムスタンプを含む辞書データを返します
# 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
アルビトラージは想像するほど複雑ではない.金融理論の知識があまり必要ないし,複雑な数学や統計モデルも必要ない.アルビトラージは,本質的に不合理な価格から合理的な収益まで利益を得ることである.市場の条件は毎年変化する.トレーダーは,歴史的なデータを現在にコピーするのではなく,現在のデータを組み合わせて価格のスプレッドが合理的かどうかを研究することが最善である.