数字货币量化之仓位管理的实现 (下)

完善双均线策略

按波动率分配资金

  • 投资组合:BTC,ETH,LTC,EOS
  • 复利/不复利方式
  • 头寸规模确定:基于ATR的百分比风险模型
    • 波动率越大,分配的头寸越小;波动率越小,分配的头寸越大
  • 结果:
    • 策略收益 194.007%
    • 策略年化收益:108.890%
    • 策略波动率:52.675%
    • 夏普比率:1.673
    • 最大回撤: 32.817%

代码实战

dma_with_atr_alg.py

"""
    双均线改进策略
    - 按波动率分配资金
"""

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import talib
from logbook import Logger

from catalyst import run_algorithm
from catalyst.api import record, symbol, order_target, order

# 需要先加载数据
# catalyst ingest-exchange -x binance -i btc_usdt -f daily
# catalyst ingest-exchange -x binance -i eth_usdt -f daily
# catalyst ingest-exchange -x binance -i ltc_usdt -f daily
# catalyst ingest-exchange -x binance -i eos_usdt -f daily

NAMESPACE = 'dma_with_atr_alg'
log = Logger(NAMESPACE)

SHORT_WIN = 5               # 短周期窗口
LONG_WIN = 25               # 长周期窗口

ATR_WIN_SIZE = 20           # ATR窗口
RISK_RATIO = 0.05          # 风险比例

def get_available_cash(context, use_compound_interest=False):
    """
        获取当前可用资金
        use_compound_interest: 是否使用复利
    """
    if use_compound_interest:
        # 使用复利
        available_cash = context.portfolio.cash
    else:
        available_cash = min(context.portfolio.starting_cash, context.portfolio.cash)
    return available_cash

def get_risk_indices(perf):
    """
        计算风险指标,包括:
        1. 策略收益
        2. 策略年化收益
        3. 策略波动率
        4. 夏普比率
        5. 最大回撤
    """
    # 策略执行天数
    n = len(perf)

    # 1. 策略收益
    total_returns = perf.iloc[-1]['algorithm_period_return']

    # 2. 策略年化收益
    total_ann_returns = (1 + total_returns) ** (250 / n) - 1

    # 3. 策略波动率
    algo_volatility = perf.iloc[-1]['algo_volatility']

    # 4. 夏普比率
    sharpe = perf.iloc[-1]['sharpe']

    # 5. 最大回撤
    max_drawdown = np.abs(perf.iloc[-1]['max_drawdown'])

    return total_returns, total_ann_returns, algo_volatility, sharpe, max_drawdown

def initialize(context):
    """
        初始化
    """
    context.i = 0                       # 经历过的交易周期
    # 设置加密货币池
    context.asset_pool = [symbol('btc_usdt'),
                          symbol('eth_usdt'),
                          symbol('ltc_usdt'),
                          symbol('eos_usdt')]
    context.set_commission(maker=0.001, taker=0.001)    # 设置手续费
    context.set_slippage(slippage=0.001)                # 设置滑点

