regime_strategy_final.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. """创业板50双均线策略 - 最终工作版"""
  2. import backtrader as bt
  3. import pandas as pd
  4. import numpy as np
  5. class Chinext50Strategy(bt.Strategy):
  6. params = (('fast', 20), ('slow', 60))
  7. def __init__(self):
  8. self.sma_fast = bt.indicators.SMA(period=self.p.fast)
  9. self.sma_slow = bt.indicators.SMA(period=self.p.slow)
  10. def next(self):
  11. if len(self) < 2:
  12. return
  13. fast_now, fast_prev = self.sma_fast[0], self.sma_fast[-1]
  14. slow_now, slow_prev = self.sma_slow[0], self.sma_slow[-1]
  15. if np.isnan(fast_now):
  16. return
  17. # 金叉买入
  18. if fast_prev <= slow_prev and fast_now > slow_now and not self.position:
  19. close = self.datas[0].close[0]
  20. size = (int(self.broker.getcash() / close) // 100) * 100
  21. if size > 0:
  22. self.buy(size=size)
  23. # 死叉卖出
  24. elif fast_prev >= slow_prev and fast_now < slow_now and self.position:
  25. self.close()
  26. def run_strategy():
  27. cerebro = bt.Cerebro()
  28. df = pd.read_csv('chinext50.csv', parse_dates=['datetime'], index_col='datetime')
  29. cerebro.adddata(bt.feeds.PandasData(dataname=df))
  30. cerebro.addstrategy(Chinext50Strategy)
  31. cerebro.broker.setcash(100000.0)
  32. cerebro.broker.setcommission(commission=0.001)
  33. cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe', riskfreerate=0.02)
  34. cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')
  35. cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')
  36. print('初始资金: %.2f' % cerebro.broker.getvalue())
  37. results = cerebro.run()
  38. print('最终资金: %.2f' % cerebro.broker.getvalue())
  39. return cerebro, results[0]
  40. if __name__ == '__main__':
  41. run_strategy()