附录C 最小可运行Python代码示例

273页 · 预计6

以下为简化版核心代码,可直接运行,包含数据获取、四维评分、每日回测三个核心模块,参数可自行调整。

import tushare as ts
import pandas as pd
import numpy as np
from datetime import datetime, timedelta

# 初始化Tushare
pro = ts.pro_api('你的token')

# ========== 1. 获取基础行情数据 ==========
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 = df.sort_values('trade_date').reset_index(drop=True)
    # 计算252日回撤
    df['high_252d'] = df['high'].rolling(252, min_periods=60).max()
    df['retrace'] = (df['close'] - df['high_252d']) / df['high_252d']
    return df

# ========== 2. 简化四维评分 ==========
def calc_four_dim_score(df, date_idx):
    row = df.loc[date_idx]
    score = 0
    
    # 技术面:超跌得分(15%权重)
    retrace = abs(row['retrace'])
    if retrace < 0.15:
        tech_score = 0
    else:
        tech_score = min(100, max(0, (retrace - 0.15) / 0.3 * 100))
    score += 0.15 * tech_score
    
    # 基本面:营收增速(简化版,20%权重)
    # 实际使用请接入财务数据,这里示例用波动率替代演示
    fund_score = min(100, max(0, 50 + row['pct_chg'] * 2))
    score += 0.2 * fund_score
    
    # 资金面:量价配合(简化版,25%权重)
    vol_ratio = row['vol'] / df['vol'].iloc[date_idx-20:date_idx].mean()
    money_score = min(100, max(0, vol_ratio * 30))
    score += 0.25 * money_score
    
    # 产业面:示例默认60分,实际使用接入赛道标签(40%权重)
    industry_score = 60
    score += 0.4 * industry_score
    
    return score

# ========== 3. 简单回测主循环 ==========
def simple_backtest(ts_code, start_date, end_date, initial_cash=100000):
    df = get_stock_data(ts_code, start_date, end_date)
    cash = initial_cash
    shares = 0
    nav_list = []
    
    for i in range(252, len(df)):
        date = df.loc[i, 'trade_date']
        close = df.loc[i, 'close']
        
        # 计算前一日评分,决定次日买卖
        prev_score = calc_four_dim_score(df, i-1)
        
        # 买入条件:评分>60且无持仓
        if prev_score > 60 and shares == 0:
            shares = int(cash / close / 100) * 100
            cost = shares * close * 1.00025  # 买入成本
            cash -= cost
        
        # 卖出条件:评分<50且有持仓
        elif prev_score < 50 and shares > 0:
            amount = shares * close * 0.99975  # 卖出扣除成本
            cash += amount
            shares = 0
        
        # 计算当日净值
        nav = cash + shares * close
        nav_list.append({'date': date, 'nav': nav})
    
    return pd.DataFrame(nav_list)

# 示例运行
if __name__ == '__main__':
    result = simple_backtest('000001.SZ', '20200101', '20231231')
    print(result.tail())

注:以上为最小演示代码,完整产业标签、资金流向、财务数据、交易规则、风控熔断模块,可访问intoquant.com获取完整版。

⚠️ 风险提示:本书内容仅为量化研究与知识分享,不构成任何投资建议。套利交易存在基差、费率、流动性、平台与极端行情等风险,历史表现不代表未来收益。投资有风险,入市需谨慎,请自主决策、量力而行。

💡 键盘 ←/→ 翻章 · T 键切换目录