Skip to content

边缘定位

边缘定位模块使用概率来计算您的胜率和风险回报比。它将利用这些统计数据来控制您的策略交易入场点、头寸大小和止损点。

弃用的功能

边缘定位(或简称边缘)目前只处于维护模式(我们保留现有功能),应被视为已弃用。 它目前不会接收新功能,除非有人愿意接手该模块的所有权,否则我们将决定从Freqtrade中删除边缘。

Warning

使用带有动态白名单(VolumePairList)的边缘定位时,请确保还使用了AgeFilter并将其至少设置为calculate_since_number_of_days,以避免缺少数据的问题。

Note

边缘定位只考虑自己的买入/卖出/止损信号。它忽略了策略配置文件中的止损、跟踪止损和ROI设置。 边缘定位提高了某些交易策略的性能,但降低了其它策略的性能。

介绍

交易策略并非完美无缺。它们只是容易受市场及其指标的影响的框架。由于市场完全不可预测,有时策略会赢,有时相同的策略会输。

为了在市场中获得优势,策略必须赚取的钱比亏损的多。在交易中赚钱不仅仅取决于 策略赚或亏的频率

重要的不是频率,而是数量!

一种糟糕的策略可能在 次交易中挣了1美分,但在 一次 交易中亏损了1美元。如果只看盈利交易的数量,那么会误导地认为该策略实际上是盈利的。

边缘定位模块旨在提高策略的获胜概率和长期内的盈利。我们提出以下问题1

哪个交易选项更好?

a) 有80%的几率亏损100美元和20%的几率赢得200美元的交易
b) 有100%的几率亏损30美元的交易

答案

a) 的期望值小于 b) 的期望值。
因此,长期来看,b) 代表着更小的损失。
然而,答案是:这取决于情况

另一种思考方法是提出类似的问题:

哪个交易选项更好?

a) 有80%的几率赢得100美元和20%的几率亏损200美元的交易
b) 有100%的几率赢得30美元的交易

边际位置试图自动回答有关风险/回报和头寸大小的难题,以最小化给定策略的亏损可能性。

交易,盈利和亏损

我们称 \(o\) 为单笔交易 \(o\) 的收益,其中 \(o \in \mathbb{R}\)。集合 \(O = \{o_1, o_2, ..., o_N\}\) 是一次交易会话中所有交易的收益集合。我们说 \(N\)\(O\) 的基数,或者用通俗的说法,它是交易会话中进行的交易数量。

示例

在一个策略进行了三笔交易的会话中,我们可以说 \(O = \{3.5, -1, 15\}\)。这意味着 \(N = 3\)\(o_1 = 3.5\)\(o_2 = -1\)\(o_3 = 15\)

盈利交易是策略“赚到”钱的交易。赚钱意味着策略在扣除所有费用后以盈利的价格平仓。形式上,盈利交易将具有 \(o_i > 0\) 的收益。类似地,亏损交易将具有 \(o_j \leq 0\) 的收益。通过这样,我们可以如下发现所有盈利交易的集合 \(T_{win}\):$$ T_{win} = { o \in O | o > 0 } $$

类似地,我们可以通过以下方式发现输掉交易的集合 \(T_{lose}\)

\[ T_{lose} = \{o \in O | o \leq 0\} \]

示例

在一个策略进行了四次交易的部分中 \(O = \{3.5, -1, 15, 0\}\)
\(T_{win} = \{3.5, 15\}\)
\(T_{lose} = \{-1, 0\}\)

胜率和亏损率

胜率 \(W\) 是策略中盈利交易占所有交易的比例。我们使用下面的函数计算胜率:

\[W = \frac{|T_{win}|}{N}\]

其中 \(W\) 是胜率,\(N\) 是交易数量,\(T_{win}\) 是策略盈利交易的集合。

类似地,我们可以计算亏损交易的比例:

\[ L = \frac{|T_{lose}|}{N} \]

在上面的公式中,\(L\)代表损失率,\(N\)代表交易次数,\(T_{lose}\)代表所有亏损的交易。需要注意的是,上述公式可以等价地计算得到 \(L = 1 - W\)\(W = 1 - L\)