def handle_data(context, data):
    """
        在每个交易周期上运行的策略
    """
    context.i += 1  # 记录交易周期
    if context.i < LONG_WIN + 1:
        # 如果交易周期过短,无法计算均线,则跳过循环
        log.warning('交易周期过短,无法计算指标')
        return

    # 获取当前周期内有效的加密货币
    context.available_asset_pool = [asset
                                    for asset in context.asset_pool
                                    if asset.start_date <= data.current_dt]

    context.up_cross_signaled = set()   # 初始化金叉的交易对集合
    context.down_cross_signaled = set()  # 初始化死叉的交易对集合

    for asset in context.available_asset_pool:
        # 遍历每一个加密货币对
        # 获得历史价格
        history_data = data.history(asset,
                                    'close',
                                    bar_count=LONG_WIN + 1,
                                    frequency='1D',
                                    )
        if len(history_data) >= LONG_WIN + 1:
            # 保证新的货币有足够的时间计算均线
            # 计算双均线
            short_avgs = history_data.rolling(window=SHORT_WIN).mean()
            long_avgs = history_data.rolling(window=LONG_WIN).mean()

            # 双均线策略
            # 短期均线上穿长期均线
            if (short_avgs[-2] < long_avgs[-2]) and (short_avgs[-1] >= long_avgs[-1]):
                # 形成金叉
                context.up_cross_signaled.add(asset)

            # 短期均线下穿长期均线
            if (short_avgs[-2] > long_avgs[-2]) and (short_avgs[-1] <= long_avgs[-1]):
                # 形成死叉
                context.down_cross_signaled.add(asset)

    # 卖出均线死叉信号的持仓交易对
    for asset in context.portfolio.positions:
        if asset in context.down_cross_signaled:
            order_target(asset, 0)

    # 买入均线金叉信号的持仓股
    for asset in context.up_cross_signaled:
        if asset not in context.portfolio.positions:
            history_data = data.history(asset,
                                        ['high', 'low', 'close'],
                                        bar_count=ATR_WIN_SIZE + 1,
                                        frequency='1D',
                                        )
            atr = talib.ATR(history_data['high'], history_data['low'], history_data['close'],
                            timeperiod=ATR_WIN_SIZE)

            available_cash = get_available_cash(context)

            if available_cash > 0:
                # 如果有可用现金
                amount_to_buy = available_cash * RISK_RATIO / atr[-1]    # 计算购买的数量
                close_price = data.current(asset, 'close')
                if (amount_to_buy >= asset.min_trade_size) and (available_cash >= amount_to_buy * close_price):
                    # 购买的数量大于最小购买数量并且有足够的现金购买
                    order(asset, amount_to_buy)

    # 持仓比例
    pos_level = context.portfolio.positions_value / context.portfolio.portfolio_value

    # 记录每个交易周期的现金
    record(cash=context.portfolio.cash, pos_level=pos_level)

    # 输出信息
    log.info('日期:{},资产:{:.2f},持仓比例:{:.6f}%,持仓产品:{}'.format(
        data.current_dt, context.portfolio.portfolio_value, pos_level * 100,
        ', '.join([asset.asset_name for asset in context.portfolio.positions]))
    )

def analyze(context, perf):
    # 保存交易记录
    perf.to_csv('./perf_results/dma_with_atr_performance.csv')

    # 获取交易所的计价货币
    exchange = list(context.exchanges.values())[0]
    quote_currency = exchange.quote_currency.upper()

    # 图1:可视化资产值
    ax1 = plt.subplot(311)
    perf['portfolio_value'].plot(ax=ax1)
    ax1.set_ylabel('Portfolio Value\n({})'.format(quote_currency))
    start, end = ax1.get_ylim()
    ax1.yaxis.set_ticks(np.arange(start, end, (end - start) / 5))

    # 图2:可视化仓位
    ax2 = plt.subplot(312)
    perf['pos_level'].plot(ax=ax2)
    ax2.set_ylabel('Position Level')
    start, end = 0, 1
    ax2.yaxis.set_ticks(np.arange(start, end, (end - start) / 5))

    # 图3:可视化现金数量
    ax3 = plt.subplot(313, sharex=ax1)
    perf['cash'].plot(ax=ax3)
    ax3.set_ylabel('Cash\n({})'.format(quote_currency))
    start, end = ax3.get_ylim()
    ax3.yaxis.set_ticks(np.arange(0, end, end / 5))

    plt.tight_layout()
    plt.show()

    # 评价策略
    total_returns, total_ann_returns, algo_volatility, sharpe, max_drawdown = get_risk_indices(perf)
    log.info('策略收益: {:.3f}%, 策略年化收益: {:.3f}%, 策略波动率: {:.3f}%, 夏普比率: {:.3f}, 最大回撤: {:.3f}%'.format(
        total_returns * 100, total_ann_returns * 100, algo_volatility * 100, sharpe, max_drawdown * 100
    ))

