当前位置:首页>python>用Python编写简单的量化策略

用Python编写简单的量化策略

  • 2026-09-10 15:21:12
用Python编写简单的量化策略

核心思路

双均线策略的核心逻辑:

  1. 计算两个不同周期的移动平均线(比如短期 5 日均线、长期 20 日均线)
  2. 金叉买入
    :短期均线上穿长期均线时,买入标的
  3. 死叉卖出
    :短期均线下穿长期均线时,卖出标的
  4. 回测该策略在历史数据上的表现

准备工作

1. 安装必要库

我们需要用Tushare获取股票数据,Pandas处理数据,Matplotlib可视化结果:

bash

运行pip install tushare pandas matplotlib

2. 获取 Tushare token(可选)

Tushare 需要注册获取 token 才能获取数据:

  • 注册地址:https://tushare.pro/register
  • 注册后在个人主页复制 token

完整代码实现

python

运行import tushare as tsimport pandas as pdimport matplotlib.pyplot as plt# -------------------------- 1. 配置参数 --------------------------# 设置Tushare token(替换成你的token)ts.set_token('你的Tushare Token')pro = ts.pro_api()# 策略参数STOCK_CODE ='000001.SZ'# 平安银行START_DATE ='20220101'# 回测开始日期END_DATE ='20240101'# 回测结束日期SHORT_PERIOD =5# 短期均线周期LONG_PERIOD =20# 长期均线周期INIT_CASH =100000# 初始资金# -------------------------- 2. 获取历史数据 --------------------------defget_stock_data(code, start_date, end_date):"""获取股票日K线数据"""# 获取日线数据    df = pro.daily(ts_code=code, start_date=start_date, end_date=end_date)# 按日期升序排列    df = df.sort_values('trade_date').reset_index(drop=True)# 转换日期格式    df['trade_date']= pd.to_datetime(df['trade_date'])# 重命名列(方便后续处理)    df.rename(columns={'close':'price'}, inplace=True)return df# -------------------------- 3. 实现双均线策略 --------------------------defma_strategy(df, short_period, long_period):"""    实现双均线策略    返回包含买卖信号的DataFrame    """# 计算移动平均线    df['short_ma']= df['price'].rolling(window=short_period).mean()    df['long_ma']= df['price'].rolling(window=long_period).mean()# 生成买卖信号:1=买入,-1=卖出,0=无操作    df['signal']=0# 金叉:短期均线上穿长期均线(买入)    df.loc[df['short_ma']> df['long_ma'],'signal']=1# 死叉:短期均线下穿长期均线(卖出)    df.loc[df['short_ma']< df['long_ma'],'signal']=-1# 只保留信号变化的点(避免重复买卖)    df['signal']= df['signal'].diff()    df.loc[df['signal']==0,'signal']=Nonereturn df# -------------------------- 4. 回测策略 --------------------------defbacktest_strategy(df, init_cash):"""回测策略,计算收益"""    cash = init_cash  # 现金    position =0# 持仓数量    total_asset = init_cash  # 总资产(现金+持仓市值)# 记录每日资产    df['total_asset']= init_cashfor i inrange(len(df)):        price = df.iloc[i]['price']        signal = df.iloc[i]['signal']# 买入信号if signal ==1and cash >0:            position = cash // price  # 用全部现金买入(取整)            cash -= position * price  # 扣除买入成本# 卖出信号elif signal ==-1and position >0:            cash += position * price  # 卖出持仓,回笼现金            position =0# 计算当日总资产        total_asset = cash + position * price        df.iloc[i, df.columns.get_loc('total_asset')]= total_asset# 计算策略收益    total_return =(df.iloc[-1]['total_asset']- init_cash)/ init_cash *100# 计算基准收益(买入持有)    benchmark_return =(df.iloc[-1]['price']- df.iloc[0]['price'])/ df.iloc[0]['price']*100print(f"策略总收益: {total_return:.2f}%")print(f"基准收益(买入持有): {benchmark_return:.2f}%")print(f"最终总资产: {df.iloc[-1]['total_asset']:.2f} 元")return df# -------------------------- 5. 可视化结果 --------------------------defplot_result(df):"""可视化策略结果"""    plt.rcParams['font.sans-serif']=['SimHei']# 显示中文    plt.figure(figsize=(12,8))# 子图1:股价和均线    ax1 = plt.subplot(2,1,1)    ax1.plot(df['trade_date'], df['price'], label='股价', color='blue')    ax1.plot(df['trade_date'], df['short_ma'], label=f'{SHORT_PERIOD}日均线', color='red')    ax1.plot(df['trade_date'], df['long_ma'], label=f'{LONG_PERIOD}日均线', color='green')# 标记买卖点    buy_points = df[df['signal']==1]    sell_points = df[df['signal']==-1]    ax1.scatter(buy_points['trade_date'], buy_points['price'], marker='^', color='red', s=100, label='买入')    ax1.scatter(sell_points['trade_date'], sell_points['price'], marker='v', color='green', s=100, label='卖出')    ax1.set_title(f'{STOCK_CODE} 双均线策略回测')    ax1.set_ylabel('价格(元)')    ax1.legend()    ax1.grid(True)# 子图2:总资产变化    ax2 = plt.subplot(2,1,2)    ax2.plot(df['trade_date'], df['total_asset'], label='策略总资产', color='purple')    ax2.set_xlabel('日期')    ax2.set_ylabel('总资产(元)')    ax2.legend()    ax2.grid(True)    plt.tight_layout()    plt.show()# -------------------------- 执行策略 --------------------------if __name__ =='__main__':# 1. 获取数据    stock_data = get_stock_data(STOCK_CODE, START_DATE, END_DATE)# 2. 生成策略信号    stock_data = ma_strategy(stock_data, SHORT_PERIOD, LONG_PERIOD)# 3. 回测策略    stock_data = backtest_strategy(stock_data, INIT_CASH)# 4. 可视化结果    plot_result(stock_data)

代码关键部分解释

1. 数据获取

get_stock_data函数通过 Tushare 获取股票的日 K 线数据,包含开盘价、收盘价、成交量等,核心是pro.daily()接口。

2. 策略逻辑

ma_strategy函数:

  • 用rolling().mean()计算移动平均线
  • 生成买卖信号:金叉(1)、死叉(-1)
  • 用diff()过滤重复信号,只保留信号变化的点

3. 回测核心

backtest_strategy函数模拟真实交易:

  • 记录现金、持仓数量、总资产
  • 按信号执行买卖操作
  • 计算策略收益和基准收益(买入持有)

4. 可视化

plot_result函数把股价、均线、买卖点、总资产变化可视化,直观展示策略效果。

运行注意事项

  1. 替换 Token
    :必须把代码中的你的Tushare Token替换成自己的 token,否则无法获取数据
  2. 调整参数
    :可以修改股票代码(如600036.SH招商银行)、均线周期(如 10/30)、初始资金
  3. 数据范围
    :Tushare 免费版能获取的历史数据有限,如需更多数据可升级权限

策略优化方向(进阶)

  1. 加入止损止盈
    :比如亏损 10% 强制卖出,盈利 20% 止盈
  2. 仓位管理
    :不一次性满仓,比如每次买入 50% 仓位
  3. 多因子策略
    :结合成交量、MACD 等指标过滤假信号
  4. 手续费模拟
    :加入佣金、印花税等真实交易成本

最新文章

随机文章