该策略的核心思想是投资人始终保持资产中某一资产的投资份额固定不变。当资产价值上涨时,投资人会卖出部分以维持投资份额;当资产价值下跌时,投资人会买入以补充投资份额。该策略适用于相对稳定的资产。
该策略首先需要设置投资份额参数percent_invested,即投资组合中占据的资产份额。然后根据以下逻辑调整仓位:
当仓位为0时,根据设定的投资份额percent_invested和初始资金initial_capital计算需要买入的合约数。
持仓时,比较已投资金额与账户总权益的比例invested和设定的投资份额percent_invested。如果已投资金额比例过低,则买入合约以补充投资份额;如果已投资金额比例过高,则卖出合约以维持投资份额。
Repeat步骤2,使投资份额维持在固定水平。
可以对相对稳定的资产进行长期持有,无需频繁交易。
定期调整仓位,从资产波动中获利。
可以分散投资多个非相关资产,降低投资组合风险。
可以防止全仓亏损,避免在泡沫破裂时损失全部投资。
对波动较大的资产,亏损风险较大。
需要频繁交易支付手续费。
仓位调整可能存在时间滞后,错过最佳买卖点位。
百分比设置不恰当可能导致过度交易。
可从以下方面降低风险:
谨慎选择资产,避免高波动资产。
优化仓位调整逻辑,降低交易频率。
设置仓位变动最小单位,避免过度交易。
优化百分比设置,防止资金过度集中。
该策略可以从以下几个方面进行优化:
增加止损逻辑,在资产价格下滑到一定程度时自动止损。
增加仓位调整的交易信号验证,避免在非趋势变化点调整仓位。
对不同资产设置不同的投资百分比、止损比例等参数。
增加参数优化模块,根据历史数据自动优化参数。
支持平仓再投资其他资产,进行动态资产配置。
该策略通过固定投资份额达到分散投资、控制风险的效果,适用于稳定资产的长期持有。但该策略存在仓位调整滞后、风险资产投资风险等问题。后续可通过优化止损逻辑、信号验证等手段进一步提高策略稳定性。
/*backtest
start: 2022-09-21 00:00:00
end: 2022-11-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
// strategy("Fixed Fractioning", overlay=true, initial_capital=100000.0)
percent_invested=input(50.0,title="Percent Invested",maxval=100.0,minval=0.0)
fraction_invested=percent_invested/100
from_day=input(1,title="From Day",maxval=31,minval=1)
from_month=input(1,title="From Month",maxval=12,minval=1)
from_year=input(2017,title="From Year",maxval=2018,minval=1900)
to_day=input(1,title="To Day",maxval=31,minval=1)
to_month=input(1,title="To Month",maxval=12,minval=1)
to_year=input(2018,title="To Year",maxval=2018,minval=1900)
// === FUNCTION EXAMPLE === from: https://www.tradingview.com/script/62hUcP6O-How-To-Set-Backtest-Date-Range/
start = timestamp(from_year, from_month, from_day, 00, 00) // backtest start window
finish = timestamp(to_year, to_month, to_day, 23, 59) // backtest finish window
window() => true // create function "within window of time"
strategy.initial_capital = 50000
if strategy.position_size==0 and window()
contracts_to_buy=(fraction_invested*strategy.initial_capital)/close
strategy.entry("long",long=true,qty=contracts_to_buy,limit=close,when=contracts_to_buy>1)
invested=(strategy.position_size*close)/strategy.equity
if invested<fraction_invested and window()
contracts_to_buy=((fraction_invested-invested)*strategy.equity)/close
strategy.order("long",long=true,qty=contracts_to_buy,limit=close,when=contracts_to_buy>1)
else
if invested>fraction_invested and window()
contracts_to_sell=((invested-fraction_invested)*strategy.equity)/close
strategy.order("sell",long=false,qty=contracts_to_sell,limit=close,when=contracts_to_sell>1)