if __name__ == '__main__':
    run_algorithm(
        capital_base=100000,
        data_frequency='daily',
        initialize=initialize,
        handle_data=handle_data,
        analyze=analyze,
        exchange_name='binance',
        algo_namespace=NAMESPACE,
        quote_currency='usdt',
        start=pd.to_datetime('2019-02-01', utc=True),
        end=pd.to_datetime('2019-12-22', utc=True)
    )

打印:

[2019-12-24 13:02:17.057549] INFO: dma_with_atr_alg: 日期:2019-03-08 23:59:00+00:00,资产:100000.00,持仓比例:0.000000%,持仓产品:
[2019-12-24 13:02:17.232799] INFO: dma_with_atr_alg: 日期:2019-03-09 23:59:00+00:00,资产:100000.00,持仓比例:0.000000%,持仓产品:
[2019-12-24 13:02:17.256364] INFO: dma_with_atr_alg: 日期:2019-03-10 23:59:00+00:00,资产:99858.52,持仓比例:70.804237%,持仓产品:ETH / USDT
[2019-12-24 13:02:17.282217] INFO: dma_with_atr_alg: 日期:2019-03-11 23:59:00+00:00,资产:98309.79,持仓比例:0.000000%,持仓产品:
[2019-12-24 13:02:17.305275] INFO: dma_with_atr_alg: 日期:2019-03-12 23:59:00+00:00,资产:98309.79,持仓比例:0.000000%,持仓产品:

[2019-12-24 13:02:19.123245] INFO: dma_with_atr_alg: 日期:2019-05-14 23:59:00+00:00,资产:122649.99,持仓比例:94.175896%,持仓产品:LTC / USDT, EOS / USDT
[2019-12-24 13:02:19.150613] INFO: dma_with_atr_alg: 日期:2019-05-15 23:59:00+00:00,资产:135184.30,持仓比例:94.715908%,持仓产品:LTC / USDT, EOS / USDT
[2019-12-24 13:02:19.176109] INFO: dma_with_atr_alg: 日期:2019-05-16 23:59:00+00:00,资产:129152.80,持仓比例:94.469138%,持仓产品:LTC / USDT, EOS / USDT
[2019-12-24 13:02:19.207302] INFO: dma_with_atr_alg: 日期:2019-05-17 23:59:00+00:00,资产:121491.53,持仓比例:94.120362%,持仓产品:LTC / USDT, EOS / USDT
[2019-12-24 13:02:19.231530] INFO: dma_with_atr_alg: 日期:2019-05-18 23:59:00+00:00,资产:117665.61,持仓比例:93.929184%,持仓产品:LTC / USDT, EOS / USDT
[2019-12-24 13:02:19.254594] INFO: dma_with_atr_alg: 日期:2019-05-19 23:59:00+00:00,资产:128112.82,持仓比例:94.424241%,持仓产品:LTC / USDT, EOS / USDT
.
.
.
[2019-12-24 13:02:20.310124] INFO: dma_with_atr_alg: 日期:2019-06-23 23:59:00+00:00,资产:178551.60,持仓比例:99.974713%,持仓产品:LTC / USDT, BTC / USDT, ETH / USDT, EOS / USDT
[2019-12-24 13:02:20.337493] INFO: dma_with_atr_alg: 日期:2019-06-24 23:59:00+00:00,资产:177573.97,持仓比例:99.974574%,持仓产品:LTC / USDT, BTC / USDT, ETH / USDT, EOS / USDT
[2019-12-24 13:02:20.365161] INFO: dma_with_atr_alg: 日期:2019-06-25 23:59:00+00:00,资产:181413.94,持仓比例:99.975112%,持仓产品:LTC / USDT, BTC / USDT, ETH / USDT, EOS / USDT
.
.
.

