核心思路
双均线策略的核心逻辑:
- 计算两个不同周期的移动平均线(比如短期 5 日均线、长期 20 日均线)
- 金叉买入
- 死叉卖出
准备工作
1. 安装必要库
我们需要用Tushare获取股票数据,Pandas处理数据,Matplotlib可视化结果:
bash
运行pip install tushare pandas matplotlib
2. 获取 Tushare token(可选)
Tushare 需要注册获取 token 才能获取数据:
- 注册地址:https://tushare.pro/register
完整代码实现
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函数:
3. 回测核心
backtest_strategy函数模拟真实交易:
4. 可视化
plot_result函数把股价、均线、买卖点、总资产变化可视化,直观展示策略效果。
运行注意事项
- 替换 Token:必须把代码中的
你的Tushare Token替换成自己的 token,否则无法获取数据 - 调整参数:可以修改股票代码(如
600036.SH招商银行)、均线周期(如 10/30)、初始资金 - 数据范围:Tushare 免费版能获取的历史数据有限,如需更多数据可升级权限
策略优化方向(进阶)
- 加入止损止盈
- 仓位管理
- 多因子策略
- 手续费模拟