风险回报比

风险回报比 (\(R\)) 是用来衡量投资的预期收益和风险损失之间的关系的公式。它基本上是潜在盈利除以潜在亏损。形式上可以表示为:

\[ R = \frac{\text{潜在盈利}}{\text{潜在亏损}} \]
\(R\)计算的实例

假设你认为今天的 stonecoin 价格是10.0美元。你相信,由于他们将开始挖掘 stonecoin,明天它的价格将上升到15.0美元。然而,有一个风险,即石头太硬,显卡无法挖掘,所以价格可能会降至0美元。你计划投资100美元,这将给你10股股份(100 / 10)。

潜在盈利计算如下:

\(\begin{aligned} \text{potential_profit} &= (\text{potential_price} - \text{entry_price}) * \frac{\text{investment}}{\text{entry_price}} \\ &= (15 - 10) * (100 / 10) \\ &= 50 \end{aligned}\)

由于价格可能会跌至0美元,投资的100美元可能会变为0美元。

然而,我们使用了一个止损比例为15% - 这意味着在最坏的情况下,我们将以低于买入价格的15%(即8.5美元)卖出。

\(\begin{aligned} \text{potential_loss} &= (\text{entry_price} - \text{stoploss}) * \frac{\text{investment}}{\text{entry_price}} \\ &= (10 - 8.5) * (100 / 10)\\ &= 15 \end{aligned}\)

我们可以按照以下方式计算风险收益比:

\(\begin{aligned} R &= \frac{\text{potential_profit}}{\text{potential_loss}}\\ &= \frac{50}{15}\\ &= 3.33 \end{aligned}\)
这实际上意味着该策略有潜力每投资1美元赚取3.33美元。

从长远来看,即多次交易,我们可以通过将策略在盈利交易上的平均利润除以亏损交易上的平均亏损来计算风险收益。我们可以按以下方式计算平均利润\(\mu_{win}\)

\[ \text{average_profit} = \mu_{win} = \frac{\text{sum_of_profits}}{\text{count_winning_trades}} = \frac{\sum^{o \in T_{win}} o}{|T_{win}|} \]

同样,我们可以按以下方式计算平均亏损\(\mu_{lose}\)

\[ \text{average_loss} = \mu_{lose} = \frac{\text{sum_of_losses}}{\text{count_losing_trades}} = \frac{\sum^{o \in T_{lose}} o}{|T_{lose}|} \]

最后,我们可以按以下方式计算风险收益比\(R\)

\[ R = \frac{\text{average_profit}}{\text{average_loss}} = \frac{\mu_{win}}{\mu_{lose}}\\ \]
使用均值利润/亏损计算\(R\)的实例

假设我们使用的策略平均盈利 \(\mu_{win} = 2.06\) 和平均亏损 \(\mu_{loss} = 4.11\)
我们计算风险收益比如下:
\(R = \frac{\mu_{win}}{\mu_{loss}} = \frac{2.06}{4.11} = 0.5012...\)

期望值

通过将胜率 \(W\) 和风险回报率 \(R\) 结合起来,我们可以创建一个预期比率 \(E\)。预期比率是在交易中所进行的投资的预期回报率。我们可以按照以下方式计算 \(E\) 的值:

\[E = R * W - L\]

计算 \(E\)

假设一个策略的胜率 \(W = 0.28\),风险回报率 \(R = 5\)。这意味着该策略预计在28%的交易中进行5倍的投资回报。来看一个例子:
\(E = R * W - L = 5 * 0.28 - 0.72 = 0.68\)

上述例子中计算得出的预期意味着,平均来说,这个策略的交易将使其亏损的1.68倍。换句话说,该策略平均每损失1美元就能赚取1.68美元。

这对于两个方面很重要:首先,显而易见,你会立即知道你有一个正回报率。其次,现在你有一个可以与其他候选系统进行比较的数字,来决定哪些系统可以使用。

需要记住的是,任何具有大于0的预期的系统都是使用过去的数据是有盈利的。关键是找到一个在未来也能盈利的系统。

您还可以使用该值来评估对此系统进行的修改的有效性。