[2019-12-24 13:02:25.534075] INFO: dma_with_atr_alg: 日期:2019-12-18 23:59:00+00:00,资产:107629.82,持仓比例:0.000000%,持仓产品:
[2019-12-24 13:02:25.563299] INFO: dma_with_atr_alg: 日期:2019-12-19 23:59:00+00:00,资产:107629.82,持仓比例:0.000000%,持仓产品:
[2019-12-24 13:02:25.593200] INFO: dma_with_atr_alg: 日期:2019-12-20 23:59:00+00:00,资产:107629.82,持仓比例:0.000000%,持仓产品:
[2019-12-24 13:02:25.620818] INFO: dma_with_atr_alg: 日期:2019-12-21 23:59:00+00:00,资产:107629.82,持仓比例:0.000000%,持仓产品:
[2019-12-24 13:02:25.646023] INFO: dma_with_atr_alg: 日期:2019-12-22 23:59:00+00:00,资产:107629.82,持仓比例:0.000000%,持仓产品:
[2019-12-24 13:02:25.648921] INFO: Performance: Simulated 325 trading days out of 325.
[2019-12-24 13:02:25.649061] INFO: Performance: first open: 2019-02-01 00:00:00+00:00
[2019-12-24 13:02:25.649142] INFO: Performance: last close: 2019-12-22 23:59:00+00:00

file

[2019-12-24 13:36:16.583331] INFO: dma_with_atr_alg: 策略收益: 7.630%, 策略年化收益: 5.819%, 策略波动率: 44.722%, 夏普比率: 0.354, 最大回撤: 41.219%

按盈利比例均匀加仓

  • 投资组合:BTC,ETH,LTC,EOS
  • 复利/不复利方式
  • 加仓方案:
    • 记录每个持仓品种最后一次的买入价,如果当前周期的开盘价相对于前一次的买入价的盈利比例超过某个阀值,则等额加一次仓
  • 结果:
    • 策略收益 194.007%
    • 策略年化收益:108.890%
    • 策略波动率:52.675%
    • 夏普比率:1.673
    • 最大回撤: 32.817%

实战代码

dma_inc_pos_alg.py

"""
    双均线改进策略
    - 按盈利比例均匀加仓
"""

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import talib
from logbook import Logger

from catalyst import run_algorithm
from catalyst.api import record, symbol, order_target, order, order_value

# 需要先加载数据
# catalyst ingest-exchange -x binance -i btc_usdt -f daily
# catalyst ingest-exchange -x binance -i eth_usdt -f daily
# catalyst ingest-exchange -x binance -i ltc_usdt -f daily
# catalyst ingest-exchange -x binance -i eos_usdt -f daily

NAMESPACE = 'dma_inc_pos_alg'
log = Logger(NAMESPACE)

SHORT_WIN = 5               # 短周期窗口
LONG_WIN = 25               # 长周期窗口

ATR_WIN_SIZE = 20           # ATR窗口
RISK_RATIO = 0.05          # 风险比例

INC_POS_RATE = 0.05         # 价格每上涨5%加仓

def get_available_cash(context, use_compound_interest=False):
    """
        获取当前可用资金
        use_compound_interest: 是否使用复利
    """
    if use_compound_interest:
        # 使用复利
        available_cash = context.portfolio.cash
    else:
        available_cash = min(context.portfolio.starting_cash, context.portfolio.cash)
    return available_cash

def get_risk_indices(perf):
    """
        计算风险指标,包括:
        1. 策略收益
        2. 策略年化收益
        3. 策略波动率
        4. 夏普比率
        5. 最大回撤
    """
    # 策略执行天数
    n = len(perf)

    # 1. 策略收益
    total_returns = perf.iloc[-1]['algorithm_period_return']

    # 2. 策略年化收益
    total_ann_returns = (1 + total_returns) ** (250 / n) - 1

    # 3. 策略波动率
    algo_volatility = perf.iloc[-1]['algo_volatility']

    # 4. 夏普比率
    sharpe = perf.iloc[-1]['sharpe']

    # 5. 最大回撤
    max_drawdown = np.abs(perf.iloc[-1]['max_drawdown'])

    return total_returns, total_ann_returns, algo_volatility, sharpe, max_drawdown

