Thuật ngữ
Trong bảng điều khiển của nền tảng FMZ Quant, bấm
Ở đây tôi tải tập tin phân tích trực tiếp:
Tài liệu phân tích này là một phân tích về quá trình mở và đóng một vị trí phòng hộ tương lai tại chỗ trong quá trình backtesting.quarter
giao dịch ngoại hối OKX và cặp giao dịch làBTC_USDT
Để phân tích quá trình hoạt động của phòng hộ hợp đồng tương lai, bạn có thể xem các tập tin môi trường nghiên cứu cụ thể sau đây, được viết trong hai phiên bản: một phiên bản ngôn ngữ Python, một phiên bản ngôn ngữ JavaScript.
Phân tích về nguyên tắc bảo hiểm giao dịch tương lai tại chỗ.ipynb Trong [1]:
from fmz import *
task = VCtx('''backtest
start: 2019-09-19 00:00:00
end: 2019-09-28 12:00:00
period: 15m
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD", "stocks":1}, {"eid":"OKX","currency":"BTC_USDT","balance":10000,"stocks":0}]
''')
# Create backtesting environment
import matplotlib.pyplot as plt
import numpy as np
# Import the plot library matplotlib and library numpy
Trong [2]:
exchanges[0].SetContractType("quarter") # The first exchange object OKX Futures (eid: Futures_OKCoin) calls the function to set the current contract as a quarterly contract
initQuarterAcc = exchanges[0].GetAccount() # The initial account information of OKX Futures Exchange is recorded in the variable initQuarterAcc
initQuarterAcc
Ra khỏi [2]:
{
Trong [3]:
initSpotAcc = exchanges[1].GetAccount() # The initial account information of the OKX Spot Exchange is recorded in the variable initSpotAcc
initSpotAcc
Ra khỏi [1]:
{
Trong [4]:
quarterTicker1 = exchanges[0].GetTicker() # Get the futures exchange ticker, recorded in the variable quarterTicker1
quarterTicker1
Ra khỏi [1]:
{
Trong [5]:
spotTicker1 = exchanges[1].GetTicker() # Get the spot exchange ticker, recorded in the variable spotTicker1
spotTicker1
Ra khỏi [5]:
{
Trong [6]:
quarterTicker1.Buy - spotTicker1.Sell # The price difference between going short on futures and going long on spot.
Ra ngoài[6]: 284.6499999799999985
Trong [7]:
exchanges[0].SetDirection("sell") # Set up a futures exchange and trade in the direction of going short
quarterId1 = exchanges[0].Sell(quarterTicker1.Buy, 10) # Futures go short to place orders. The order quantity is 10 contracts. The returned order ID is recorded in the variable quarterId1.
exchanges[0].GetOrder(quarterId1) # Check the details of the order with futures order ID quarterId1.
Ra ngoài[7]:
{
Trong [8]:
spotAmount = 10 * 100 / quarterTicker1.Buy # Calculate the currency equivalent of 10 contracts as the order quantity of the spot.
spotId1 = exchanges[1].Buy(spotTicker1.Sell, spotAmount) # Place orders on the spot exchange
exchanges[1].GetOrder(spotId1) # Check the order details of the spot order ID of spotId1
Ra ngoài[8]:
{
Bạn có thể thấy rằng các lệnh hàng quýId1 và lệnh ngay lập tứcId1 đã được hoàn thành hoàn toàn, tức là việc bảo hiểm các vị trí mở đã hoàn thành.
Trong [9]:
Sleep(1000 * 60 * 60 * 24 * 7) # Hold the position for a while and wait for the price difference to become smaller to close the position.
Sau thời gian chờ đợi, chuẩn bị để đóng vị trí.quarterTicker2
, spotTicker2
và in chúng.
Hướng giao dịch của đối tượng giao dịch tương lai được thiết lập để đóng vị trí ngắn:exchanges[0].SetDirection("closesell")
đặt lệnh để đóng vị trí.
In chi tiết lệnh đóng lệnh, cho thấy lệnh đóng đã được hoàn thành, vị trí đóng đã hoàn thành.
Trong [10]:
quarterTicker2 = exchanges[0].GetTicker() # Get the current futures exchange ticker, recorded in the variable quarterTicker2
quarterTicker2
Ra khỏi[10]:
{
Trong [11]:
spotTicker2 = exchanges[1].GetTicker() # Get the current ticker of the spot exchange, recorded in the variable spotTicker2
spotTicker2
Ra khỏi [1]:
{
Trong [12]:
quarterTicker2.Sell - spotTicker2.Buy # The price difference between closing a short futures position and closing a long spot position.
Ra khỏi [1]: 52.5000200100003
Trong [13]:
exchanges[0].SetDirection("closesell") # Set the current trading direction of the futures exchange to close short positions.
quarterId2 = exchanges[0].Buy(quarterTicker2.Sell, 10) # The futures exchange places an order to close a position and records the order ID to the variable quarterId2.
exchanges[0].GetOrder(quarterId2) # Check futures close out order details
Ra khỏi [1]:
2 người.
Trong [14]:
spotId2 = exchanges[1].Sell(spotTicker2.Buy, spotAmount) # The spot exchange places an order to close a position and records the order ID, which is recorded to the variable spotId2.
exchanges[1].GetOrder(spotId2) # Check spot close out order details
Ra khỏi [1]:
2 người.
Trong [15]:
nowQuarterAcc = exchanges[0].GetAccount() # Get the current futures exchange account information, recorded in the variable nowQuarterAcc.
nowQuarterAcc
Ra khỏi [1]:
{
Trong [16]:
nowSpotAcc = exchanges[1].GetAccount() # Get the current spot exchange account information, recorded in the variable nowSpotAcc.
nowSpotAcc
Ra khỏi [1]:
{
Bằng cách so sánh tài khoản ban đầu với tài khoản vãng lai, lợi nhuận và lỗ của hoạt động phòng ngừa rủi ro được tính toán.
Trong [17]:
diffStocks = abs(nowQuarterAcc.Stocks - initQuarterAcc.Stocks)
diffBalance = nowSpotAcc.Balance - initSpotAcc.Balance
if nowQuarterAcc.Stocks - initQuarterAcc.Stocks > 0 :
print("profits:", diffStocks * spotTicker2.Buy + diffBalance)
else :
print("profits:", diffBalance - diffStocks * spotTicker2.Buy)
Ra khỏi [1]: Lợi nhuận: 18,72350977580652
Bây giờ chúng ta hãy xem tại sao việc bảo hiểm có lợi. Chúng ta có thể thấy biểu đồ được vẽ. Giá tương lai là một đường màu xanh và giá giao ngay là một đường màu cam. Cả hai giá đều giảm. Giá tương lai giảm nhanh hơn giá giao ngay.
Trong [18]:
xQuarter = [1, 2]
yQuarter = [quarterTicker1.Buy, quarterTicker2.Sell]
xSpot = [1, 2]
ySpot = [spotTicker1.Sell, spotTicker2.Buy]
plt.plot(xQuarter, yQuarter, linewidth=5)
plt.plot(xSpot, ySpot, linewidth=5)
plt.show()
Ra khỏi [1]:
Chúng ta hãy xem xét sự thay đổi của chênh lệch giá. Sự khác biệt giá dao động từ 284 tại thời điểm phòng ngừa vị trí mở (tức là, tương lai đi ngắn, và giao ngay đi dài) đến 52 tại thời điểm đóng vị trí (tương lai đóng vị trí ngắn, giao ngay đóng vị trí dài). Sự khác biệt giá từ lớn đến nhỏ.
Trong [19]:
xDiff = [1, 2]
yDiff = [quarterTicker1.Buy - spotTicker1.Sell, quarterTicker2.Sell - spotTicker2.Buy]
plt.plot(xDiff, yDiff, linewidth=5)
plt.show()
Ra khỏi [1]:
Ví dụ: a1 là giá tương lai tại thời điểm 1, và b1 là giá giao ngay tại thời điểm 1. A2 là giá tương lai tại thời điểm 2, và b2 là giá giao ngay tại thời điểm 2.Miễn là chênh lệch giá giao ngay tương lai tại thời điểm 1 (a1-b1) lớn hơn chênh lệch giá giao ngay tương lai tại thời điểm 2 (a2-b2), a1 - a2>b1 - b2 có thể được đưa vào. Có ba tình huống: (số lượng các vị trí tương lai và giao ngay là như nhau)
a1 - a2 lớn hơn 0, b1 - b2 lớn hơn 0 a1 - a2 đề cập đến chênh lệch giá của lợi nhuận tương lai, và b1 - b2 đề cập đến chênh lệch giá của lỗ tại chỗ (vì giao dịch đã đi dài, giá bắt đầu mua cao hơn giá bán để đóng vị trí, do đó tiền bị mất), nhưng lợi nhuận tương lai lớn hơn lỗ tại chỗ. Vì vậy, nó có lợi nhuận nói chung. Tình huống này tương ứng với biểu đồ ở bước [8].
a1 - a2 lớn hơn 0, b1 - b2 nhỏ hơn 0 a1 - a2 là chênh lệch giá của lợi nhuận tương lai, và b1 - b2 là chênh lệch giá của lợi nhuận tức thời (b1 - b2 nhỏ hơn 0, cho thấy b2 lớn hơn b1, tức là giá mở và mua vị trí thấp, và giá bán và đóng cao, vì vậy nó có lợi nhuận).
a1 - a2 ít hơn 0, b1 - b2 ít hơn 0 a1 - a2 là chênh lệch giá của lỗ tương lai, và b1 - b2 là chênh lệch giá của lợi nhuận tức thời. Vì a1 - a2 > b1 - b2, giá trị tuyệt đối của a1 - a2 nhỏ hơn giá trị tuyệt đối của b1 - b2, và lợi nhuận tức thời lớn hơn các lỗ tương lai. Nó có lợi nhuận nói chung.
Không có trường hợp a1 - a2 nhỏ hơn 0 và b1 - b2 lớn hơn 0, bởi vì a1 - a2 > b1 - b2 đã được xác định. Tương tự, nếu a1 - a2 bằng 0, vì a1 - a2 > b1 - b2 được xác định, b1 - b2 phải nhỏ hơn 0. Do đó, miễn là phương pháp phòng ngừa tương lai ngắn và giao ngay dài đáp ứng các điều kiện a1 - b1 > a2 - b2, các hoạt động mở và đóng vị trí là phòng ngừa lợi nhuận.
Ví dụ, mô hình sau đây là một trong những trường hợp:
Trong [20]:
a1 = 10
b1 = 5
a2 = 11
b2 = 9
# a1 - b1 > a2 - b2 launches: a1 - a2 > b1 - b2
xA = [1, 2]
yA = [a1, a2]
xB = [1, 2]
yB = [b1, b2]
plt.plot(xA, yA, linewidth=5)
plt.plot(xB, yB, linewidth=5)
plt.show()
Ra khỏi [1]:
Môi trường nghiên cứu hỗ trợ không chỉ Python, mà còn JavaScript Tôi cũng đưa ra một ví dụ về môi trường nghiên cứu JavaScript:
Phân tích về nguyên tắc phòng ngừa rủi ro tại chỗ tương lai (JavaScript).ipynb Trong [1]:
// Import the required package, click "Save settings" on the FMZ's "Strategy editing page" to get the string configuration and convert it to an object.
var fmz = require("fmz") // Import the talib, TA, and plot libraries automatically after import
var task = fmz.VCtx({
start: '2019-09-19 00:00:00',
end: '2019-09-28 12:00:00',
period: '15m',
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD","stocks":1},{"eid":"OKX","currency":"BTC_USDT","balance":10000,"stocks":0}]
})
Trong [2]:
exchanges[0].SetContractType("quarter") // The first exchange object OKX Futures (eid: Futures_OKCoin) calls the function to set the current contract as a quarterly contract.
var initQuarterAcc = exchanges[0].GetAccount() // The initial account information of OKX Futures Exchange is recorded in the variable initQuarterAcc.
initQuarterAcc
Ra khỏi [2]: { Số dư: 0, FrozenBalance: 0, Cổ phiếu: 1, FrozenStocks: 0 }
Trong [3]:
var initSpotAcc = exchanges[1].GetAccount() // The initial account information of the OKX Spot Exchange is recorded in the variable initSpotAcc.
initSpotAcc
Ra khỏi [1]: { Số dư: 10 000, FrozenBalance: 0, Cổ phiếu: 0, FrozenStocks: 0 }
Trong [4]:
var quarterTicker1 = exchanges[0].GetTicker() // Get the futures exchange ticker, recorded in the variable quarterTicker1.
quarterTicker1
Ra khỏi [1]: { Thời gian: 1568851210000, Tốc độ cao: 10441.25002, Mức thấp: 10441.25, Bán: 10441.25002, Mua: 10441.25, Cuối cùng: 10441.25001, Tập: 1772, OpenInterest: 0
Trong [5]:
var spotTicker1 = exchanges[1].GetTicker() // Get the spot exchange ticker, recorded in the variable spotTicker1.
spotTicker1
Ra khỏi [5]: { Thời gian: 1568851210000, Tốc độ cao: 10156.60000002, Mức thấp: 10156.6, Bán: 10156.60000002, Mua: 10156.6, Cuối cùng: 10156.60000001, Số lượng: 7.4443, OpenInterest: 0
Trong [6]:
quarterTicker1.Buy - spotTicker1.Sell // The price difference between going short on futures and going long on spot.
Ra ngoài[6]: 284.6499999799999985 Trong [7]:
exchanges[0].SetDirection("sell") // Set up a futures exchange and trade in the direction of going short
var quarterId1 = exchanges[0].Sell(quarterTicker1.Buy, 10) // Go short futures to place orders. The order quantity is 10 contracts. The returned order ID is recorded in the variable quarterId1.
exchanges[0].GetOrder(quarterId1) // Check the details of the order with futures order ID quarterId1.
Ra ngoài[7]:
{ ID: 1,
Giá: 10441.25,
Số tiền: 10
Số tiền giao dịch: 10,
Giá trung bình: 10441.25,
Loại: 1,
Tiến độ: 0,
Tình trạng: 1,
ContractType:
Trong [8]:
var spotAmount = 10 * 100 / quarterTicker1.Buy // Calculate the currency equivalent of 10 contracts as the order quantity of the spot.
var spotId1 = exchanges[1].Buy(spotTicker1.Sell, spotAmount) // Place orders on the spot exchange.
exchanges[1].GetOrder(spotId1) // Check the order details of the spot order ID of spotId1.
Ra ngoài[8]:
{ ID: 1,
Giá: 10156.60000002,
Số tiền: 0,0957,
DealAmount: 0.0957,
Giá trung bình: 10156.60000002,
Loại: 0,
Tiến độ: 0,
Tình trạng: 1,
ContractType:
Bạn có thể thấy rằng các lệnh quarterId1 và spotId1 đã được hoàn thành hoàn toàn, tức là việc bảo hiểm các vị trí mở đã hoàn thành.
Trong [9]:
Sleep(1000 * 60 * 60 * 24 * 7) // Hold the position for a while and wait for the price difference to become smaller to close the position.
Sau thời gian chờ đợi, chuẩn bị để đóng vị trí.quarterTicker2
, spotTicker2
và in chúng.
Hướng giao dịch của đối tượng giao dịch tương lai được thiết lập để đóng vị trí ngắn:exchanges[0].SetDirection("closesell")
đặt lệnh để đóng vị trí.
In chi tiết lệnh đóng lệnh, cho thấy lệnh đóng đã được hoàn thành, vị trí đóng đã hoàn thành.
Trong [10]:
var quarterTicker2 = exchanges[0].GetTicker() // Get the current futures exchange ticker, recorded in the variable quarterTicker2.
quarterTicker2
Ra khỏi[10]: { Thời gian: 1569456010000, Cao: 8497.20002, Mức thấp: 8497.2, Bán: 8497.20002, Mua: 8497.2, Cuối cùng: 8497.20001, Số lượng: 4311, OpenInterest: 0
Trong [11]:
var spotTicker2 = exchanges[1].GetTicker() // Get the current ticker of the spot exchange, recorded in the variable spotTicker2.
spotTicker2
Ra khỏi [1]: { Thời gian: 1569456114600, Tối cao: 8444.70000001, Mức thấp: 8444.69999999, Bán: 8444.70000001, Mua: 8444.69999999, Cuối cùng: 8444.7, Số lượng: 78.6273, OpenInterest: 0
Trong [12]:
quarterTicker2.Sell - spotTicker2.Buy // The price difference between closing short position of futures and closing long position of spot.
Ra khỏi [1]: 52.5000200100003
Trong [13]:
exchanges[0].SetDirection("closesell") // Set the current trading direction of the futures exchange to close short positions.
var quarterId2 = exchanges[0].Buy(quarterTicker2.Sell, 10) // The futures exchange places an order to close the position, and records the order ID to the variable quarterId2.
exchanges[0].GetOrder(quarterId2) // Check futures closing position order details.
Ra khỏi [1]:
{ ID: 2,
Giá: 8497.20002,
Số tiền: 10
Số tiền giao dịch: 10,
Giá trung bình: 8493.95335,
Loại: 0,
Tiền bồi thường: 1,
Tình trạng: 1,
ContractType:
Trong [14]:
var spotId2 = exchanges[1].Sell(spotTicker2.Buy, spotAmount) // The spot exchange places an order to close the position, and records the order ID to the variable spotId2.
exchanges[1].GetOrder(spotId2) // Check spot closing position order details.
Ra khỏi [1]:
{ ID: 2,
Giá: 8444.69999999,
Số tiền: 0,0957,
DealAmount: 0.0957,
Giá trung bình: 8444.69999999,
Loại: 1,
Tiến độ: 0,
Tình trạng: 1,
ContractType:
Trong [15]:
var nowQuarterAcc = exchanges[0].GetAccount() // Get the current futures exchange account information, recorded in the variable nowQuarterAcc.
nowQuarterAcc
Ra khỏi [1]: { Số dư: 0, FrozenBalance: 0, Kho dự trữ: 1.021786026184, FrozenStocks: 0
Trong [16]:
var nowSpotAcc = exchanges[1].GetAccount() // Get the current spot exchange account information, recorded in the variable nowSpotAcc.
nowSpotAcc
Ra khỏi [1]: { Số dư: 9834.74705446, FrozenBalance: 0, Hồ tồn kho: 0, FrozenStocks: 0 Bằng cách so sánh tài khoản ban đầu với tài khoản vãng lai, lợi nhuận và lỗ của hoạt động phòng ngừa rủi ro được tính toán.
Trong [17]:
var diffStocks = Math.abs(nowQuarterAcc.Stocks - initQuarterAcc.Stocks)
var diffBalance = nowSpotAcc.Balance - initSpotAcc.Balance
if (nowQuarterAcc.Stocks - initQuarterAcc.Stocks > 0) {
console.log("profits:", diffStocks * spotTicker2.Buy + diffBalance)
} else {
console.log("profits:", diffBalance - diffStocks * spotTicker2.Buy)
}
Ra khỏi [1]: Lợi nhuận: 18,72350977580652
Bây giờ chúng ta hãy xem tại sao việc bảo hiểm có lợi. Chúng ta có thể thấy biểu đồ được vẽ. Giá tương lai là một đường màu xanh và giá giao ngay là một đường màu cam. Cả hai giá đều giảm. Giá tương lai giảm nhanh hơn giá giao ngay.
Trong [18]:
var objQuarter = {
"index" : [1, 2], // The index is 1, that is, the first time, the opening time, and 2 is the closing time.
"arrPrice" : [quarterTicker1.Buy, quarterTicker2.Sell],
}
var objSpot = {
"index" : [1, 2],
"arrPrice" : [spotTicker1.Sell, spotTicker2.Buy],
}
plot([{name: 'quarter', x: objQuarter.index, y: objQuarter.arrPrice}, {name: 'spot', x: objSpot.index, y: objSpot.arrPrice}])
Ra khỏi [1]: Chúng ta hãy xem xét sự thay đổi của chênh lệch giá. Sự khác biệt giá dao động từ 284 tại thời điểm phòng ngừa các vị trí mở (tức là, tương lai đã ngắn, và giao dịch đã dài) đến 52 tại thời điểm đóng (kết thúc vị trí ngắn của tương lai, và đóng vị trí dài của giao dịch).
Trong [19]:
var arrDiffPrice = [quarterTicker1.Buy - spotTicker1.Sell, quarterTicker2.Sell - spotTicker2.Buy]
plot(arrDiffPrice)
Ra khỏi [1]:Ví dụ: a1 là giá tương lai tại thời điểm 1, và b1 là giá giao ngay tại thời điểm 1. A2 là giá tương lai tại thời điểm 2, và b2 là giá giao ngay tại thời điểm 2.Miễn là chênh lệch giá giao ngay tương lai tại thời điểm 1 (a1-b1) lớn hơn chênh lệch giá giao ngay tương lai tại thời điểm 2 (a2-b2), a1 - a2>b1 - b2 có thể được đưa vào. Có ba tình huống: (số lượng các vị trí tương lai và giao ngay là như nhau)
a1 - a2 lớn hơn 0, b1 - b2 lớn hơn 0 a1 - a2 đề cập đến chênh lệch giá của lợi nhuận tương lai, và b1 - b2 đề cập đến chênh lệch giá của lỗ tại chỗ (vì giao dịch đã đi dài, giá bắt đầu mua cao hơn giá bán để đóng vị trí, do đó tiền bị mất), nhưng lợi nhuận tương lai lớn hơn lỗ tại chỗ. Vì vậy, nó có lợi nhuận nói chung. Tình huống này tương ứng với biểu đồ ở bước [8].
a1 - a2 lớn hơn 0, b1 - b2 nhỏ hơn 0 a1 - a2 là chênh lệch giá của lợi nhuận tương lai, và b1 - b2 là chênh lệch giá của lợi nhuận tức thời (b1 - b2 nhỏ hơn 0, cho thấy b2 lớn hơn b1, tức là giá mở và mua vị trí thấp, và giá bán và đóng cao, vì vậy nó có lợi nhuận).
a1 - a2 ít hơn 0, b1 - b2 ít hơn 0 a1 - a2 là chênh lệch giá của lỗ tương lai, và b1 - b2 là chênh lệch giá của lợi nhuận tức thời. Vì a1 - a2 > b1 - b2, giá trị tuyệt đối của a1 - a2 nhỏ hơn giá trị tuyệt đối của b1 - b2, và lợi nhuận tức thời lớn hơn các lỗ tương lai. Nó có lợi nhuận nói chung.
Không có trường hợp a1 - a2 nhỏ hơn 0 và b1 - b2 lớn hơn 0, bởi vì a1 - a2 > b1 - b2 đã được xác định. Tương tự, nếu a1 - a2 bằng 0, vì a1 - a2 > b1 - b2 được xác định, b1 - b2 phải nhỏ hơn 0. Do đó, miễn là phương pháp phòng ngừa tương lai ngắn và giao ngay dài đáp ứng các điều kiện a1 - b1 > a2 - b2, các hoạt động mở và đóng vị trí là phòng ngừa lợi nhuận.
Ví dụ, mô hình sau đây là một trong những trường hợp:
Trong [20]:
var a1 = 10
var b1 = 5
var a2 = 11
var b2 = 9
// a1 - b1 > a2 - b2 launches: a1 - a2 > b1 - b2
var objA = {
"index" : [1, 2],
"arrPrice" : [a1, a2],
}
var objB = {
"index" : [1, 2],
"arrPrice" : [b1, b2],
}
plot([{name : "a", x : objA.index, y : objA.arrPrice}, {name : "b", x : objB.index, y : objB.arrPrice}])
Ra khỏi [1]:
Thử đi, các bạn!