Skip to content

Commit

Permalink
Merge pull request #1220 from SpiderMan670/main
Browse files Browse the repository at this point in the history
docs: enhance dydx perpetual
  • Loading branch information
jasonandjay authored Nov 7, 2024
2 parents 01f55a4 + 2a536ff commit 15300d1
Show file tree
Hide file tree
Showing 3 changed files with 397 additions and 0 deletions.
107 changes: 107 additions & 0 deletions defi/DYDX/funding-rate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
以下是关于 **DYDX 永续合约的资金费率 (Funding Rate)** 部分的 JS 实现分析,它是永续合约的重要机制,用于保持合约价格与现货市场价格一致。

### 资金费率 (Funding Rate) 简介

资金费率是多头和空头之间周期性交换的费用。
它的计算基于以下公式:

\[
\text{Funding Rate} = \text{Index Price} - \text{Mark Price}
\]

- **Mark Price**:交易所计算的当前合约价格。
- **Index Price**:现货市场的参考价格。

资金费率正值时,多头支付空头;负值时,空头支付多头。

---

### 实现步骤
以下是用 JavaScript 模拟资金费率的简单计算过程:

#### 1. 数据初始化

```javascript
// 示例数据初始化
const indexPrice = 1000; // 现货参考价格(美元)
const markPrice = 1005; // 永续合约标记价格(美元)
const positionSize = 10; // 持仓量(单位合约数)
const fundingInterval = 8; // 资金费率结算周期(每 8 小时一次)
```

#### 2. 计算资金费率

```javascript
function calculateFundingRate(indexPrice, markPrice) {
// 资金费率计算
const fundingRate = (markPrice - indexPrice) / indexPrice;
return fundingRate;
}

const fundingRate = calculateFundingRate(indexPrice, markPrice);
console.log(`Funding Rate: ${(fundingRate * 100).toFixed(2)}%`);
```

#### 3. 计算资金费用

```javascript
function calculateFundingPayment(fundingRate, positionSize, markPrice) {
// 资金费用 = 资金费率 * 持仓量 * 标记价格
const fundingPayment = fundingRate * positionSize * markPrice;
return fundingPayment;
}

const fundingPayment = calculateFundingPayment(fundingRate, positionSize, markPrice);
console.log(`Funding Payment: $${fundingPayment.toFixed(2)}`);
```

---

### **完整代码**

```javascript
// 数据初始化
const indexPrice = 1000; // 现货参考价格
const markPrice = 1005; // 永续合约标记价格
const positionSize = 10; // 持仓量
const fundingInterval = 8; // 每8小时资金费率结算

// 计算资金费率
function calculateFundingRate(indexPrice, markPrice) {
return (markPrice - indexPrice) / indexPrice;
}

// 计算资金费用
function calculateFundingPayment(fundingRate, positionSize, markPrice) {
return fundingRate * positionSize * markPrice;
}

// 执行计算
const fundingRate = calculateFundingRate(indexPrice, markPrice);
console.log(`Funding Rate: ${(fundingRate * 100).toFixed(2)}%`);

const fundingPayment = calculateFundingPayment(fundingRate, positionSize, markPrice);
console.log(`Funding Payment: $${fundingPayment.toFixed(2)}`);
```

---

### **示例输出**

假设:
- **Index Price** = $1000
- **Mark Price** = $1005
- **Position Size** = 10

运行结果:
```
Funding Rate: 0.50%
Funding Payment: $50.25
```

### **分析**
- 资金费率为 **0.5%**,意味着多头需要每 8 小时支付持仓价值的 0.5%。
- 持仓者需支付 **$50.25** 的资金费用。

### **实际使用场景**
在 DYDX 平台上,类似计算通过链上合约自动执行,并根据市场条件动态调整。该机制能有效平衡多空双方的资金成本,确保合约价格与现货价格的紧密锚定。
162 changes: 162 additions & 0 deletions defi/DYDX/market-price.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
在 DYDX 永续合约中,价格计算是基于 **标记价格(Mark Price)****指数价格(Index Price)**,它们是维护合约公平性的核心组件。

以下是如何通过 JavaScript 模拟 **DYDX 永续合约价格机制** 的分析和实现。

### 1. **核心概念**

- **指数价格 (Index Price)**:从现货市场获取的加权平均价格,反映某资产的市场公平价格。
- **标记价格 (Mark Price)**:合约的实际交易价格,用于计算未实现盈亏(PnL)和强制平仓。
- **基差 (Basis)**:标记价格和指数价格之间的差异,通常受供需影响。