def initialize(context):
    """
        初始化
    """
    context.i = 0                       # 经历过的交易周期
    # 设置加密货币池
    context.asset_pool = [symbol('btc_usdt'),
                          symbol('eth_usdt'),
                          symbol('ltc_usdt'),
                          symbol('eos_usdt')]
    context.set_commission(maker=0.001, taker=0.001)    # 设置手续费
    context.set_slippage(slippage=0.001)                # 设置滑点

    # 初始化字典,用于记录上一次买入加密货币的价格
    context.last_price = {asset: None for asset in context.asset_pool}

    # 初始化字典,用于记录在当前交易周期中加密货币是否被交易过
    # 这里限制每天只能交易一次
    context.traded_today = {asset: False for asset in context.asset_pool}

def handle_data(context, data):
    """
        在每个交易周期上运行的策略
    """
    context.i += 1  # 记录交易周期
    for asset in context.traded_today:
        # 每个交易周期重置交易flag
        context.traded_today[asset] = False

    if context.i < LONG_WIN + 1:
        # 如果交易周期过短,无法计算均线,则跳过循环
        log.warning('交易周期过短,无法计算指标')
        return

    # 获取当前周期内有效的加密货币
    context.available_asset_pool = [asset
                                    for asset in context.asset_pool
                                    if asset.start_date <= data.current_dt]

    context.up_cross_signaled = set()   # 初始化金叉的交易对集合
    context.down_cross_signaled = set()  # 初始化死叉的交易对集合

    for asset in context.available_asset_pool:
        # 遍历每一个加密货币对
        # 获得历史价格
        hitory_data = data.history(asset,
                                   'close',
                                   bar_count=LONG_WIN + 1,
                                   frequency='1D',
                                   )
        if len(hitory_data) >= LONG_WIN + 1:
            # 保证新的货币有足够的时间计算均线
            # 计算双均线
            short_avgs = hitory_data.rolling(window=SHORT_WIN).mean()
            long_avgs = hitory_data.rolling(window=LONG_WIN).mean()

            # 双均线策略
            # 短期均线上穿长期均线
            if (short_avgs[-2] < long_avgs[-2]) and (short_avgs[-1] >= long_avgs[-1]):
                # 形成金叉
                context.up_cross_signaled.add(asset)

            # 短期均线下穿长期均线
            if (short_avgs[-2] > long_avgs[-2]) and (short_avgs[-1] <= long_avgs[-1]):
                # 形成死叉
                context.down_cross_signaled.add(asset)

    # 卖出均线死叉信号的持仓交易对
    for asset in context.portfolio.positions:
        if context.traded_today[asset]:
            # 当前交易周期中该产品被交易过,跳过循环
            continue
        if asset in context.down_cross_signaled:
            order_target(asset, 0)
            # 卖出货币对,重置购买价
            context.last_price[asset] = None
            context.traded_today[asset] = True

    # 买入均线金叉信号的持仓股
    for asset in context.up_cross_signaled:
        if context.traded_today[asset]:
            # 当前交易周期中该产品被交易过,跳过循环
            continue
        if asset not in context.portfolio.positions:
            history_data = data.history(asset,
                                        ['high', 'low', 'close'],
                                        bar_count=ATR_WIN_SIZE + 1,
                                        frequency='1D',
                                        )
            atr = talib.ATR(history_data['high'], history_data['low'], history_data['close'],
                            timeperiod=ATR_WIN_SIZE)

            available_cash = get_available_cash(context)

            if available_cash > 0:
                # 如果有可用现金
                amount_to_buy = available_cash * RISK_RATIO / atr[-1]  # 计算购买的数量
                close_price = data.current(asset, 'close')
                if (amount_to_buy >= asset.min_trade_size) and (available_cash >= amount_to_buy * close_price):
                    # 购买的数量大于最小购买数量并且有足够的现金购买
                    order(asset, amount_to_buy)
                    # 买入货币对,记录购买价
                    context.last_price[asset] = close_price
                    context.traded_today[asset] = True

    # 检查有无符合加仓条件的持仓品种
    for asset in context.portfolio.positions:
        if context.traded_today[asset]:
            # 当前交易周期中该产品被交易过,跳过循环
            continue
        if context.portfolio.positions[asset].amount > 0:
            close_price = data.current(asset, 'close')
            last_price = context.last_price[asset]
            if (close_price - last_price) / last_price >= INC_POS_RATE:
                # 按盈利比例均匀加仓
                log.info('加仓操作...')

                available_cash = get_available_cash(context)
                if available_cash > 0:
                    # 如果有可用现金
                    # 每个交易对平均分配现金
                    cash_for_each_asset = available_cash / len(context.available_asset_pool)
                    amount_to_buy = cash_for_each_asset / close_price
                    if amount_to_buy >= asset.min_trade_size:
                        # 购买的数量大于最小购买数量
                        order(asset, amount_to_buy)
                        # 买入货币对,记录购买价
                        context.last_price[asset] = close_price
                        context.traded_today[asset] = True

    # 持仓比例
    pos_level = context.portfolio.positions_value / context.portfolio.portfolio_value

    # 记录每个交易周期的现金
    record(cash=context.portfolio.cash, pos_level=pos_level)

    # 输出信息
    log.info('日期:{},资产:{:.2f},持仓比例:{:.6f}%,持仓产品:{}'.format(
        data.current_dt, context.portfolio.portfolio_value, pos_level * 100,
        ', '.join([asset.asset_name for asset in context.portfolio.positions]))
    )

