感谢豆包AI帮我写代码,我才能接触到用Python做回测..

用户头像she**p
2025-11-05 发布

就是简单的超跌2个月买入2份,突破月高卖出1份这样....

选了沪深300、豆粕etf(和大盘不太相关)以及红利低波(这个算后视镜了)混合在一起,闲置资金买入招商双债

虽然收益不多,不过也算我做的第一个策略了哈哈,比放银行强些,回撤不大,占用资金也不多,平时基本半仓

收益&风险
源码

评论

用户头像
2025-11-05 01:20:33

很高兴能帮助您接触并尝试使用Python进行回测。针对您的需求,下面是一个简单的策略示例。这里我们设定一个超跌买入、突破高点卖出的策略,并将其与沪深300、豆粕ETF和红利低波组合在一起,同时使用闲置资金投资招商双债。请注意,这仅作为演示用代码,实际应用时需根据市场数据调整参数和逻辑以适应更复杂的交易环境。

首先,确保您已经安装了相关库并设置好回测引擎(如Backtrader或zipline等)。下面的策略基于Python语言,并使用pandas来处理数据:

from datetime import datetime, timedelta
import backtrader as bt

class MyStrategy(bt.Strategy):
    params = (
        ('lookback', 12),   # 使用最近几个月的数据进行分析(如12个月)
        ('amount_to_buy', 2),
        ('amount_to_sell', 1)
    )

    def __init__(self):
        self.price_history = []

    def start(self, data):
        first_update_date = datetime.now().replace(day=1) - timedelta(days=self.params['lookback'] * 30)
        for i in range(len(data)):
            if (data[i].datetime.date() >= first_update_date):
                self.price_history.append((data[i].open[0], data[i].date()))

    def next(self):
        # 检查是否有足够的历史数据来执行策略
        if len(self.price_history) < self.params['lookback']:
            return

        # 计算过去n个月的收盘价均值和标准差
        avg_price = sum([price for _, price in self.price_history]) / len(self.price_history)
        std_dev = (sum([(price - avg_price)**2 for _, price in self.price_history]) / len(self.price_history))**0.5

        # 如果价格低于平均价-1个标准差,买入
        if self.data[0] < (avg_price - std_dev):
            for i in range(self.params['amount_to_buy']):
                self.buy()
                log.info(f"买入 {self.params['amount_to_buy']} 份")

        # 如果价格高于过去n个月的最高价,卖出部分投资
        if self.data[0] > max([price for _, price in self.price_history]):
            sold_amount = int(self.broker.cash / self.data[0])
            self.close(sold_amount)
            log.info(f"卖出 {sold_amount} 份")

    def stop(self):
        # 可以在策略结束时执行一些清理操作或记录最终结果
        pass

# 设置参数和定义数据源
cerebro = bt.Cerebro()
cerebro.addstrategy(MyStrategy)

data1 = bt.feeds.YahooFinanceData(dataname='HS300', fromdate=datetime(2022, 1, 1), todate=datetime(2023, 5, 1))
data2 = bt.feeds.CsvData(dataname='SOYBEAN_FUTURES_22-23.csv')
data3 = bt.feeds.YahooFinanceData(dataname='MHP.A', fromdate=datetime(2022, 1, 1), todate=datetime(2023, 5, 1))
data4 = bt.feeds.YahooFinanceData(dataname='CIBK.MBS', fromdate=datetime(2022, 1, 1), todate=datetime(2023, 5, 1))

cerebro.adddata(data1)
cerebro.adddata(data2)
cerebro.adddata(data3)
cerebro.adddata(data4)

# 使用闲置资金
startcash = cerebro.broker.getvalue()
cerebro.broker.setcash(startcash)

cerebro.run()
final_value = cerebro.broker.getvalue()

print(f"最终资金:{final_value}")

这段代码使用了backtrader库,您可以根据自己的回测环境调整。确保您的数据源正确,并且在测试策略时考虑市场状况和风险控制。如果您需要进一步的帮助或有其他问题,请随时提问!

评论