注意

需要牢记 Edge 是使用历史数据来测试您的预期值,不能保证您将来也能获得类似的优势。进行这种测试仍然至关重要,以建立对您的方法的信心,但是要谨防将您的方法与历史数据过度适配,因为未来的交易可能不会以完全相同的方式发生。

它是如何工作的?

Edge 将动态止损、动态持仓和白名单生成结合到一个独立的模块中,然后应用于交易策略。如果在配置中启用,Edge 将通过一系列止损来分析历史数据,以找到买入和卖出/止损信号。然后,对于每个止损,它计算 N 次交易的胜率和预期值。以下是一个示例:

交易对 止损水平 胜率 风险收益比 期望收益率
XZC/ETH -0.01 0.50 1.176384 0.088
XZC/ETH -0.02 0.51 1.115941 0.079
XZC/ETH -0.03 0.52 1.359670 0.228
XZC/ETH -0.04 0.51 1.234539 0.117

这里的目标是找到最适合策略的止损水平,以获得最大的期望收益率。根据历史数据, 上述示例中,止损水平为\(3%\)时获得了最大的期望收益率。

然后,Edge模块将动态地将其评估的止损水平值强制应用于您的策略。

仓位大小

Edge根据以下因素,根据每笔交易指示机器人投入的金额:

  • 可承受的风险资本
  • 止损水平

可承受的风险资本的计算方法如下:

可承受的风险资本 = (可用资本百分比) X (每笔交易允许风险)

止损水平的计算方法如上所述,根据历史数据计算。

仓位大小的计算方法如下:

头寸大小 = (风险资本) / 止损

示例:

假设投注货币是 ETH,钱包中有 \(10\) ETH。可用资本的百分比为 \(50\%\),每笔交易允许的风险为 \(1\%\)。因此,交易的可用资本为 \(10 * 0.5 = 5\) ETH,允许的风险资本将为 \(5 * 0.01 = 0.05\) ETH

  • 交易 1: 策略在 XLM/ETH 市场检测到新的买入信号。边缘定位计算出 \(2\%\) 的止损和 \(0.05 / 0.02 = 2.5\) ETH 的头寸。机器人在 XLM/ETH 市场上建立了一个 \(2.5\) ETH 的头寸。
  • 交易 2: 策略在 BTC/ETH 市场检测到买入信号,而 交易 1 仍然未平仓。边缘定位计算出该市场上 \(4\%\) 的止损。因此,交易 2 的头寸大小为 \(0.05 / 0.04 = 1.25\) ETH

可用资本 ≠ 钱包中可用金额

尽管 交易 1 仍未平仓,但可用于交易的资本在 交易 2 中并没有改变。可用于交易的资本 并不是 钱包中的可用金额。

  • 交易 3: 策略在 ADA/ETH 市场检测到买入信号。边缘定位计算出 \(1\%\) 的止损和 \(0.05 / 0.01 = 5\) ETH 的头寸。由于 交易 1 被锁定了 \(2.5\) ETH交易 2 被锁定了 \(1.25\) ETH,只剩下 \(5 - 1.25 - 2.5 = 1.25\) ETH 可用。因此,交易 3 的头寸大小为 \(1.25\) ETH

可用资本的更新

在头寸被出售之前,可用资本不会发生变化。当一笔交易被平仓时,如果该交易盈利则可用资本增加,如果该交易亏损则可用资本减少。

  • 策略在 XLM/ETH 市场检测到卖出信号。机器人以 \(1\) ETH 的盈利退出了 交易 1。钱包中的总资本变为 \(11\) ETH,可用于交易的资本变为 \(5.5\) ETH
  • 交易 4: 策略在 XLM/ETH 市场检测到新的买入信号。边缘定位计算出 \(2\%\) 的止损和 \(0.055 / 0.02 = 2.75\) ETH 的头寸大小。

Edge命令参考

