概念
- Strategy: 交易策略。Your trading strategy, telling the bot what to do.
- Trade: 交易。Open position.
- Open Order: 订单,未完成。 Order which is currently placed on the exchange, and is not yet complete.
- Pair: 可以交易 pair,比如XRP/USDT。Tradable pair, usually in the format of Base/Quote (e.g. XRP/USDT).
- Timeframe: Candle length 相关 x 线图,比如分钟图,小时k图,日k 等。 Candle length to use (e.g. "5m", "1h", ...).
- Indicators: 指标,也可以看成 Feature。Technical indicators (SMA, EMA, RSI, ...).
- Limit order: 限价单。Limit orders which execute at the defined limit price or better.
- Market order: 市价单。Guaranteed to fill, may move price depending on the order size.
- Current Profit: 当前利润(未实际实现)。Currently pending (unrealized) profit for this trade. This is mainly used throughout the bot and UI.
- Realized Profit: 已经实现的利润。Already realized profit. Only relevant in combination with partial exits - which also explains the calculation logic for this.
- Total Profit: 总利润(包括未实现和已经实现的)。Combined realized and unrealized profit. The relative number (%) is calculated against the total investment in this trade.
Bot 执行流程
以试运行(dry-run)或实时模式(使用 freqtrade trade )启动 freqtrade 将启动机器人并启动机器人迭代循环。这也将运行 bot_start() 回调。默认情况下,bot 循环每隔几秒运行一次 ( internals.process_throttle_secs ) 并执行以下操作(这个循环将一次又一次地重复,直到机器人停止):
- 从存储中获取未平仓交易 open trades。
- 计算当前可交易对列表。
- 下载配对列表的 OHLCV 数据,包括所有信息对。这个步骤每个 Candle 仅执行一次,以避免不必要的网络流量。
- 调用 bot_loop_start() 策略回调。
- 分析每个交易对的策略。
- 调用 populate_indicators()
- 调用 populate_entry_trend()
- 调用 populate_exit_trend()
- 检查未结订单的超时。
- 为开仓订单调用 check_entry_timeout() 策略回调。
- 为平仓订单调用 check_exit_timeout() 策略回调。
- 为开仓订单调用 adjust_entry_price() 策略回调。
- 验证现有持仓并最终下达平仓订单。
- 考虑止损 stoploss、投资回报率 ROI和退出信号 exit-signal、 custom_exit() 和 custom_stoploss() 。
- 根据 exit_pricing 配置设置或使用 custom_exit_price() 回调确定退出价格。
- 在放置平仓订单之前,调用 confirm_trade_exit() 策略回调。
- (如果配置启用)调用 adjust_trade_position() ,检查未平仓交易的头寸调整,并在需要时下达额外订单。
- 检查贸易槽 trade-slots 是否仍然可用(是否达到 max_open_trades )。
- 验证尝试进入新头寸的进入信号。
- 根据 entry_pricing 配置设置或使用 custom_entry_price() 回调确定入场价。
- 在保证金 Margin 和期货 Futures 模式下,调用 leverage() 策略回调来确定所需的杠杆 leverage。
- 通过调用 custom_stake_amount() 回调来确定压注大小(stake amount)。
- 在下达挂单之前,调用 confirm_trade_entry() 策略回调。
回测/Hyperopt 执行逻辑
回测或 hyperopt 只做上述逻辑的一部分,因为大部分交易操作都是完全模拟的。
- 为配置的配对列表加载历史数据。
- 调用 bot_start() 一次。
- 计算指标(每对调用一次 populate_indicators() )。
- 计算进入/退出信号(每对调用一次 populate_entry_trend() 和 populate_exit_trend() )。
- 循环每个 candle 模拟进入点和退出点。
- 调用 bot_loop_start() 策略回调。
- 通过 unfilledtimeout 配置或通过 check_entry_timeout() / check_exit_timeout() 策略回调检查订单超时。
- 为开仓订单调用 adjust_entry_price() 策略回调。
- 检查交易进入信号( enter_long / enter_short )。
- 确认交易进入/退出(如果在策略中实施,则调用 confirm_trade_entry() 和 confirm_trade_exit() )。
- 调用 custom_entry_price() (如果在策略中实施)以确定入场价(价格移动到开盘蜡烛内)。
- 在保证金和期货模式下,调用 leverage() 策略回调来确定所需的杠杆。
- 通过调用 custom_stake_amount() 回调来确定赌注大小。
- 检查未平仓交易的头寸调整(如果启用)并调用 adjust_trade_position() 以确定是否请求额外订单。
- 调用 custom_stoploss() 和 custom_exit() 以查找自定义退出点。
- 对于基于退出信号、自定义退出和部分退出的退出:调用 custom_exit_price() 以确定退出价格(价格移动到收盘蜡烛内)。
- Generate backtest report output 生成回测报告输出
实现
- 这部分实现在 freqtrade/worker.py 触发
- 核心逻辑在 freqtrade/freqtradebot.py:process()
- freqtrade 的 rpc 实现只需要 handler 实现一个方法 send_msg(self, msg: RPCSendMsg) ;RPCSendMsg 里面有几种 Msg 类型
- telegram,webhook 等都是一个 handler
配置
- freqtrade 的运行都依赖一个配置文件:config.json (可以用 freqtrade new-config 创建一个默认配置文件)
- json 格式,但是支持注释
- 环境变量必须以 FREQTRADE__ 为前缀才能加载到 freqtrade 配置,比如 FREQTRADE__TELEGRAM__CHAT_ID 会替换配置里面 对应 json value
- 几种配置优先级是 cli 参数 > 环境变量 > 配置文件(最后一个文件优先)> 策略配置
- 完整的参数表参考: https://www.freqtrade.io/en/stable/configuration/ ;下面是一些重要的配置
参数 | 含义 |
---|---|
max_open_trades | 允许机器人进行的未平仓交易数量 |
stake_currency | 用于交易的加密货币 |
stake_amount | 用于每笔交易的加密货币数量;如果设置为 unlimited,将使用动态金额 = 可用金额/ max_open_trades |
tradable_balance_ratio | 允许机器人交易的总账户余额的比率,比如 10 ETH,设置 0.5,机器人最多只会用 5 ETH(单个机器人的情况下) |
timeframe | 要使用的时间范围(例如 1m 、 5m 、 15m 、 30m 、 1h ...)。通常在配置中缺失,并在策略中指定。 |
fiat_display_currency | 用于显示您的利润的法定货币 |
dry_run | 定义机器人是否必须处于试运行或生产模式 |
minimal_roi | 机器人退出交易的 ROI 下限 |
stoploss | 止损比率 |
fee | 回测/试运行期间使用的费用。通常不应该配置,freqtrade 默认使用交易所的默认费用 |
trading_mode | 指定您是要定期交易、利用杠杆交易,还是交易其价格源自匹配的加密货币价格的合约 |
entry_pricing | 入场价格的一些参数,比如 price_side 表示买入或者卖出价使用当前的 卖一价还是买一价,推荐使用 same 或者 other,这个参数影响了交易是否能被快速执行 |
exit_pricing | 平仓价格的一些参数 |
exchange | 交易所的参数,比如 name, key, secret, pair_whitelist (机器人用于交易和在回溯测试期间检查潜在交易的货币对列表) |
pairlists | 决定机器人应该交易的配对列表,是一个列表,可以依次处理;默认是 StaticPairList,表示使用来自 exchange.pair_whitelist 和 exchange.pair_blacklist 的配置;可选的还有 VolumePairList 表示按交易量对货币对进行排序/过滤;ProducerPairList 使用 producer 生成的 配对列表;RemotePairList 表示远程获取AgeFilter 可以按照上市时间过滤;OffsetFilter 可以和 VolumeFilter 配合使用,删除前 X 个 配对;PerformanceFilter 按过去的交易表现对货币对进行排序(不支持回测);PrecisionFilter 过滤不允许设置止损的低价值代币;PriceFilter 按照价格过滤;ShuffleFilter 打乱排序;SpreadFilter 删除要价和出价之间的差异高于指定比率 max_spread_ratio (默认为 0.005 )的对;RangeStabilityFilter 删除 lookback_days 天内最低价和最高价之间的差值低于min_rate_of_change 或高于 max_rate_of_change 的货币对;VolatilityFilter:如果 lookback_days 天的平均波动率低于 min_volatility 或高于 max_volatility ,则此过滤器会删除货币对 |
telegram | telegram 机器人的参数 |
api_server | apiserver 的参数 |
策略
策略定制
- 一个策略需要包括如下内容
- Indicators 指标(特征)
- Entry strategy rules 进场策略规则
- Exit strategy rules 退出策略规则
- Minimal ROI recommended 建议最低投资回报率
- 在 Strategy init 中设置,定义交易在退出前应达到的最小投资回报率 (ROI),与退出信号无关,格式如下
minimal_roi = {
"40": 0.0, // 交易不亏损时退出(40分钟后生效)
"30": 0.01, // 达到 1% 利润时退出(30 分钟后生效)
"20": 0.02, // 达到 2% 利润时退出(20 分钟后生效)
"0": 0.04 // 当利润达到 4% 时退出
}
- Stoploss strongly recommended 强烈推荐设置止损
- stoploss = -0.10 表示亏损 10% 止损
- Freqtrade 使用 pandas 来存储/提供 candlestick (OHLCV) 数据,数据格式如下
> dataframe.head()
date open high low close volume
0 2021-11-09 23:25:00 00:00 67279.67 67321.84 67255.01 67300.97 44.62253
1 2021-11-09 23:30:00 00:00 67300.97 67301.34 67183.03 67187.01 61.38076
2 2021-11-09 23:35:00 00:00 67187.02 67187.02 67031.93 67123.81 113.42728
3 2021-11-09 23:40:00 00:00 67123.80 67222.40 67080.33 67160.48 78.96008
4 2021-11-09 23:45:00 00:00 67160.48 67160.48 66901.26 66943.37 111.39292
- 自定义指标可以通过 populate_indicators 方法实现
- populate_entry_trend, populate_exit_trend, populate_indicators 几个函数可以使用一个 metadata 字典(不应该修改)作为函数参数
- 只添加在 populate_entry_trend() 、 populate_exit_trend() 中使用的指标
- SampleStrategy 里面给出了一些例子,可以用内置的库:ta-libpandas-tatechnical;比如 dataframe['sar'] = ta.SAR(dataframe) 等
- 买入信号规则:在 populate_entry_trend 中设置一个 enter_long 的新列(如果是做空,就是 enter_short),1 表示要操作,也可以设置个 ‘enter_tag’ 表示操作标签
def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
Based on TA indicators, populates the buy signal for the given dataframe
:param dataframe: DataFrame populated with indicators
:param metadata: Additional information, like the currently traded pair
:return: DataFrame with buy column
"""
dataframe.loc[
(
(qtpylib.crossed_above(dataframe['rsi'], 30)) & # Signal: RSI crosses above 30
(dataframe['tema'] <= dataframe['bb_middleband']) & # Guard
(dataframe['tema'] > dataframe['tema'].shift(1)) & # Guard
(dataframe['volume'] > 0) # Make sure Volume is not 0
),
['enter_long', 'enter_tag']] = (1, 'rsi_cross')
return dataframe
- 卖出信号规则:和 买入信号类似
def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
"""
Based on TA indicators, populates the exit signal for the given dataframe
:param dataframe: DataFrame populated with indicators
:param metadata: Additional information, like the currently traded pair
:return: DataFrame with buy column
"""
dataframe.loc[
(
(qtpylib.crossed_above(dataframe['rsi'], 70)) & # Signal: RSI crosses above 70
(dataframe['tema'] > dataframe['bb_middleband']) & # Guard
(dataframe['tema'] < dataframe['tema'].shift(1)) & # Guard
(dataframe['volume'] > 0) # Make sure Volume is not 0
),
['exit_long', 'exit_tag']] = (1, 'rsi_too_high')
return dataframe
- Informative Pairs:可以通过 informative_pairs 函数提供,这些数据会被下载和参考,但是不会被交易(除非也在白名单中)
def informative_pairs(self):
return [("ETH/USDT", "5m"),
("BTC/TUSD", "15m"),
]
- Dataprovider:用来获取额外的数据,一般用 self.dp 来访问 可以获得的数据参考 以下:
- available_pairs - Property with tuples listing cached pairs with their timeframe (pair, timeframe).
- current_whitelist() - Returns a current list of whitelisted pairs. Useful for accessing dynamic whitelists (i.e. VolumePairlist)
- get_pair_dataframe(pair, timeframe) - This is a universal method, which returns either historical data (for backtesting) or cached live data (for the Dry-Run and Live-Run modes).。
- get_analyzed_dataframe(pair, timeframe) - Returns the analyzed dataframe (after calling populate_indicators(), populate_buy(), populate_sell()) and the time of the latest analysis.
- historic_ohlcv(pair, timeframe) - Returns historical data stored on disk.
- market(pair) - Returns market data for the pair: fees, limits, precisions, activity flag, etc. See ccxt documentation for more details on the Market data structure.
- ohlcv(pair, timeframe) - Currently cached candle (OHLCV) data for the pair, returns DataFrame or empty DataFrame.
- orderbook(pair, maximum) - Returns latest orderbook data for the pair, a dict with bids/asks with a total of maximum entries.
- ticker(pair) - Returns current ticker data for the pair. See ccxt documentation for more details on the Ticker data structure.
- runmode - Property containing the current runmode.
- 还可以通过 .send_msg() 来发自定义消息
- Wallet:提供对 wallets 对象的访问。这包含当前余额等信息
- Trade:可以通过查询数据库检索交易历史
策略回调
可用的回调如下
- bot_start():加载策略时调用一次
- bot_loop_start():循环开始,在 dry/live 模式下每次机器人迭代开始时调用一次(大约每 5 秒一次,除非配置不同)或在回测/hyperopt 模式下每根candle调用一次。这可用于执行比如独立于 pair 的计算(适用于所有 pair)、加载外部数据等
- custom_stake_amount():自定义开仓规模,在进入交易之前调用,可以在进行新交易时管理您的持仓规模
- custom_exit():自定义退出信号,每轮循环的开仓操作时被调用,直到交易结束
- custom_stoploss():自定义止损,每轮循环的开仓操作时被调用,直到交易结束
- custom_entry_price() and custom_exit_price():一般使用这个文档来决定买入和卖出价格,但是也可以用这两个函数来自定义
- check_entry_timeout() and check_exit_timeout():为每个未结订单调用,直到该订单被执行或取消;返回 True (取消订单)或 False (保持订单有效)
- confirm_trade_entry()and confirm_trade_exit():在机器人交易之前被调用,可以用于在最后一秒取消买入订单(比如价格不符合预期)
- adjust_trade_position():该策略预计会在 min_stake 和 max_stake 之间返回一个 stake_amount(以 stake 货币计),如果以及何时应该发出额外的买单(头寸增加);头寸调整将始终应用于交易方向,因此正值将始终增加您的头寸(负值将减少您的头寸)
- adjust_entry_price():策略开发人员可以使用 adjust_entry_price 回调在新蜡烛到达时刷新/替换限价订单
- leverage():在允许杠杆的市场中交易时,此方法返回所需的杠杆(默认为 1 -> 无杠杆)
止损
- 可以使用交易所止损(需要对应交易所支持,比如 Binance )或者 非交易所止损
- todo 这里面还有很多细节
插件
Pairlists
参考上面的配置一节
Protections
保护措施将通过暂时停止一对或所有货币对的交易来保护您的策略免受意外事件和市场条件的影响。所有保护结束时间都舍入到下一根蜡烛,以避免突然、意外的蜡烛内购买
可用的保护
- StoplossGuard 如果在某个时间窗口内发生一定数量的止损,则停止交易。
- MaxDrawdown 如果达到最大回撤则停止交易。
- LowProfitPairs 锁定利润低的交易对
- CooldownPeriod 不要在卖出交易后立即进入交易
控制机器人
可以通过 telegram,rest api & RreqUI,以及 webhook 来控制机器人
数据下载
- freqtrade download-data 命令可以下载数据,如果没有指定其他参数,freqtrade 将下载最近 30 天 "1m" 和 "5m" 时间帧的数据。 Exchange 和 pairs 将来自 config.json 中的配置(也可以用 pairs.json 指定)
- OHLCV 数据存储为 json 数据,而交易数据存储为 jsongz 数据,实际上推荐 feather 或者 parquet 格式
- 重要的参数
- 要仅下载 10 天的历史蜡烛 (OHLCV) 数据,请使用 --days 10 (默认为 30 天)
- 要从固定起点下载历史蜡烛图 (OHLCV) 数据,请使用 --timerange 20200101- - 这将下载从 2020 年 1 月 1 日 st 开始的所有数据。
- 使用 --timeframes 指定下载历史蜡烛 (OHLCV) 数据的时间范围。默认为 --timeframes 1m 5m ,将下载 1 分钟和 5 分钟的数据。
- 使用 --prepend 下载之前的数据
回测
https://www.freqtrade.io/en/stable/backtesting/
Hyperopt:超参数优化
- 通过找到最佳参数来调整策略,这个过程称为超参数优化。使用 scikit-optimize 包中包含的算法来完成此操作
- 在类级别定义想要 hyperopt 优化的参数
- 在 populate_entry_trend()/populate_exit_trend() 中 - 使用定义的参数值而不是原始常量
- 可以快速优化空间 roi 、 stoploss 和 trailing 而无需更改策略中的任何内容。
- 优化之后会生成 .json
freqtrade hyperopt --hyperopt-loss SharpeHyperOptLossDaily --spaces roi stoploss trailing --strategy MyWorkingStrategy --config config.json -e 100
FreqAI
简介
- FreqAI 不能与动态 VolumePairlists 结合使用
配置
- 设置配置文件如下图
"freqai": {
"enabled": true,
"purge_old_models": 2,
"train_period_days": 30,
"backtest_period_days": 7,
"identifier" : "unique-id",
"feature_parameters" : {
"include_timeframes": ["5m","15m","4h"],
"include_corr_pairlist": [
"ETH/USD",
"LINK/USD",
"BNB/USD"
],
"label_period_candles": 24,
"include_shifted_candles": 2,
"indicator_periods_candles": [10, 20]
},
"data_split_parameters" : {
"test_size": 0.25
}
}
- FreqAI 对 dataframe 的 key 有一些假设:
- df['&*']:在 set_freqai_targets() 中以 & 开头的任何数据帧列都被视为 FreqAI 中的训练目标(标签)(通常遵循命名约定 &-s* )。例如,要预测未来 40 根 candle 的收盘价,您可以在配置中设置 df['&-s_close'] = df['close'].shift(-self.freqai_info["feature_parameters"]["label_period_candles"]);同时设置 "label_period_candles": 40 。 FreqAI 会做出预测,并在 populate_entry/exit_trend() 中可以以相同的 key:df['&-s_close'] 的使用预测值。
- df['&*_std/mean'] : 定义标签的标准偏差和平均值
- df['do_predict']:异常值数据点的指示。返回值是介于 -2 和 2 之间的整数,这使您可以知道预测是否可信。 do_predict==1 表示预测可信
- df['DI_values']: 相异指数 (DI) 值是 FreqAI 对预测的置信度水平的代理。较低的 DI 意味着预测接近训练数据,即较高的预测置信度
- df['%*']: 在 feature_engineering_*() 中以 % 开头的任何数据帧列都被视为训练特征。例如,您可以通过设置 df['%-rsi'] 将 RSI 包含在训练特征集中
- 构建策略需要包含如下代码
# # user should define the maximum startup candle count (the largest number of candles passed to any single indicator)
startup_candle_count: int = 20
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
# the model will return all labels created by user in `set_freqai_labels()`
# (& appended targets), an indication of whether or not the prediction should be accepted,
# the target mean/std values for each of the labels created by user in `feature_engineering_*` for each training period.
dataframe = self.freqai.start(dataframe, metadata, self)
return dataframe
def feature_engineering_expand_all(self, dataframe, period, **kwargs):
"""
*Only functional with FreqAI enabled strategies* This function will automatically expand the defined features on the config defined
`indicator_periods_candles`, `include_timeframes`, `include_shifted_candles`, and
`include_corr_pairs`. In other words, a single feature defined in this function
will automatically expand to a total of `indicator_periods_candles` * `include_timeframes` * `include_shifted_candles` *
`include_corr_pairs` numbers of features added to the model.
All features must be prepended with `%` to be recognized by FreqAI internals.
:param df: strategy dataframe which will receive the features
:param period: period of the indicator - usage example:
dataframe["%-ema-period"] = ta.EMA(dataframe, timeperiod=period)
"""
dataframe["%-rsi-period"] = ta.RSI(dataframe, timeperiod=period)
dataframe["%-mfi-period"] = ta.MFI(dataframe, timeperiod=period)
dataframe["%-adx-period"] = ta.ADX(dataframe, timeperiod=period)
dataframe["%-sma-period"] = ta.SMA(dataframe, timeperiod=period)
dataframe["%-ema-period"] = ta.EMA(dataframe, timeperiod=period)
return dataframe
def feature_engineering_expand_basic(self, dataframe, **kwargs):
"""
*Only functional with FreqAI enabled strategies*
This function will automatically expand the defined features on the config defined `include_timeframes`, `include_shifted_candles`, and `include_corr_pairs`.
In other words, a single feature defined in this function will automatically expand to a total of
`include_timeframes` * `include_shifted_candles` * `include_corr_pairs` numbers of features added to the model.
Features defined here will *not* be automatically duplicated on user defined
`indicator_periods_candles`
All features must be prepended with `%` to be recognized by FreqAI internals.
:param df: strategy dataframe which will receive the features
dataframe["%-pct-change"] = dataframe["close"].pct_change()
dataframe["%-ema-200"] = ta.EMA(dataframe, timeperiod=200)
"""
dataframe["%-pct-change"] = dataframe["close"].pct_change()
dataframe["%-raw_volume"] = dataframe["volume"]
dataframe["%-raw_price"] = dataframe["close"]
return dataframe
def feature_engineering_standard(self, dataframe, **kwargs):
"""
*Only functional with FreqAI enabled strategies*
This optional function will be called once with the dataframe of the base timeframe.
This is the final function to be called, which means that the dataframe entering this
function will contain all the features and columns created by all other
freqai_feature_engineering_* functions.
This function is a good place to do custom exotic feature extractions (e.g. tsfresh).
This function is a good place for any feature that should not be auto-expanded upon
(e.g. day of the week).
All features must be prepended with `%` to be recognized by FreqAI internals.
:param df: strategy dataframe which will receive the features
usage example: dataframe["%-day_of_week"] = (dataframe["date"].dt.dayofweek 1) / 7
"""
dataframe["%-day_of_week"] = (dataframe["date"].dt.dayofweek 1) / 7
dataframe["%-hour_of_day"] = (dataframe["date"].dt.hour 1) / 25
return dataframe
def set_freqai_targets(self, dataframe, **kwargs):
"""
*Only functional with FreqAI enabled strategies*
Required function to set the targets for the model.
All targets must be prepended with `&` to be recognized by the FreqAI internals.
:param df: strategy dataframe which will receive the targets
usage example: dataframe["&-target"] = dataframe["close"].shift(-1) / dataframe["close"]
"""
dataframe["&-s_close"] = (
dataframe["close"]
.shift(-self.freqai_info["feature_parameters"]["label_period_candles"])
.rolling(self.freqai_info["feature_parameters"]["label_period_candles"])
.mean()
/ dataframe["close"]
- 1
)
- FreqAI 策略中的 startup_candle_count 需要按照与标准 Freqtrade 策略相同的方式设置(详见此处)。 Freqtrade 使用此值来确保在调用 dataprovider 时提供足够数量的数据,以避免在第一次训练开始时出现任何 NaN
- Creating a dynamic target threshold: todo
- 使用不同的预测模型: 可以通过标志 --freqaimodel 除了 FreqAI 中已有的模型外,还可以使用 IFreqaiModel 类自定义和创建自己的预测模型。可以继承 fit() 、 train() 和 predict() 来自定义训练过程的各个步骤
- 模型目标:回归模型:df['&s-close_price'] = df['close'].shift(-100)
- 分类器模型:df['&s-up_or_down'] = np.where( df["close"].shift(-100) > df["close"], 'up', 'down')
参数
- 配置: https://www.freqtrade.io/en/stable/freqai-parameter-table/ 重要的配置如下
通用配置参数
参数 | 描述 |
---|---|
freqai | 包含用于控制 FreqAI 的所有参数的父字典。 |
train_period_days | 用于训练数据的天数(滑动窗口的宽度)。 |
backtest_period_days | 回测重新训练的天数;比如 --timerange设置为20210501-20210701,train_period_days 设置为30,backtest_period_days 设置为 7,那么会用 20210401-20210430 (不准确,其实还要提前一个 startup_candle_count 的数据)的数据来训练,在20210501-20210701回测,并且回测过程中,每7天重新训练一个模型,--timerange 结束时将训练8个单独的模型,因为 timerange 里面有 8周 |
identifier | 当前模型的唯一 ID。如果模型保存到磁盘, identifier 允许重新加载特定的预训练模型/数据。 |
live_retrain_hours | 重新培训的频率。默认值: 0 (模型尽可能频繁地重新训练)。 |
expiration_hours | 模型过期时间。默认值: 0 (模型永不过期)。 |
purge_old_models | 保留在磁盘上的模型数量(与回测无关)。默认值为 2,这意味着空运行/实时运行将在磁盘上保留最新的 2 个模型。设置为 0 保留所有模型。 |
fit_live_predictions_candles | 从预测数据而不是训练数据集计算目标(标签)统计数据的历史蜡烛数 |
continual_learning | 使用最近训练模型的最终状态作为新模型的起点,允许增量学习。 |
write_metrics_to_disk | 在 json 文件中收集训练时间、推理时间和 cpu 使用情况。 |
data_kitchen_thread_count | 指定要用于数据处理(离群值方法、规范化等)的线程数 |
特征参数
Parameter | Description |
---|---|
feature_parameters | 包含用于设计特征集的参数的字典。此处显示了详细信息和示例。 |
include_timeframes | 为 feature_engineering_expand_*() 中的所有指标创建的时间范围列表。该列表作为特征添加到基本指标数据集中。 |
include_corr_pairlist | FreqAI将列出一组相关的加密货币,并将它们作为附加特征添加到所有配对白名单中的加密货币中。在特征工程(feature engineering)过程中,feature_engineering_expand_*()中设置的所有指标都将针对每个相关加密货币进行创建。这些相关加密货币的特征将被添加到基本指标数据集中。 |
label_period_candles | 为未来创建标签的蜡烛图数。 |
include_shifted_candles | 将之前蜡烛图的特征添加到后续的蜡烛图中,旨在增加历史信息。如果使用,FreqAI将复制并移动包括偏移的蜡烛图中的所有特征,以便这些信息可用于后续的蜡烛图。 |
weight_factor | 根据新近度的权重训练数据点 |
indicator_periods_candles | 计算指标的时间段。指标被添加到基础指标数据集中。 |
principal_component_analysis | 使用主成分分析自动降低数据集的维度。 |
plot_feature_importances | 为每个模型创建一个特征重要性图 |
DI_threshold | 当设置为 > 0 时,激活使用差异指数进行离群值检测。 |
use_SVM_to_remove_outliers | 训练支持向量机以检测和删除训练数据集以及传入数据点中的异常值。 |
svm_params | Sklearn 的 SGDOneClassSVM() 中可用的所有参数。 |
use_DBSCAN_to_remove_outliers | 使用 DBSCAN 算法对数据进行聚类,以从训练和预测数据中识别和删除异常值。 |
inlier_metric_window | 如果设置,FreqAI 会在训练特征集中添加一个 inlier_metric ,并将回溯设置为 inlier_metric_window ,即与当前蜡烛图进行比较的先前时间点的数量。 |
noise_standard_deviation | 如果设置了该选项,FreqAI会向训练特征添加噪声,以防止过拟合。FreqAI从高斯分布中生成随机偏差,其标准差为noise_standard_deviation,并将其添加到所有数据点中。noise_standard_deviation应与归一化空间保持相对一致,即在-1和1之间。换句话说,由于FreqAI中的数据始终归一化为在-1和1之间,noise_standard_deviation:0.05会导致32%的数据随机增加/减少超过2.5%(即数据落在第一标准差内的百分比)。 |
outlier_protection_percentage | 启用以防止离群值检测方法丢弃过多数据。如果超过 outlier_protection_percentage % 的点被 SVM 或 DBSCAN 检测为异常值,FreqAI 将记录一条警告消息并忽略异常值检测,即原始数据集将保持不变。如果触发异常值保护,则不会根据训练数据集进行任何预测。 |
reverse_train_test_order | 拆分要素数据集(见下文)并使用最新的数据拆分对数据的历史拆分进行训练和测试。这允许模型训练到最新的数据点,同时避免过度拟合。但是,在使用它之前,您应该仔细了解该参数的非正统性质。 |
shuffle_after_split | 将数据拆分为训练集和测试集,然后分别打乱这两个集。 |
buffer_train_data_candles | 在填充指标之后,将从训练数据的开头和结尾剪切buffer_train_data_candles。主要示例用途是在预测极大值和极小值时,argrelextrema函数无法知道时间范围的边缘处的最大值/最小值。为了提高模型精度,最好在完整的时间范围上计算argrelextrema,然后使用该函数通过核函数截断边缘(缓冲区)。在另一种情况下,如果目标设置为偏移价格变动,则此缓冲区是不必要的,因为时间范围末尾的偏移蜡烛图将为NaN,并且FreqAI将自动将它们从训练数据集中剪切掉。 |
数据拆分参数
Parameter | Description |
---|---|
data_split_parameters | 包括可从 scikit-learn test_train_split() 获得的任何其他参数 |
test_size | 应该用于测试而不是训练的数据比例。 |
shuffle | 在训练期间打乱训练数据点。通常,为了不删除时间序列预测中数据的时间顺序,将其设置为 False 。 |
模型训练参数
Parameter | Description |
---|---|
model_training_parameters | 一个灵活的字典,包括所选模型库可用的所有参数。例如,如果您使用 LightGBMRegressor ,则该词典可以包含 LightGBMRegressor 可用的任何参数。 |
n_estimators | 适合模型训练的提升树的数量。 |
learning_rate | 学习率。 |
n_jobs, thread_count, task_typen_jobs 、 thread_count 、 task_type | 设置并行处理的线程数和 task_type ( gpu 或 cpu )。不同的模型库使用不同的参数名称。 |
强化学习参数
todo
Parameter | Description |
---|---|
rl_config | A dictionary containing the control parameters for a Reinforcement Learning model.包含强化学习模型控制参数的字典。Datatype: Dictionary. 数据类型:字典。 |
train_cycles | Training time steps will be set based on the `train_cycles * number of training data points.训练时间步长将根据`train_cycles * 训练数据点数设置。Datatype: Integer. 数据类型:整数。 |
cpu_count | Number of processors to dedicate to the Reinforcement Learning training process.专用于强化学习训练过程的处理器数量。Datatype: int. |
max_trade_duration_candles | Guides the agent training to keep trades below desired length. Example usage shown in prediction_models/ReinforcementLearner.py within the customizable calculate_reward() function.指导代理培训以将交易保持在所需长度以下。可自定义的 calculate_reward() 函数中 prediction_models/ReinforcementLearner.py 中显示的示例用法。Datatype: int. |
model_type | Model string from stable_baselines3 or SBcontrib. Available strings include: 'TRPO', 'ARS', 'RecurrentPPO', 'MaskablePPO', 'PPO', 'A2C', 'DQN'. User should ensure that model_training_parameters match those available to the corresponding stable_baselines3 model by visiting their documentaiton. PPO doc (external website)来自 stable_baselines3 或 SBcontrib 的模型字符串。可用的字符串包括: 'TRPO', 'ARS', 'RecurrentPPO', 'MaskablePPO', 'PPO', 'A2C', 'DQN' 。用户应通过访问其文档确保 model_training_parameters 与相应的 stable_baselines3 模型可用的匹配。 PPO 文档(外部网站)Datatype: string. |
policy_type | One of the available policy types from stable_baselines3stable_baselines3 中可用的策略类型之一Datatype: string. |
max_training_drawdown_pct | The maximum drawdown that the agent is allowed to experience during training.代理在训练期间被允许经历的最大回撤。Datatype: float.Default: 0.8 |
cpu_count | Number of threads/cpus to dedicate to the Reinforcement Learning training process (depending on if ReinforcementLearning_multiproc is selected or not). Recommended to leave this untouched, by default, this value is set to the total number of physical cores minus 1.专用于强化学习训练过程的线程数/cpus(取决于是否选择了 ReinforcementLearning_multiproc )。建议保持不变,默认情况下,此值设置为物理内核总数减 1。Datatype: int. |
model_reward_parameters | Parameters used inside the customizable calculate_reward() function in ReinforcementLearner.pyReinforcementLearner.py 中可自定义的 calculate_reward() 函数中使用的参数Datatype: int. |
add_state_info | Tell FreqAI to include state information in the feature set for training and inferencing. The current state variables include trade duration, current profit, trade position. This is only available in dry/live runs, and is automatically switched to false for backtesting.告诉 FreqAI 在用于训练和推理的功能集中包含状态信息。当前状态变量包括交易持续时间、当前利润、交易头寸。这仅在试运行/实时运行中可用,并且会自动切换为 false 以进行回溯测试。Datatype: bool.Default: False. 默认值: False 。 |
net_arch | Network architecture which is well described in stable_baselines3 doc. In summary: [, dict(vf=[], pi=[])]. By default this is set to [128, 128], which defines 2 shared hidden layers with 128 units each.stable_baselines3 文档中详细描述的网络架构。总之: [rs>, dict(vf=[n-shared value network layers>], pi=[])] 。默认情况下,它设置为 [128, 128] ,它定义了 2 个共享隐藏层,每个隐藏层有 128 个单元。 |
randomize_starting_position | Randomize the starting point of each episode to avoid overfitting.随机化每一集的起点以避免过度拟合。Datatype: bool.Default: False. 默认值: False 。 |
drop_ohlc_from_features | Do not include the normalized ohlc data in the feature set passed to the agent during training (ohlc will still be used for driving the environment in all cases)不要在训练期间传递给代理的特征集中包含归一化的 ohlc 数据(在所有情况下 ohlc 仍将用于驱动环境)Datatype: Boolean. 数据类型:布尔值。Default: False 默认值: False |
附加参数
freqai.keras | 如果所选模型使用 Keras(典型的基于 TensorFlow 的预测模型),则需要激活此标志,以便模型保存/加载遵循 Keras 标准。 |
---|---|
freqai.conv_width | 卷积神经网络输入张量的宽度。通过将历史数据点作为张量的第二个维度输入,这取代了移动蜡烛(include_shifted_candles)的需要。从技术上讲,该参数也可以用于回归器,但它只会增加计算开销,而不会改变模型的训练/预测。 |
freqai.reduce_df_footprint | 将所有数字列重新转换为 float32/int32,目的是减少内存/磁盘使用并减少训练/推理时间。该参数在 Freqtrade 配置文件的主层设置(不在 FreqAI 内部)。 |
特征工程
- In total, the number of features the user of the presented example strat has created is: length of include_timeframes * no. features in feature_engineering_expand_*() * length of include_corr_pairlist * no. include_shifted_candles * length of indicator_periods_candles
运行
- 实时部署:freqai 支持自动下载数据,重新训练,以尽量使所有模型保持最新状态,模型可以设置保存个数,崩溃时可以自动加载
- 回测时需要提前下载数据,不支持自动下载
- 可以设置 "continual_learning": true 来选择采用增量学习
- 可以使用 Hyperopt 方式进行参数搜索/优化
- 有些模型训练可以使用 Tensorboard 跟踪
强化学习
开发
做空/杠杆
- 默认的 trade_mode 为 spot,表示现货交易,只能做多,不能使用杠杆;margin 模式当前不可用;futures 模式即合约模式
- 合约模式下还必须设置一种保证金模式,目前只支持 "isolated" 表示逐仓保证金模式
- 期货的命名风格为 base/quote:settle (例如 ETH/USDT:USDT)
- 杠杆通过 Leverage Callback 设置,即在 Strategy 内实现函数:
def leverage(self, pair: str, current_time: datetime, current_rate: float, proposed_leverage: float, max_leverage: float, entry_tag: Optional[str], side: str, **kwargs) -> float
- 杠杆 相关的重要参数 liquidation_buffer 指定在清算价格和止损之间放置多大的安全网以防止头寸达到清算价格的比率
实用程序子命令
命令 | 作用 | 说明 |
---|---|---|
freqtrade create-userdir | 创建用户目录 | 创建目录结构来保存您的 freqtrade 文件 |
freqtrade new-config | 创建新配置 | 交互的方式创建一个新的配置文件 |
freqtrade new-strategy | 创建新策略 | 从类似于 SampleStrategy 的模板创建新策略 |
freqtrade list-strategies | 列出策略 | 查看一个特定目录中的所有策略 |
freqtrade list-exchanges | 列出交易所 | 查看机器人可用的交易所 |
freqtrade list-timeframes | 列出Timeframes | 查看交易所可用的时间范围列表 |
freqtrade list-marketsfreqtrade list-pairs | 列出货币对/列出市场 | 查看交易所可用的货币对/市场 |
freqtrade test-pairlist | 测试货币对列表 | 可用于生成要在回测/hyperopt 期间使用的静态配对列表 |
freqtrade webserver | 网络服务器模式 | Freqtrade 将启动网络服务器并允许 FreqUI 启动和控制回测过程。这样做的好处是不会在回溯测试运行之间重新加载数据(只要时间范围和时间范围保持相同)。 FreqUI 还将显示回测结果 |
freqtrade backtesting-show | 显示之前的回测结果 | 允许您显示以前的回测结果 |
freqtrade backtesting-analysis | 详细的回测分析 | https://www.freqtrade.io/en/stable/advanced-backtesting/#analyze-the-buyentry-and-sellexit-tags |
freqtrade hyperopt-list | 列出 Hyperopt 结果 | 可以列出 Hyperopt 模块先前使用 hyperopt-list 子命令评估的超级优化时期 |
freqtrade hyperopt-show | 显示 Hyperopt 结果的详细信息 | 显示之前由 Hyperopt 模块评估的任何超级优化时期的详细信息 |
freqtrade show-trades | 显示交易 | 将选定(或所有)交易从数据库打印到屏幕 |
图表
todo
交易所特定备注
注意币安的部分内容,如最好屏蔽 BNB 交易,交易期货(合约)需要额外的设置
数据分析
高级话题
SQL Cheet-sheet
指标
指标 | 含义 | 买入信号 | 卖出信号 |
---|---|---|---|
volume | 交易量 | volume > 一段时间 volume 均值 | |
adx | ADX是平均趋向指数(Average Directional Index)的缩写,是一种技术分析指标,用于衡量股票或其他资产的趋势强度和方向性。ADX指标的计算方法基于其他两个指标: DI和-DI。 DI和-DI分别代表上升趋势和下降趋势的方向指标,它们的计算方法基于股票或其他资产的最高价、最低价和收盘价等数据。ADX指标则是基于 DI和-DI之间的差异来计算,它可以在0到100之间取值,数值越高表示趋势越强。 | adx > 50 | |
slowadx | Slow ADX是一种基于ADX指标的技术分析指标,它通过对ADX指标的平滑处理,来减少ADX指标的波动性和噪声,以更准确地显示股票或其他资产的趋势强度和方向性。 | slowadx > 26 | slowadx < 25 |
ccicci_34cci_170 | CCI(Commodity Channel Index)指标是一种技术分析指标,用于帮助交易者识别价格趋势的反转点和过度买卖的情况。CCI 指标基于统计学原理,通过计算价格与其移动平均线之间的差异来度量价格的波动性。CCI 指标的计算公式为:CCI = (Typical Price - N-period SMA of TP) / (0.015 x Mean Deviation),其中 TP 是典型价格(通常是收盘价、最高价和最低价的平均值),N 是计算周期,SMA 是简单移动平均线,Mean Deviation 是典型价格与其移动平均线之间差异的平均值。(CCI_34 即表示 N = 34)CCI 指标的取值范围通常是 -100 到 100,当 CCI 指标值高于 100 时,被认为是超买状态,当 CCI 指标值低于 -100 时,被认为是超卖状态。当 CCI 指标值高于 100 或低于 -100 时,通常被视为价格趋势的反转点。 | cci < -100 | cci > 100 |
ema20/ema50/ema100 | 指数移动平均线(Exponential Moving Average,EMA)。与SMA不同,EMA对最近的价格赋予更大的权重,因此对价格的变化更为敏感。 | crossed_above(ema20, ema50)crossed_above(ema5, ema10)ha_close > ema20ha_open < ha_close | crossed_above(ema50, ema100)ha_close > ema20ha_open > ha_closeclose > ema5 |
sma | SMA是简单移动平均线(Simple Moving Average)的缩写,是一种常用的技术分析指标,用于平滑股票或其他金融资产价格的波动,以便更好地观察价格趋势。简单移动平均线的计算方法非常简单,只需要将一段时间内的收盘价相加,然后除以这段时间的天数即可 | close < sma | |
heikinashi | Heikin-Ashi(平均趋势烛图)是一种技术分析工具,用于平滑价格波动并识别趋势。相比传统的日本蜡烛图,Heikin-Ashi 更加平滑,可以减少价格波动的噪声,从而更清晰地显示趋势的方向和强度。Heikin-Ashi 指标的计算方法比较复杂,但是可以通过以下步骤进行简单的理解:1. 计算每个烛台的平均价格(Open Close High Low)/4,这被称为 Heikin-Ashi 烛台的实体。2. 计算每个 Heikin-Ashi 烛台的开盘价和收盘价。第一个 Heikin-Ashi 烛台的开盘价等于第一个实际烛台的开盘价,而收盘价等于实体价格。后续的 Heikin-Ashi 烛台的开盘价等于前一个 Heikin-Ashi 烛台的平均价,收盘价等于实体价格。3. 计算每个 Heikin-Ashi 烛台的上影线和下影线。上影线等于高价减去实体价格,下影线等于实体价格减去低价。Heikin-Ashi 烛台的平滑效果可以帮助交易者更准确地确定趋势的方向和强度,并且可以提供更好的入场和出场时机。例如,在上升趋势中,Heikin-Ashi 烛台的实体会变成白色,上影线较长,下影线较短,这表示市场处于强劲的上涨趋势中,交易者可以考虑买入。而在下降趋势中,Heikin-Ashi 烛台的实体会变成黑色,上影线较短,下影线较长,这表示市场处于强劲的下跌趋势中,交易者可以考虑卖出。 | ||
rsi | RSI 的计算方式基于股票价格的平均涨跌幅度,通常采用的计算周期为 14 天。具体来说,RSI 通过计算一段时间内股票涨幅和跌幅的平均值,进而计算出“相对强度”(Relative Strength),并将其转化为区间为 0 到 100 的数值。当 RSI 值大于 70 时,被认为是超买信号,意味着股票价格可能已经过高,可能会发生价格下跌的趋势;而当 RSI 值小于 30 时,则被认为是超卖信号,意味着股票价格可能已经过低,可能会发生价格上涨的趋势。 | rsi < 30 | rsi > 70 |
fisher_rsi | Fisher RSI 的计算方式基于 RSI 的计算结果,通过对 RSI 进行平滑处理和变换得到。具体来说,Fisher RSI 先将 RSI 转化为区间在 -1 到 1 之间的数值,然后再通过对这些数值进行平滑处理和变换,得到一个新的指标。Fisher RSI 的值在区间 -1 到 1 之间,当 Fisher RSI 值大于 0 时,被认为是超买信号,意味着股票价格可能已经过高,可能会发生价格下跌的趋势;而当 Fisher RSI 值小于 0 时,则被认为是超卖信号,意味着股票价格可能已经过低,可能会发生价格上涨的趋势。与传统的 RSI 指标相比,Fisher RSI 更加平滑,能够更准确地反映股票价格的趋势和超买超卖的情况 | fisher_rsi > 0.3 | |
slowkfastkslowdfastd | 随机指标(Stochastic Oscillator)是一种用于衡量股票或其他金融资产在一段时间内的价格动量和趋势的技术分析工具。随机指标的计算方法基于股价在一定时间内的最高价和最低价,以及最近一天(或最近一周)的收盘价。随机指标的数值范围在 0 到 100 之间,一般将 80 和 20 作为超买和超卖的阈值。当随机指标的数值超过 80 时,表示股票价格可能已经过热,可能会出现调整或下跌的趋势;当随机指标的数值低于 20 时,表示股票价格可能已经过度抛售,可能会出现反弹或上涨的趋势。SlowK、FastK、SlowD和FastD都是随机指标(Stochastic Oscillator)的指标,它们是随机指标中比较常用的四个指标。其中,FastK和SlowK都指的是随机指标中的%K线,FastK是%K线的原始计算值,而SlowK是对FastK进行平滑后的值。一般情况下,FastK使用的计算周期为14天,而SlowK通常使用3天的平滑周期。SlowD和FastD则是随机指标中的%D线,SlowD是对SlowK进行平滑后的值,而FastD是对FastK进行平滑后的值。一般情况下,SlowD使用的平滑周期为3天,而FastD通常使用1天的平滑周期。 | fastd > fastk & fastd > 0slowk < 20(这里 previous 指前一天)fastk-previous < 20fastd-previous < 20slowfastk-previous < 30slowfastd-previous < 30 | fastk > 70 | fastd > 70fastk-previous < fastd-previous |
bollinger bands(bb_lowerband, bb_uppterband) | Bollinger Bands(布林带)是一种技术分析指标,用于衡量股票价格的波动性和价格趋势,由约翰·布林格(John Bollinger)于1980年提出。布林带由三条线组成,分别为中轨线、上轨线和下轨线。中轨线是股价的移动平均线,通常为20日简单移动平均线;上轨线和下轨线则是以中轨线为基础,上下偏离标准差倍数的带状线。布林带的上下轨线分别代表股价的高低价格区间,而中轨线则可视为股价的均价线。当股价向上穿过上轨线时,被认为是超买信号,意味着股价可能已经过高,可能会发生价格下跌的趋势;相反,当股价向下穿过下轨线时,则被认为是超卖信号,意味着股价可能已经过低,可能会发生价格上涨的趋势。同时,当股价的波动范围较小时,布林带的上下轨线会逐渐收缩,而当股价的波动范围较大时,布林带的上下轨线会逐渐扩展。因此,布林带的宽窄程度也可以反映出股票价格的波动性和价格趋势。 | bb_lowerband > close | close > bb_middleband |
keltner_channel_wband | Keltner通道(Keltner Channel)是一种技术分析工具,它由3条线组成:中线、上限线和下限线。Keltner通道的上下限线是根据平均真实范围(ATR)计算的,而中线则是简单移动平均线(SMA)。Keltner通道可以用于确定价格的趋势和超买/超卖水平。Keltner通道的带宽线(wband)是一种基于Keltner通道的技术指标,它显示了价格相对于Keltner通道的位置。Keltner通道带宽线的值范围为0到1之间。当带宽线的值接近0时,价格接近Keltner通道的下限线,这通常被视为超卖信号。当带宽线的值接近1时,价格接近Keltner通道的上限线,这通常被视为超买信号。 | ||
donchian_channel_pband | Donchian通道(Donchian Channel)是一种用于技术分析的工具,它由两条线组成:上限线和下限线。Donchian通道的上下限线是基于一段时间内价格的最高价和最低价计算的。Donchian通道可以用于确定价格的趋势和超买/超卖水平。Donchian通道带宽线的值范围为0到1之间。当带宽线的值接近0时,价格接近Donchian通道的下限线,这通常被视为超卖信号。当带宽线的值接近1时,价格接近Donchian通道的上限线,这通常被视为超买信号。 | ||
sar | SAR,全称为Stop and Reverse,是一种技术分析指标,主要用于判断股票价格走势的短期反转点和超买超卖情况。 SAR 指标的计算方式基于股票价格和时间的变化趋势,通过对价格和时间的分析, 来确定股票价格的上涨和下跌趋势,并给出买入和卖出的信号。 SAR 指标的计算方法比较复杂,它使用了一系列的计算公式和参数,其中最关键的参数是加速因子 (acceleration factor)。加速因子是一个逐步增大的数值,它能够在价格趋势逐渐加速的时候, 提高 SAR 点的追随速度,从而更好地反映股票价格的变化趋势。 在 SAR 指标中,如果当前价格高于前一天的最高价,则 SAR 点会向上移动,反之则会向下移动。 当价格下穿 SAR 点时,意味着价格趋势已经发生反转,应该及时卖出; 而当价格上穿 SAR 点时,则意味着价格趋势还将继续向上,应该继续持有或买入股票。 | sar > close | |
cdlhhammer | CDLHAMMER是一种由日本蜡烛图技术分析中的一个形态,表示市场可能出现反转的信号。 CDLHAMMER形态通常出现在下跌趋势中,其特征是实体较小、上影线较长、下影线较短, 看起来像是一个锤子的形状。这种形态表明市场在下跌过程中遭遇了卖盘压力, 但是买盘在收盘前出现,推动股价上涨,形成了较长的上影线,并且收盘价接近最高价, 表明买盘占据了上风。 CDLHAMMER形态的出现,暗示着市场可能会反转,进入上涨趋势。 | CDLHAMMER == 100 | |
mfi | MFI是Money Flow Index(资金流动指标)的缩写,是一种技术分析指标, 用于衡量资金流入和流出的程度,以预测股票或其他资产的价格趋势。 MFI指标结合了价格和交易量的信息,通过计算特定时间段内的资金流入和流出来衡量市场的买卖力量。 指标的计算方式是将典型价格(Typical Price)和成交量相乘, 然后根据买卖方向和成交量的大小将其分为正向资金流和负向资金流。 最后,通过将正向资金流与负向资金流相除得到MFI值。 MFI指标的取值范围在0到100之间,通常认为,当MFI指标超过80时,市场被认为是超买状态, 可能会发生价格下跌的趋势;当MFI指标低于20时,市场被认为是超卖状态, 可能会发生价格上涨的趋势 | ||
macd | MACD指标(Moving Average Convergence Divergence)是一种技术分析指标,用于测量价格动量和趋势的变化,常用于股票、期货、外汇等市场的分析。MACD指标由两条线和一条柱状图组成,分别是快速线(MACD线)、慢速线(信号线)和柱状图(MACD柱)。它的计算方法是通过计算两个不同时间段的指数移动平均线(EMA)之间的差异来确定价格动量和趋势的变化。具体来说,MACD指标的计算方法如下:1. 计算12天期间和26天期间的指数移动平均线(EMA12和EMA26)。2. 计算MACD线,即EMA12和EMA26之间的差异,通常用红绿两色的线表示,公式为MACD线=EMA12-EMA26。3. 计算信号线,通常是MACD线的9天期间的指数移动平均线(EMA9),用于平滑MACD线的波动,公式为信号线=EMA(MACD线,9)。4. 计算MACD柱,即MACD线与信号线之间的差异,通常用柱状图表示,公式为MACD柱=MACD线-信号线。MACD指标的取值通常为正数和负数。当MACD线向上穿过信号线时,MACD柱变成正数,这被认为是价格进入了强势区间,而当MACD线向下穿过信号线时,MACD柱变成负数,则被认为是价格进入了弱势区间。此外,MACD指标还可以用于识别价格的背离现象,即价格趋势与MACD指标趋势不一致的情况,这通常被认为是价格发生反转的信号。 | macd > macd_signal | macd < 0macd < macd_signal |
macdsignal | 就是 macd 信号线 | ||
minus_di | Minus DI,即下升动向指标(-DI),是股票技术分析中的一种指标,用于测量下降方向运动的强度和趋势。DI指标的计算方法是基于一定时间内的最高价、最低价和收盘价的变化来确定价格的下降方向运动。具体来说,-DI指标的计算方法如下:1. 首先计算当日的真实波幅(True Range)TR。2. 计算当日的下降动向值(-DM),即当日最低价减去前一日最低价与前一日收盘价差的较大值(如果这个值为负数,则取0)。3. 计算14天期间的下降动向平均值(-DM14),即将每日的下降动向值相加,再除以14。4. 计算14天期间的平均真实波幅(ATR14),即将每日的真实波幅相加,再除以14。5. 计算下降方向运动指标(-DI14),即将-DM14除以ATR14,再乘以100。DI指标的取值范围为0到100,通常可以通过绘制- DI线来显示其走势。当-DI线处于上升趋势时,表示下降方向运动的强度正在增强,价格可能会继续下跌;而当-DI线处于下降趋势时,则表示价格下跌的力量正在减弱,可能会出现反弹或趋势转变的信号。 | ||
plus_di | Plus DI,即上升动向指标( DI),是股票技术分析中的一种指标,用于测量上升方向运动的强度和趋势,和下降动向指标(-DI)一起构成了动向指标(DMI)。 DI指标的计算方法是基于一定时间内的最高价、最低价和收盘价的变化来确定价格的上升方向运动。具体来说, DI指标的计算方法如下:1. 首先计算当日的真实波幅(True Range)TR。2. 计算当日的上升动向值( DM),即当日最高价减去前一日最高价与前一日收盘价差的较大值(如果这个值为负数,则取0)。3. 计算14天期间的上升动向平均值( DM14),即将每日的上升动向值相加,再除以14。4. 计算14天期间的平均真实波幅(ATR14),即将每日的真实波幅相加,再除以14。5. 计算上升方向运动指标( DI14),即将 DM14除以ATR14,再乘以100。 DI指标的取值范围为0到100,通常可以通过绘制 DI线来显示其走势。当 DI线处于上升趋势时,表示上升方向运动的强度正在增强,价格可能会继续上涨;而当 DI线处于下降趋势时,则表示价格上涨的力量正在减弱,可能会出现反转或趋势转变的信号。 | plus_di > 25 & plus_di > minus_di | minus_di > 25 & plus_di < minus_di |
mom | MOM(Momentum)指标是一种技术分析指标,用于衡量资产价格变化的速度和幅度,并且可以预测价格的趋势。MOM 的计算方法很简单,就是用当前价格减去 N 个时间周期(通常是 10 或 14 个周期)前的价格,然后将差值作为 MOM 指标的值。公式如下:MOM = 当前价格 - N 个周期前的价格MOM 的值为正数,则表示资产价格在过去 N 个周期内上涨;MOM 的值为负数,则表示资产价格在过去 N 个周期内下跌。MOM 指标的绝对值越大,说明价格变化的幅度越大,价格趋势也越强。MOM 指标的应用比较广泛,特别是在趋势跟踪(Trend Following)策略中经常被用到。例如,在上升趋势中,当 MOM 值为正数时,说明价格上涨的势头比较强,可以考虑买入资产;在下降趋势中,当 MOM 值为负数时,说明价格下跌的势头比较强,可以考虑卖出资产。 | mom > 0 | mom < 0 |
cmo | CMO(Chande Momentum Oscillator)指标是一种技术分析指标,用于衡量价格变化的动量和趋势,并识别价格趋势的转折点。CMO 指标的计算基于绝对价格变化的平均值和相对价格变化的平均值之间的差异。CMO 指标的计算步骤如下:1. 计算今天的价格变化(Today's Change),即今天的收盘价减去昨天的收盘价。2. 计算绝对价格变化的平均值(Sum of Absolute Differences),即今天的价格变化与昨天的价格变化取绝对值后相加,再将结果累加 n 天,最后除以 n。3. 计算相对价格变化的平均值(Sum of Differences),即今天的价格变化与昨天的价格变化的差值,再将结果累加 n 天,最后除以 n。4. 计算 CMO 指标,即将相对价格变化的平均值减去绝对价格变化的平均值,再将结果除以相对价格变化的平均值和绝对价格变化的平均值之和,最后将结果乘以 100。CMO 指标的取值范围通常是 -100 到 100,当 CMO 指标值高于 0 时,被认为是买入信号,当 CMO 指标值低于 0 时,被认为是卖出信号。 | cmo < -50 | cmo > 50 |
awesome_oscillator | Awesome Oscillator 是一种技术分析指标,用于评估市场趋势的强度和方向。它由一组移动平均线(简称 MA)构成,其中包括两个 MA,一个较短期的 MA 和一个较长期的 MA。Awesome Oscillator 的计算方式是通过减去较长期 MA 的值(通常是 34 日 MA)与较短期 MA 的值(通常是 5 日 MA)之差,然后将结果表示为柱状图(或直方图)。这个柱状图的高度反映了市场趋势的强度,柱状图的颜色则取决于其当前的高低位置。当 Awesome Oscillator 柱状图位于零线以上时,表示市场趋势为上涨,柱状图高度越高,趋势越强劲。当柱状图位于零线以下时,表示市场趋势为下跌,柱状图高度越低,趋势越强劲。当柱状图交替上下穿过零线时,表示市场处于震荡状态 | ||
mfi | MFI(Money Flow Index)指标是一种技术分析指标,用于衡量资金流入和流出的强度,以及市场趋势的强度和方向。MFI 指标基于典型价格和成交量进行计算,通过比较典型价格和成交量之间的变化来评估市场的压力和支撑。MFI 指标的计算方式是通过以下步骤完成的:1. 计算典型价格(Typical Price),典型价格是指当日的(最高价 最低价 收盘价)÷3。2. 计算 Money Flow(MF),MF 是指当日的典型价格乘以成交量。3. 计算 Positive Money Flow(PMF)和 Negative Money Flow(NMF),PMF 是指当日 MF 值比前一日高的日子的总和,NMF 是指当日 MF 值比前一日低的日子的总和。4. 计算 Money Ratio(MR),MR 是指 PMF 除以 NMF。5. 计算 Money Flow Index(MFI),MFI 是指通过 MR 的计算结果除以(1 MR)再乘以 100 得到的结果。MFI 指标的取值范围通常是 0 到 100,当 MFI 指标值高于 80 时,被认为是超买状态,当 MFI 指标值低于 20 时,被认为是超卖状态。交易者可以使用 MFI 指标来判断市场的趋势和力量,以及市场是否处于超买或超卖状态。 | mfi < 25 | |
cmf | CMF(Chaikin Money Flow)指标是一种技术分析指标,用于衡量资金流入和流出的强度,以及市场趋势的强度和方向。CMF 指标基于成交量和价格之间的关系,通过测量资金流量的方向和强度来判断市场的趋势和力量。CMF 指标的计算方式是通过以下步骤完成的:1. 计算 Money Flow Multiplier(MF Multiplier),MF Multiplier 是指当前交易日的(收盘价-最低价)-(最高价-收盘价)÷(最高价-最低价)。2. 计算 Money Flow Volume(MFV),MFV 是指 MF Multiplier 乘以当日的成交量。3. 计算 Accumulation Distribution Line(ADL),ADL 是指当日的 ADL 值加上 MFV。4. 计算 Chaikin Money Flow(CMF),CMF 是指 ADL 的 N 日累计和除以 N 日成交量的累计和。CMF 指标的取值范围通常是 -1 到 1,当 CMF 指标值高于 0 时,被认为是资金流入市场,当 CMF 指标值低于 0 时,被认为是资金流出市场。交易者可以使用 CMF 指标来判断市场的趋势和力量,以及资金流入和流出的强度。 | cmf < -0.1 | cmf > 0.3 |
resample | 这不是具体的指标,而是一种常见的计算方式。比如将原先的数据(1min)按照5min 重新采样,重新计算 ohlcv,并在这些指标的基础上重新计算 sma, rsi 等指标。好处是可以将不同时间分辨率的数据统一起来,使得数据更加规范化和易于处理。此外,重采样可以消除原始数据中的噪声和波动,使得数据更加平滑,有利于分析市场趋势和价格走势。 | resample_medium < resample_short resample_long < close | resample_sma < resample_mediumresample_medium < resample_short |
atr | ATR(Average True Range)指标是一种技术分析指标,用于衡量资产价格波动性的平均水平。ATR 根据一定的算法计算出一段时间内价格的波动范围,通常使用 14 天的时间周期作为默认值。具体来说,ATR 的计算方法如下:1. 首先,计算当日的 TR(True Range)。TR 的值表示当日价格的波动范围,它是以下三个值的最大值: ○ 当日最高价减去当日最低价的绝对值。 ○ 当日最高价减去前一日收盘价的绝对值。 ○ 当日最低价减去前一日收盘价的绝对值。2. 然后,使用一定的平滑算法对 TR 进行平均处理,得到 ATR 值。ATR 的值可以用于判断资产的波动性,以及设定价格的止损和止盈点位。一般来说,ATR 值越大,资产的波动性越大,价格变化范围也就越大。因此,在制定交易策略时,可以根据 ATR 值来调整止损和止盈的距离,以适应当前市场波动性的变化。 | ||
其他