作者归档:fanyy

理解Uniswap V3

Uniswap V3

序言

我们知道Uniswap V3相比于V2有一个最大的变化就是:集中流动性(Concentrated Liquidity),它可以让LP选择在某段价格区间内提供流动性,从而大幅度提高资金使用效率,官方声称在0.1%的价格区间上最大能达到4000倍,不可谓不疯狂。为什么可以提高资金效率,原理也很简单:我们知道V2里面LP其实是在\([0, \infty]\) 上提供流动性,然而实际swap的价格波动大概率在一个很有限的范围内,因此实际用到的资金其实很少。集中新流动性这个想法听上去很好,但它是如何实现的呢?想要深入理解V3是如何实现的,强烈推荐先看下官方的白皮书:UniswapV3 WhitePaper,工程实现其实是非常复杂的,理解起来也不容易,这正是本文的目的所在。(另外,关于V3以及V2/V1的功能性介绍强烈推荐这篇文章:Uniswap v3 Explained – All You Need to Know

流动性

在V3里,当我们说添加流动性的时候,这个流动性到底指的是什么?

解释这点之前,我们先思考一个问题:既然LP可以选择在[……]

继续阅读

Uniswap V3 Impermanent Loss

公式推导

假设当前价格是\(P_c\),我们选择在区间\([a,b]\)提供流动性\(L\),那么所需要的真实资产\(x\)和\(y\)分别是:
$$
\begin{align*}
& x = L (\frac{1}{\sqrt P_c} – \frac{1}{\sqrt P_b}) \\
& y = L (\sqrt P_c – \sqrt P_a)
\end{align*}
$$

我们定义:

  • 不做LP而选择hold资产,那么hold资产的价值为:

$$
\begin{align*}
& V_{\text{hold}} = y + x * P
\end{align*}
$$

带入\(L\)和\(P_c\)可得:

$$
\begin{align*}
& V_{\text{hold}} = L (\sqrt P_c – \sqrt P_a) + L (\frac{1}{\sqrt P_c} -[……]

继续阅读

为什么我不再从事算法的工作了?

结缘

从我2016年接触人工智能到现在已经有三年多的时间了,启蒙学习来自于吴恩达在斯坦福教的那一门CS229机器学习公开课,我当时(2013年)看的并不是现在Coursera上的那一门机器学习课,而是一个画质很模糊的公开课视频。由于画质太渣,有些板书公式的推导看不清楚,似懂非懂。但是,当时就有一个巨大的疑问一直浮现在我的脑海里:“机器到底是如何学习的?”带着这个疑问,2017年开始我就在Coursera开始正儿八经的学习机器学习了,不得不说Coursera上的那门《机器学习》真的很适合入门,比周志华的西瓜书好太多了,学完之后又去学了《深度学习》系列,整体而言难度并不大,用到的数学80%都是高中数学。

2016年下半年我就有了出国留学的打算,主要想法是工作了两三年觉得重复性的工作太无聊了,没什么激情,想趁着年轻出去看看外面的世界。当时选定的三个国家和地区是香港、新加坡和英国。英国想去的学校(比如帝国理工啥的)学费太高,伦敦地区的租房又很贵,超预算;新加坡的NUS需要考GRE,而且offer来的太晚;而NTU则没有什么好的CS硕士项目;那么很自然地就来到了香港。其实,那时候并没有抱着能[……]

继续阅读

Neo4j使用APOC导出cypher语句

我们知道,neo4j community版本不支持把数据库导出成cypher语句进行增量更新,也就是所谓的Hot Backup,只能整库dump/load停机冷备份,这样不便于不同数据库之间融合。一个解决办法是,根据图谱模型,自己写一个脚本生成cypher语句,这样比较麻烦;另一个是使用第三方工具APOC导出成cypher语句。具体步骤如下:

安装APOC

  • 下载

    前往https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases/3.4.0.3 下载 apoc-3.4.0.3-all.jar

  • 安装

    apoc-3.4.0.3-all.jar放到neo4j安装路径的plugins目录下,即 $NEO4J_HOME/plugins/。如果没有可执行权限的话(一般是有的),还需要如下命令:

  • 修改配置

    neo4j.conf文件中添加以下配置:

  • 重启neo4j

    [crayon-64[……]

    继续阅读

Neo4j如何表示带权重的关系

问题描述

我们知道图数据库可以用来表示节点之间的关系,大多数情况下,这个功能就足够使用了。但有时候我们希望知道这些关系的权重是怎样的,也就是说我们需要一个带权重的图(weighted graph)。比如,我们以上海周边城市图谱为例。先用如下cypher语句创建节点和关系:
CREATE (Shanghai:City {name:'上海'})
CREATE (Suzhou:City {name:'苏州'})
CREATE (Wuxi:City {name:'无锡'})
CREATE (Nanjing:City {name:'南京'})
CREATE (Ningbo:City {name:'宁波'})
CREATE (Shanghai)-[:Neighbor]->(Suzhou)
CREATE (Shanghai)-[:Neighbor]->(Wuxi)
CREATE (Shanghai)-[:Neighbor]->(Nanjing)
CREATE (Shanghai)-[:Neighbor]->(Ningbo)

可视化如下:
Imgur

解决方案

方法其实很简单:只要在关系[……]

继续阅读