使用方法:freqtrade edge [-h] [-v] [--logfile 文件] [-V] [-c 路径] [-d 路径]
                      [--userdir 路径] [-s NAME] [--strategy-path 路径]
                      [-i TIMEFRAME] [--timerange TIMERANGE]
                      [--data-format-ohlcv {json,jsongz,hdf5}]
                      [--max-open-trades INT] [--stake-amount STAKE_AMOUNT]
                      [--fee FLOAT] [-p PAIRS [PAIRS ...]]
                      [--stoplosses STOPLOSS_RANGE]

可选参数:
  -h, --help            显示帮助信息并退出
  -i TIMEFRAME, --timeframe TIMEFRAME
                        指定时间框架(`1m`, `5m`, `30m`, `1h`, `1d`)。
  --timerange TIMERANGE
                        指定要使用的数据的时间范围。
  --data-format-ohlcv {json,jsongz,jdf5}
                        存储下载的蜡烛图(OHLCV)数据的格式。
                        (默认: `None`)。
  --max-open-trades INT
                        覆盖`max_open_trades`配置设置的值。
  --stake-amount STAKE_AMOUNT
                        覆盖`stake_amount`配置设置的值。
  --fee FLOAT           指定费率比例。将在交易进入和退出时应用两次。
  -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
                        限制命令只针对这些交易对。交易对以空格分隔。
  --stoplosses STOPLOSS_RANGE
                        定义edge将根据哪个区间的止损值评估策略。格式为"min,max,step"
                        (没有任何空格)。例如:
                        `--stoplosses=-0.01,-0.1,-0.001`

常用参数:
  -v, --verbose         详细模式(-vv 获取更多,-vvv 获取所有消息)。
  --logfile FILE        记录到指定的文件中。特殊的值有:
                        'syslog'、'journald'。有关详情,请参阅文档。
  -V, --version         显示程序的版本号并退出
  -c PATH, --config PATH
                        指定配置文件(默认:
                        `userdir/config.json`或`config.json`,哪个存在)。
                        可以使用多个--config选项。可以将其设置为`-`以从标准输入读取配置。
  -d PATH, --datadir PATH
                        具有历史回测数据的目录的路径。
  --userdir PATH, --user-data-dir PATH
                        userdata目录的路径。

策略参数:
  -s NAME, --strategy NAME
                        指定bot将使用的策略类名。
  --strategy-path PATH  指定附加的策略查找路径。

配置

Edge模块具有以下配置选项:

参数 描述
enabled 如果为true,则Edge将定期运行。
默认为false
数据类型: 布尔值
process_throttle_secs Edge运行的时间间隔(以秒为单位)。
默认为3600(每小时运行一次)。
数据类型: 整数
calculate_since_number_of_days Edge计算胜率、风险报酬率和期望值时使用的数据天数。
注意 它下载历史数据,因此增加这个数字会导致机器人变慢。
默认为7
数据类型: 整数
allowed_risk 每笔交易允许的风险比例。
默认为0.01(1%)。
数据类型: 浮点数
stoploss_range_min 最小止损值。
默认为-0.01
数据类型: 浮点数
stoploss_range_max 最大止损值。
默认为-0.10
数据类型: 浮点数
stoploss_range_step 例如,如果设置为-0.01,则Edge将在[-0.01, -0.02, -0.03 ..., -0.09, -0.10]范围内测试策略。
注意 较小的步长意味着更大的范围,这可能导致计算变慢。
如果将此参数设置为-0.001,则会使Edge的计算变慢10倍。
默认为-0.001
数据类型: 浮点数
minimum_winrate 过滤掉不符合最低胜率要求的交易对。
如果你希望保守一些,不以风险报酬比为重要因素来考量胜率,这将非常有用。
默认为0.60
数据类型: 浮点数
minimum_expectancy 过滤掉期望值低于此数值的交易对。
期望值为0.20意味着如果你在一次交易中投入10美元,你预计能获得12美元的回报。
默认为0.20
数据类型: 浮点数
min_trade_number 在根据历史数据计算WRE(期望值)时,你总是希望有一个最小交易次数。这个数字越大,Edge越可靠。
一次交易100%的胜率根本没有任何意义。但是过去100次交易中有70%的胜率就很有意义了。
默认为10(强烈建议不要减小此数字)。
数据类型: 整数
max_trade_duration_minute Edge将过滤掉持续时间很长的交易。如果一笔交易在一个月后就盈利了,那么很难根据它来评估策略。但是,如果大多数交易都是盈利的,并且它们的最长持续时间为30分钟,那么这显然是一个好迹象。
注意: 在配置此值时,您应考虑您的时间框架。例如,对于间隔为4小时的策略,过滤掉持续时间少于一天的交易是没有意义的。 默认值假设您的策略间隔相对较小(1分钟或5分钟等)。
默认为1440(一天).
数据类型: 整数
remove_pumps Edge将在浏览历史数据时删除给定市场中的突然上涨。然而,鉴于在加密货币市场中突然上涨非常频繁,我们建议您关闭此功能。
默认为false.
数据类型:* 布尔值