公式:
\[
\text{Mark Price} = \text{Index Price} + \text{Basis}
\]

### 2. **代码实现**

以下是 JavaScript 模拟 DYDX 永续合约价格计算的代码示例。

#### **Step 1: 初始化数据**

```javascript
// 初始化价格数据
const indexPrice = 2000; // 指数价格,现货市场价格(USD)
let basis = 10; // 初始基差(USD)

// 模拟标记价格计算
function calculateMarkPrice(indexPrice, basis) {
return indexPrice + basis;
}

const markPrice = calculateMarkPrice(indexPrice, basis);
console.log(`Mark Price: $${markPrice}`);
```

#### **Step 2: 模拟动态基差调整**

基差会根据市场供需动态调整,以下代码演示如何实时计算新的标记价格。

```javascript
// 模拟基差动态调整
function updateBasis(marketCondition) {
// 市场条件影响基差:市场多头占优,基差上升;空头占优,基差下降
if (marketCondition === "bullish") {
basis += 5; // 多头主导,基差增加
} else if (marketCondition === "bearish") {
basis -= 5; // 空头主导,基差减少
}
return basis;
}

// 模拟不同市场条件下的标记价格
const marketConditions = ["bullish", "bearish", "neutral"];
marketConditions.forEach((condition) => {
const updatedBasis = updateBasis(condition);
const updatedMarkPrice = calculateMarkPrice(indexPrice, updatedBasis);
console.log(`Market Condition: ${condition}`);
console.log(`Updated Mark Price: $${updatedMarkPrice}`);
});
```

#### **Step 3: 实现未实现盈亏(PnL)计算**

根据标记价格计算未实现盈亏,用于评估持仓的当前盈亏情况。

```javascript
// 计算未实现盈亏(PnL)
function calculatePnL(entryPrice, markPrice, positionSize) {
// PnL = (标记价格 - 入场价格) * 持仓量
const pnl = (markPrice - entryPrice) * positionSize;
return pnl;
}

// 示例数据
const entryPrice = 1980; // 持仓的入场价格
const positionSize = 2; // 持仓量(单位:合约)

const pnl = calculatePnL(entryPrice, markPrice, positionSize);
console.log(`Unrealized PnL: $${pnl.toFixed(2)}`);
```

---

### **完整代码**

```javascript
// 初始化
const indexPrice = 2000;
let basis = 10;

// 计算标记价格
function calculateMarkPrice(indexPrice, basis) {
return indexPrice + basis;
}

// 更新基差
function updateBasis(marketCondition) {
if (marketCondition === "bullish") {
basis += 5;
} else if (marketCondition === "bearish") {
basis -= 5;
}
return basis;
}

// 计算未实现盈亏
function calculatePnL(entryPrice, markPrice, positionSize) {
return (markPrice - entryPrice) * positionSize;
}

// 模拟
const markPrice = calculateMarkPrice(indexPrice, basis);
console.log(`Initial Mark Price: $${markPrice}`);

const marketConditions = ["bullish", "bearish", "neutral"];
marketConditions.forEach((condition) => {
const updatedBasis = updateBasis(condition);
const updatedMarkPrice = calculateMarkPrice(indexPrice, updatedBasis);
console.log(`Market Condition: ${condition}`);
console.log(`Updated Mark Price: $${updatedMarkPrice}`);

const pnl = calculatePnL(1980, updatedMarkPrice, 2);
console.log(`Unrealized PnL: $${pnl.toFixed(2)}\n`);
});
```

---

### **示例输出**

假设以下市场条件:
- **初始指数价格**:$2000
- **初始基差**:$10
- **入场价格**:$1980
- **持仓量**:2 合约

运行结果:

```
Initial Mark Price: $2010
Market Condition: bullish
Updated Mark Price: $2020
Unrealized PnL: $80.00
Market Condition: bearish
Updated Mark Price: $2010
Unrealized PnL: $60.00
Market Condition: neutral
Updated Mark Price: $2010
Unrealized PnL: $60.00
```

---

### **分析总结**

1. **动态基差**:市场条件直接影响基差,从而影响标记价格。
2. **未实现盈亏 (PnL)**:通过标记价格计算持仓的浮动盈亏,帮助用户实时评估风险。
3. **链上计算**:在 DYDX 平台,这些计算由智能合约实时进行,确保透明性和公平性。

如果需要更复杂的分析(如多资产组合、自动强制平仓逻辑),可以扩展代码!
Loading

0 comments on commit 15300d1

Please sign in to comment.