均线介绍
均线计算:
在某一时间段的收盘价之和进行算术平均的方法,并随着时间的推移将这些平均值连成一条线便可得出SMA。
趋势判断
均线在某一时间段里是向上移动的,它表面股票价格处于上升趋势中,即“牛市”,或即将“大涨”的趋势。
相反的,如果SMA向下移动,则是“熊市”或下跌趋势的指示标志。支持与压力
当股价触及阻力点或支撑位后不再突破,这表明股票价格将不再下跌或上涨,这可能是开始回升或者下跌的信号。
如果它突破了该阻力点或支撑位,则意味着价格会继续向上或向下变动,表明股价很可能持续地大幅上涨或下跌。
均线交叉策略
- 信号
两条均线形成死叉入场(快sma<慢sam)
两条均线形成金叉平仓 (快sma<慢sam)
回测策略
- 参数
Item | Vale |
---|---|
数据 | BNBUSDT_1h |
时间 | 2017.11.11 - 2022.07.08 |
快SMA | 100 |
慢SMA | 300 |
收益率 | 135159.37% |
-
回测结果
-
年化率
优化策略参数
Item | Vale |
---|---|
数据 | BNBUSDT_1h |
时间 | 2017.11.11 - 2022.07.08 |
参数空间 | 10-400 |
快SMA | 350 |
慢SMA | 390 |
收益率 | 2045148.40% |
- 回测结果
- 年化
- 其他数据表表现
还在测试中
代码
from strategy import *
class SmaCrossStrategy(bt.Strategy):
params = dict(
sma1=30, # 需要优化的参数1,短期均线窗口
sma2=200, # 需要优化的参数2,长期均线窗口
is_log=False # 是否打印日志
)
def log(self, txt, dt=None):
if self.p.is_log:
dt = dt or self.datas[0].datetime.date(0)
print('%s,%s' % (dt.isoformat(), txt))
def __init__(self):
sma1 = bt.ind.SMA(period=int(self.params.sma1)) # 用int取整
sma2 = bt.ind.SMA(period=int(self.params.sma2)) # 用int取整
self.crossover = bt.ind.CrossOver(sma1, sma2)
self.order = None
def get_buy_unit(self):
size = self.broker.getcash() / self.data.high[0] * 0.5
if size == 0:
size = 1
return size
def next(self):
if self.order:
return
if not self.position: # 不在场内,则可以买入
if self.crossover[0] < 0: # 死叉
size = self.get_buy_unit()
self.order = self.buy(size=size) # 买入
else:
if self.crossover[0] > 0: # 金叉
self.close() # 卖出
def notify(self, order):
if order.status in [order.Completed, order.Canceled, order.Margin]:
if order.isbuy():
self.log('执行买入, %.2f' % order.executed.price)
elif order.issell():
self.log('执行卖出, %.2f' % order.executed.price)
self.order = None
def create_sma_cross_strategy(params=None):
c = create_cerebro()
if params is None:
c.addstrategy(SmaCrossStrategy)
else:
c.addstrategy(SmaCrossStrategy,
sma1=int(params["sma1"]),
sma2=int(params["sma2"]))
return c
if __name__ == '__main__':
path = "D:\\work\\git\\Tools\\static\\data\\BNBUSDT_1h.csv"
data = get_data(path)
params = {
'sma1': "350",
'sma2': '390'
}
run_strategy(create_strategy_func=create_sma_cross_strategy, data=data, params=params, is_show=True)
path = show_strategy_analyze(data,
create_strategy_func=create_sma_cross_strategy,
params=params,
is_show=True)
print(path)
path = show_strategy_pyfolio(data,
create_strategy_func=create_sma_cross_strategy,
params=params,
is_show=True)
print(path)
总结
目前从回测结果来看,该策略表现还行,把周期调大,减少市场干扰,减少开仓的次数,较小市场的波动,可持续性盈利。未来10年,实现财富自由,加油!!!!