Math 计算最佳复利期(加密货币)

Math 计算最佳复利期(加密货币),math,optimization,logic,cryptocurrency,Math,Optimization,Logic,Cryptocurrency,我有一个有趣的问题,我不确定这是放在这里还是放在堆栈数学中的最佳位置,但因为我试图用编程方式解决它(在R中,但任何编程语言都可以工作),也许StackOverflow是最好的位置。问题涉及到加密货币的复合。 问题如下: 您在流动性池中下注“K”数量的代币以获得利息。 流动性池为您的代币提供“年百分比”(APR),即年利率,APR不复利。 你可以在任何时候复利,但每次都要付一点费用 我最初试图用一些for循环来解决这个问题,如果假设用户每“D”天复利一次,则估计最终回报。 当前示例使用CAKE和B

我有一个有趣的问题,我不确定这是放在这里还是放在堆栈数学中的最佳位置,但因为我试图用编程方式解决它(在R中,但任何编程语言都可以工作),也许StackOverflow是最好的位置。问题涉及到加密货币的复合。 问题如下: 您在流动性池中下注“K”数量的代币以获得利息。 流动性池为您的代币提供“年百分比”(APR),即年利率,APR不复利。 你可以在任何时候复利,但每次都要付一点费用

我最初试图用一些for循环来解决这个问题,如果假设用户每“D”天复利一次,则估计最终回报。 当前示例使用CAKE和BNB令牌。简化解决方案的一些假设。假设APR、bnb_值和cake_值是固定值(它们不是实际值)

问题是,你刚才看到的代码并没有真正告诉你什么时候是使你的兴趣复合的最佳时期。它告诉更多的是,如果用户每“D”天合成一次,收益率是多少。这接近于真正的解决方案,但不是它! 你可以凭直觉理解延长时间是错误的。你从一个小资本开始,所以为了获得好的回报,你“很少”因为费用而复利,但时间越长,你的资本增长越多。你的资本增长越快,你就越应该复利

当时我尝试了另一种方法

给出“年收益率百分比”的一般公式如下:

APY = (1 + APR/N)^N -1
如果你还考虑你的费用和初始资本:

Final_capital=Initial_capital*APY - single_fee*N
其中,APR是百分比,N是复合事件的数量(在此公式中,它们在时间上均匀分布)

通过用“dN”来区分最终的_资本,并找到方程的零,您可以得到最佳的复合事件数。如果将365除以合成事件的最佳数量,则应在合成令牌的天数后获得。 我从微分公式得到的结果与第一个解不同,我不知道为什么。我还认为,但我不确定,后一种解决方案是否与前一种解决方案具有相同的局限性

library(utils)
### interest APY formula minus fees
final_v=function(x, APR, fee_bnb, initial_value){
  return(  initial_value*( (1+APR/x)^x - 1 ) -fee_bnb*x   ) 
}

## differential respect to X of the interest APY formula minus the fees
a_diff_comp=function(x, APR, fee_bnb, initial_value){
  return( (initial_value*( (APR/x + 1)^x )*(  log(APR/x + 1) - APR/(  ((1/x)+1)*x  ) ) ) - fee_bnb )
}

x=3:40
y=sapply(x, a_diff_comp, APR=APR, fee_bnb=fee_bnb, initial_value=(initial_cakes*cake_value))
plot(x,y)

y2=sapply(x, final_v, APR=APR, fee_bnb=fee_bnb, initial_value=(initial_cakes*cake_value))
plot(x,y2)

xmin <- uniroot(a_diff_comp, c(1, 100), tol = 0.000001, APR=APR, fee_bnb=fee_bnb, initial_value=(initial_cakes*cake_value))
xmin$root
库(utils)
###利息APY公式减去费用
最终v=功能(x,APR,费用B,初始值){
返回(初始值*((1+APR/x)^x-1)-费用*x)
}
##利息APY公式X减去费用的差额
a_diff_comp=函数(x,APR,费用,初始值){
返回((初始值*((APR/x+1)^x)*(日志(APR/x+1)-APR/((1/x)+1)*x))-费用
}
x=3:40
y=sapply(x,a_diff_comp,APR=APR,fee_bnb=fee_bnb,初始值=(初始值*蛋糕值))
绘图(x,y)
y2=sapply(x,最终v,APR=APR,fee=fee,初始值=(初始值*蛋糕值))
绘图(x,y2)

xmin我在GitHub页面上发表了一条评论

但我想我现在明白你的意思了。我同意你的观点,甚至我的个人经历也证明了你的观点。cakeCalc提供最佳配合比的方式存在一些问题。在计算最终结果时,它认为您的余额在每次复利后是固定的,这似乎是相当有问题的。因此,每次你制作蛋糕时,cakeCalc都会给你一个不同的结果,即使你完全按照cakeCalc的建议去做,因为你的余额现在已经更新了

我从来没有试着写下方程式来推导出最佳组合区间,但有一点我可以肯定的是,最佳组合区间不会是固定的。例如,您可能希望找到最佳结果,如以下答案:

第20天复配,第38天复配,第53天复配

所以把N作为复合数并不能给出最好的答案。 解决这个问题的一个方法是:考虑到你在一年的时间里找到了最好的配合率。假设你想在这段时间内合成“m”次。现在,您有了“m”变量和一个希望最大化的表达式。我现在不确定,但也许你可以用一种简单的凸优化方法来解决它(只需要在之前检查方程的凸性,因为变量之间的约束都是仿射的)。然后对不同数量的“m”尝试相同的方法,并找出其中的最大数量。 这个解决方案是可行的,因为数字“m”是有界的(很明显,它是一个整数!),您可能会发现“m”与cakeCalc方法的结果非常接近。我想答案不会有太大的不同。因此,您可以将“m”更改不到10次,然后找到最佳解决方案

library(utils)
### interest APY formula minus fees
final_v=function(x, APR, fee_bnb, initial_value){
  return(  initial_value*( (1+APR/x)^x - 1 ) -fee_bnb*x   ) 
}

## differential respect to X of the interest APY formula minus the fees
a_diff_comp=function(x, APR, fee_bnb, initial_value){
  return( (initial_value*( (APR/x + 1)^x )*(  log(APR/x + 1) - APR/(  ((1/x)+1)*x  ) ) ) - fee_bnb )
}

x=3:40
y=sapply(x, a_diff_comp, APR=APR, fee_bnb=fee_bnb, initial_value=(initial_cakes*cake_value))
plot(x,y)

y2=sapply(x, final_v, APR=APR, fee_bnb=fee_bnb, initial_value=(initial_cakes*cake_value))
plot(x,y2)

xmin <- uniroot(a_diff_comp, c(1, 100), tol = 0.000001, APR=APR, fee_bnb=fee_bnb, initial_value=(initial_cakes*cake_value))
xmin$root