以下是一个基于Tushare实现马丁策略的完整Python方案,结合了策略逻辑、数据获取、风险控制和回测演示:


🎯 一、马丁策略核心逻辑

马丁策略(逆向型)核心规则:

  1. 逢跌加仓:价格每下跌一定比例(如4%),加倍买入摊薄成本
  2. 止盈退出:总盈利达到预设比例(如30%)时清仓
  3. 止损机制:设置最大加仓层数(如3层),防止无限补仓
  4. 仓位控制:首仓不超过总资金10%-25%,预留补仓空间

📌 适用场景:震荡行情中的优质股(如招商银行、贵州茅台),避免单边下跌标的


📊 二、Tushare数据准备

import tushare as ts
import pandas as pd

# 初始化Tushare (需替换为你的token)
ts.set_token('你的Tushare Token')  
pro = ts.pro_api()

def get_stock_data(ts_code, start_date, end_date):
    """获取股票历史数据"""
    df = pro.daily(ts_code=ts_code, start_date=start_date, end_date=end_date)
    df['trade_date'] = pd.to_datetime(df['trade_date'])
    df = df.sort_values('trade_date').set_index('trade_date')
    df['pct_change'] = df['close'].pct_change()  # 计算日涨跌幅
    return df[['open', 'high', 'low', 'close', 'pct_change']]

# 示例:获取招商银行2024年数据
data = get_stock_data('600036.SH', '20240101', '20241231')

token 获取方式 点这里

⚙️ 三、策略实现代码

class MartingaleStrategy:
    def __init__(self, initial_cash=100000):
        self.cash = initial_cash
        self.shares = 0          # 持有股数
        self.avg_cost = 0        # 平均成本
        self.layer = 0            # 当前加仓层数
        self.max_layers = 3       # 最大加仓层数
        self.drop_threshold = -0.04  # 加仓阈值(下跌4%)
        self.profit_target = 0.3  # 止盈比例(30%)
    
    def execute_trade(self, price):
        # 首仓触发(初始建仓)
        if self.shares == 0 and self.cash > 0:
            self._buy(price, position_ratio=0.1)  # 首仓10%
        
        # 加仓条件:当前价格低于成本且满足跌幅阈值
        elif (price < self.avg_cost) and ((price - self.avg_cost)/self.avg_cost <= self.drop_threshold):
            if self.layer < self.max_layers:
                self._buy(price, position_ratio=0.2 * (2 ** self.layer))  # 按2倍递增加仓
                self.layer += 1
        
        # 止盈条件:当前盈利达标
        current_value = self.shares * price
        total_assets = self.cash + current_value
        if current_value > self.avg_cost * self.shares * (1 + self.profit_target):
            self._sell_all(price)
    
    def _buy(self, price, position_ratio):
        amount = min(self.cash * position_ratio, self.cash)  # 防止超买
        shares_to_buy = amount // price
        if shares_to_buy > 0:
            self.shares += shares_to_buy
            self.cash -= shares_to_buy * price
            # 更新平均成本
            self.avg_cost = (self.avg_cost * (self.shares - shares_to_buy) + price * shares_to_buy) / self.shares
    
    def _sell_all(self, price):
        self.cash += self.shares * price
        self.shares = 0
        self.avg_cost = 0
        self.layer = 0  # 重置状态

📈 四、策略回测演示

# 初始化策略
strategy = MartingaleStrategy(initial_cash=100000)
equity_curve = []  # 记录每日资产

for date, row in data.iterrows():
    current_price = row['close']
    strategy.execute_trade(current_price)
    # 计算当日总资产
    daily_equity = strategy.cash + strategy.shares * current_price
    equity_curve.append(daily_equity)

# 可视化结果
import matplotlib.pyplot as plt
plt.figure(figsize=(12,6))
plt.plot(data.index, data['close'], label='Price')
plt.plot(data.index, equity_curve, label='Equity', color='red')
plt.title("Martingale Strategy on 600036.SH (2024)")
plt.legend()
plt.show()

⚠️ 五、关键风险控制措施

  1. 最大加仓层数限制:避免无限补仓导致爆仓(建议≤5层)
  2. 首仓比例控制:初始仓位≤10%,预留至少3倍补仓资金
  3. 标的筛选原则
    • 只用于基本面稳定的蓝筹股(如沪深300成分股)
    • 避开高波动/ST股(单边下跌会致命)
  4. 动态止盈止损:根据波动率调整阈值(如ATR指标)

💡 改进建议:可结合布林带识别震荡区间,避免在趋势行情中使用


📂 六、完整代码扩展方向

  1. 增加数据缓存:使用df.to_csv()保存历史数据减少API调用
  2. 参数优化模块:用scipy.optimize测试不同阈值组合
  3. 多股票回测:遍历股票池批量执行(参考网页2方法)
  4. 实时交易集成:通过PTrade/券商API对接实盘

通过Tushare获取数据 + 马丁策略逻辑 + 严格风控,可实现自动化交易系统。

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