def analyze(context, perf):
    # 保存交易记录
    perf.to_csv('./perf_results/dma_inc_pos_performance.csv')

    # 获取交易所的计价货币
    exchange = list(context.exchanges.values())[0]
    quote_currency = exchange.quote_currency.upper()

    # 图1:可视化资产值
    ax1 = plt.subplot(311)
    perf['portfolio_value'].plot(ax=ax1)
    ax1.set_ylabel('Portfolio Value\n({})'.format(quote_currency))
    start, end = ax1.get_ylim()
    ax1.yaxis.set_ticks(np.arange(start, end, (end - start) / 5))

    # 图2:可视化仓位
    ax2 = plt.subplot(312)
    perf['pos_level'].plot(ax=ax2)
    ax2.set_ylabel('Position Level')
    start, end = 0, 1
    ax2.yaxis.set_ticks(np.arange(start, end, (end - start) / 5))

    # 图3:可视化现金数量
    ax3 = plt.subplot(313, sharex=ax1)
    perf['cash'].plot(ax=ax3)
    ax3.set_ylabel('Cash\n({})'.format(quote_currency))
    start, end = ax3.get_ylim()
    ax3.yaxis.set_ticks(np.arange(0, end, end / 5))

    plt.tight_layout()
    plt.show()

    # 评价策略
    total_returns, total_ann_returns, algo_volatility, sharpe, max_drawdown = get_risk_indices(perf)
    log.info('策略收益: {:.3f}%, 策略年化收益: {:.3f}%, 策略波动率: {:.3f}%, 夏普比率: {:.3f}, 最大回撤: {:.3f}%'.format(
        total_returns * 100, total_ann_returns * 100, algo_volatility * 100, sharpe, max_drawdown * 100
    ))

