【Python量化策略】SMA双均线策略

策略内容:

SMA短周期:20

SMA长周期:60

如果短周期上穿长周期则做多,如果短周期下穿长周期则平仓。

具体代码如下:

import backtrader as bt
import pandas as pd
import CeLv


# 从csv获取数据
def csv_data():
    df = pd.read_csv('./数据.csv',
                     names=['time', 'open', 'close', 'high', 'low', 'turn over',
                            'volume'])  
    df['datetime'] = pd.to_datetime(df['time'], unit='s')
    df = df.drop(columns='time')
    # df.columns = ['time', 'open', 'close', 'high', 'low', 'turn over', 'volume']
    df.set_index(keys='datetime', drop=True, append=False)
    return df


if __name__ == '__main__':
    df = csv_data()
    cerebro = bt.Cerebro()
    data = bt.feeds.PandasData(dataname=df, datetime='datetime',
                               open='open', high='high', low='low',
                               close='close', volume='turn over', openinterest=-1)
    cerebro = bt.Cerebro()  # 创建cerebro

    # 在Cerebro中添加价格数据
    cerebro.adddata(data)
    # 设置启动资金
    cerebro.broker.setcash(100000.0)
    # 设置交易单位大小
    cerebro.addsizer(bt.sizers.FixedSize, stake=5000)
    # 设置佣金为千分之一
    cerebro.broker.setcommission(commission=0.002)
    # 添加策略
    cerebro.addstrategy(CeLv.EmaAndDc)
    # 添加分析指标
    # 收益率
    cerebro.addanalyzer(bt.analyzers.Returns, _name='_Returns')
    # 收益期间
    cerebro.addanalyzer(bt.analyzers.TimeReturn, _name='_TimeReturn')
    # 计算最大回撤相关指标
    cerebro.addanalyzer(bt.analyzers.DrawDown, _name='_DrawDown')
    # 回撤期间
    cerebro.addanalyzer(bt.analyzers.TimeDrawDown, _name='_TimeDrawDown')
    # 计算年化夏普比率
    cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='_SharpeRatio', timeframe=bt.TimeFrame.Days, annualize=True,
                        riskfreerate=0)  # 计算夏普比率
    # 交易统计信息,如获胜、失败次数
    cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='_TradeAnalyzer')


    result = cerebro.run()  # 遍历所有数据
    # 提取结果
    print('最终资金: %.2f' % cerebro.broker.getvalue())
    print("收益率: ",result[0].analyzers._Returns.get_analysis()['rtot'])
    print("--------------- 收益期间 -----------------")
    print(result[0].analyzers._TimeReturn.get_analysis())
    print("--------------- 最大回撤相关指标 -----------------")
    print(result[0].analyzers._DrawDown.get_analysis())
    print("--------------- 回撤期间 -----------------")
    print(result[0].analyzers._TimeDrawDown.get_analysis())
    print("夏普比率: ",result[0].analyzers._SharpeRatio.get_analysis()['sharperatio'])

    # 绘图
    cerebro.plot(style='candlestick')

策略部分:

class SmaCross(bt.Strategy):
    # 可配置策略参数
    params = dict(
        p1=20,  # 短期均线周期
        p2=60   # 长期均线周期
    )
    def __init__(self):
        sma1 = bt.ind.SMA(period=self.params.p1)  # 短期均线
        sma2 = bt.ind.SMA(period=self.params.p2)  # 长期均线
        self.crossover = bt.ind.CrossOver(sma1, sma2)  # 交叉信号
        self.order = None

    def notify_order(self, order):
        if order.status in [order.Completed]:
            if order.isbuy():
                print(
                    'BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
                    (order.executed.price,
                     order.executed.value,
                     order.executed.comm))
                self.buyprice = order.executed.price
                self.buycomm = order.executed.comm
            else:  # 卖
                print('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
                      (order.executed.price,
                       order.executed.value,
                       order.executed.comm))
            self.bar_executed = len(self)

    def next(self):
        if not self.position:
            if self.crossover > 0:
                self.buy(size=1)  # 买入
        elif self.crossover < 0:
            self.close()  # 卖出

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!下面是一个用Python编写的简单均线策略: ```python import pandas as pd import numpy as np # 读取数据 data = pd.read_csv('data.csv') # 假设数据存在data.csv文件中 # 计算短期和长期均线 data['SMA_short'] = data['Close'].rolling(window=10).mean() data['SMA_long'] = data['Close'].rolling(window=30).mean() # 生成交易信号 data['Signal'] = np.where(data['SMA_short'] > data['SMA_long'], 1, -1) # 计算持仓状态 data['Position'] = data['Signal'].diff() # 回测策略 data['Return'] = np.log(data['Close'] / data['Close'].shift(1)) data['StrategyReturn'] = data['Position'].shift() * data['Return'] # 计算累计收益率 data['CumulativeReturn'] = (1 + data['StrategyReturn']).cumprod() # 输出结果 print(data[['Close', 'Signal', 'Position', 'Return', 'StrategyReturn', 'CumulativeReturn']]) ``` 在上面的代码中,我们首先通过`pd.read_csv()`函数读取股票数据,然后使用`rolling()`函数计算短期均线和长期均线。接着,我们根据短期均线和长期均线的关系生成交易信号,当短期均线上穿长期均线时产生买入信号,当短期均线下穿长期均线时产生卖出信号。然后,我们计算持仓状态,并根据持仓状态和每日收益率计算策略收益率。最后,我们计算累计收益率并输出结果。 请注意,这只是一个简单的示例,实际的均线策略可能需要更复杂的规则和参数。另外,代码中使用的是股票数据,你可以根据自己的需求修改数据来源和计算方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值