独立运行Edge

您可以独立运行Edge以查看详细的结果。以下是一个示例:

freqtrade edge

其输出示例为:

交易对 止损 胜率 风险回报比 可接受的风险回报 期望 交易总数 平均持续时间(分钟)
AGI/BTC -0.02 0.64 5.86 0.56 3.41 14 54
NXS/BTC -0.03 0.64 2.99 0.57 1.54 11 26
LEND/BTC -0.02 0.82 2.05 0.22 1.50 11 36
VIA/BTC -0.01 0.55 3.01 0.83 1.19 11 48
MTH/BTC -0.09 0.56 2.82 0.80 1.12 18 52
ARDR/BTC -0.04 0.42 3.14 1.40 0.73 12 42
BCPT/BTC -0.01 0.71 1.34 0.40 0.67 14 30
WINGS/BTC -0.02 0.56 1.97 0.80 0.65 27 42
VIBE/BTC -0.02 0.83 0.91 0.20 0.59 12 35
MCO/BTC -0.02 0.79 0.97 0.27 0.55 14 31
GNT/BTC -0.02 0.50 2.06 1.00 0.53 18 24
HOT/BTC -0.01 0.17 7.72 4.81 0.50 209 7
SNM/BTC -0.03 0.71 1.06 0.42 0.45 17 38
APPC/BTC -0.02 0.44 2.28 1.27 0.44 25 43
NEBL/BTC -0.03 0.63 1.29 0.58 0.44 19 59

通过将calculate_since_number_of_daysminimum_expectancy进行比较,Edge根据配置文件找到了min_trade_number历史信息而生成了上述表格。Edge用于比较的计时范围可以使用--timerange开关进一步限制。

在实时模式和模拟运行模式中,当经过process_throttle_secs后,Edge将再次使用calculate_since_number_of_daysminimum_expectancy进行比较以找到min_trade_number。如果找不到min_trade_number,则机器人将返回“白名单为空”。根据所采用的交易策略,"白名单为空"可能会大部分时间或全部时间返回。使用Edge也可能导致交易突然发生,但这种情况很少见。

如果您经常遇到“白名单为空”,请考虑调整calculate_since_number_of_daysminimum_expectancymin_trade_number以使其与您的交易策略的交易频率保持一致。

用最新数据更新缓存的交易对

Edge需要与回测相同的历史数据。有关详细信息,请参阅文档中的数据下载部分。

精确的止损范围

freqtrade edge --stoplosses=-0.01,-0.1,-0.001 #最小值、最大值、步长

高级使用Timerange

freqtrade edge --timerange=20181110-20181113

使用--timerange=-20190901可以获取截止到2019年9月1日的所有可用数据(不包括2019年9月1日)。

完整的timerange规范:

  • 使用到2018年1月31日的tickframes:--timerange=-20180131
  • 使用自2018年1月31日起的tickframes:--timerange=20180131-
  • 使用自2018年1月31日至2018年3月1日的tickframes:--timerange=20180131-20180301
  • 使用POSIX时间戳1527595200和1527618600之间的tickframes:--timerange=1527595200-1527618600

  1. 问题摘自MIT Opencourseware S096 - Mathematics with applications in Finance课程:https://ocw.mit.edu/courses/mathematics/18-s096-topics-in-mathematics-with-applications-in-finance-fall-2013/