if __name__ == '__main__':
    run_algorithm(
        capital_base=100000,
        data_frequency='daily',
        initialize=initialize,
        handle_data=handle_data,
        analyze=analyze,
        exchange_name='binance',
        algo_namespace=NAMESPACE,
        quote_currency='usdt',
        start=pd.to_datetime('2019-02-01', utc=True),
        end=pd.to_datetime('2019-12-22', utc=True)
    )

file

结果打印:

[2019-12-24 13:49:01.748795] INFO: dma_inc_pos_alg: 日期:2019-03-09 23:59:00+00:00,资产:100000.00,持仓比例:0.000000%,持仓产品:
[2019-12-24 13:49:01.773888] INFO: dma_inc_pos_alg: 日期:2019-03-10 23:59:00+00:00,资产:99858.52,持仓比例:70.804237%,持仓产品:ETH / USDT
[2019-12-24 13:49:01.794042] INFO: dma_inc_pos_alg: 日期:2019-03-11 23:59:00+00:00,资产:98309.79,持仓比例:0.000000%,持仓产品:
[2019-12-24 13:49:01.811791] INFO: dma_inc_pos_alg: 日期:2019-03-12 23:59:00+00:00,资产:98309.79,持仓比例:0.000000%,持仓产品:
...
[2019-12-24 13:49:02.285863] INFO: dma_inc_pos_alg: 日期:2019-04-04 23:59:00+00:00,资产:125348.66,持仓比例:89.143132%,持仓产品:EOS / USDT
[2019-12-24 13:49:02.305742] INFO: dma_inc_pos_alg: 加仓操作...
[2019-12-24 13:49:02.306009] INFO: dma_inc_pos_alg: 日期:2019-04-05 23:59:00+00:00,资产:130747.02,持仓比例:89.591397%,持仓产品:EOS / USDT
[2019-12-24 13:49:02.326259] INFO: dma_inc_pos_alg: 日期:2019-04-06 23:59:00+00:00,资产:131161.56,持仓比例:92.232760%,持仓产品:EOS / USDT
[2019-12-24 13:49:02.343488] INFO: dma_inc_pos_alg: 日期:2019-04-07 23:59:00+00:00,资产:133247.86,持仓比例:92.354374%,持仓产品:EOS / USDT
[2019-12-24 13:49:02.359605] INFO: dma_inc_pos_alg: 日期:2019-04-08 23:59:00+00:00,资产:135054.93,持仓比例:92.456675%,持仓产品:EOS / USDT
[2019-12-24 13:49:02.381304] INFO: dma_inc_pos_alg: 日期:2019-04-09 23:59:00+00:00,资产:135572.54,持仓比例:92.485474%,持仓产品:EOS / USDT
[2019-12-24 13:49:02.409689] INFO: dma_inc_pos_alg: 加仓操作...
[2019-12-24 13:49:02.409963] INFO: dma_inc_pos_alg: 日期:2019-04-10 23:59:00+00:00,资产:142805.36,持仓比例:92.866071%,持仓产品:EOS / USDT
...
[2019-12-24 13:49:07.948262] INFO: dma_inc_pos_alg: 日期:2019-12-20 23:59:00+00:00,资产:98190.32,持仓比例:0.000000%,持仓产品:
[2019-12-24 13:49:07.971385] INFO: dma_inc_pos_alg: 日期:2019-12-21 23:59:00+00:00,资产:98190.32,持仓比例:0.000000%,持仓产品:
[2019-12-24 13:49:07.995320] INFO: dma_inc_pos_alg: 日期:2019-12-22 23:59:00+00:00,资产:98190.32,持仓比例:0.000000%,持仓产品:

策略指标打印:

[2019-12-24 13:57:22.617101] INFO: dma_inc_pos_alg: 策略收益: -1.810%, 策略年化收益: -1.395%, 策略波动率: 47.427%, 夏普比率: 0.210, 最大回撤: 45.323%

我们可以看到,按照盈利比例进行加仓收益率为负的,也就是投资是亏损的,最大回撤达到了45.32%。

为者常成,行者常至