惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Blog — PlanetScale
Blog — PlanetScale
爱范儿
爱范儿
MongoDB | Blog
MongoDB | Blog
腾讯CDC
aimingoo的专栏
aimingoo的专栏
月光博客
月光博客
Engineering at Meta
Engineering at Meta
C
Check Point Blog
N
Netflix TechBlog - Medium
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家
Microsoft Security Blog
Microsoft Security Blog
GbyAI
GbyAI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
The Blog of Author Tim Ferriss
Last Week in AI
Last Week in AI
B
Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
博客园 - 叶小钗
WordPress大学
WordPress大学
博客园 - 司徒正美

博客园 - 小y

HP-Socket压力测试例子,用恐怖如斯来形容。 经典分类算法KNN的研究 怎么让大模型查询本地数据库输出结果(Dify+豆包) OpenClaw工作原理解析【建议背诵】 AiAgent工具之网页搜索 怎么在百度搜索中屏蔽csdn 使用C#调用Yolo26模型的ONNX ESP32 使用MicroPython编写代码实现远程控制LED灯 使用Razor模板引擎实现自动生成代码 ESP32开发环境下载、USB驱动安装 2026年最新年会抽奖小程序 grafana+prometheus快速实现可视化大屏 PyAutoGUI库自动化测试脚本工具模拟键盘鼠标操作 性能卓越的开源时序数据库——QuestDB GitHub超 30000+ star , 超强大的开源项目Supervision DevExpress系列:dxValidationProvider和dxErrorProvider两种控件的用法和区别 实测:MySQL跑在Docker里会损失多少性能?寻找Docker优化点 用C# GDI编写粒子效果 动画图解嵌入式常见的通讯协议:SPI、I²C、UART、红外 C#中的MVVM框架 .net 9 中的WinUI3和MAUI有什么区别 Netty的高性能之道 一文搞定理解RPC CSS flex布局(弹性布局/弹性盒子) 为什么选择使用TypeScript?这篇文章讲透了
用python自己回测股票策略
小y · 2026-05-13 · via 博客园 - 小y
import tushare as ts
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np


def getDailyData(code, startDate, endDate):
    # ---------------------- 1. 初始化 Tushare ----------------------
    # 把这里替换成你自己的 TOKEN
    ts.set_token("你的key")
    pro = ts.pro_api()

    # ---------------------- 2. 获取 A 股日线数据 ----------------------
    # 示例:江波龙 301308.SZ
    # df = pro.daily(ts_code="301308.SZ", start_date="20260401", end_date="20260511")
    df = pro.daily(ts_code=code, start_date=startDate, end_date=endDate)

    # 按交易日期排序
    df = df.sort_values("trade_date")

    # ---------------------- 3. 查看数据 ----------------------
    print(df.head())
    return df


def drawPlot(df, *args):
    # 画图:以时间为X轴
    plt.figure(figsize=(10, 5))

    # 绘制股价收盘价,并添加图例标签:收盘价
    plt.plot(df['trade_date'], df['close'], linewidth=2, color='red', label='收盘价')

    # 循环绘制均线(args 是你传入的均线列名,如 ma5, ma10, svg_1 等)
    for arg in args:
        if arg in df.columns:
            # 绘制均线,并使用列名作为图例标签
            plt.plot(df['trade_date'], df[arg], '--', linewidth=2, label=arg)

    # ========== 添加图表标注信息 ==========
    plt.title('股价走势与均线图', fontsize=14, fontproperties='SimHei')  # 图表标题
    plt.xlabel('交易日期', fontsize=12, fontproperties='SimHei')  # X轴标签
    plt.ylabel('价格', fontsize=12, fontproperties='SimHei')  # Y轴标签

    # 显示图例(必须有 label 才会显示)
    plt.legend(prop={'family': 'SimHei'})  # 支持中文图例

    # 网格 + 日期旋转
    plt.grid(True)
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.show()

def strategy1(df):
    #双移动平均策略
    #复制一份用作策略计算
    strategy=pd.DataFrame(index=df.index)
    strategy['date']=df['trade_date']
    #添加一个signal字段,用来存储交易信号
    strategy['signal']=0
    #将5日均线存到avg_5
    strategy['avg_5']=df['close'].rolling(5).mean()
    #将10日均线存到avg_10
    strategy['avg_10']=df['close'].rolling(10).mean()
    #计算买入信号,当5日均值大于10日均值时设为1 反之为0
    strategy['signal']=np.where(strategy['avg_5']>strategy['avg_10'],1,0)
    #根据交易信号变化下单,当交易信号从0变为1时买入,当从1变为0时卖出
    strategy['order']=strategy['signal'].diff()
    print("--------------双移动平均策略-----------")
    print(strategy)
    return strategy
    
def strategytest(cash, df):
    # 回测
    # 执行双移动平均策略
    strategy = strategy1(df)

    # 初始启动资金
    initial_cash = cash

    # 新建一个 strategy 的拷贝 仓位表
    positions = pd.DataFrame(index=strategy.index)
    positions['stock'] = 0  # 初始持仓为 0

    # 设置最小买入 100 股
    positions['stock'] = strategy['signal'] * 100

    # 创建投资组合数据库
    portfolio = pd.DataFrame(index=strategy.index)

    # 持仓市值 = 持股数量 × 收盘价
    portfolio['stock value'] = positions['stock'] * df['close']

    # 仓位变化 = 下单的数量
    order = positions.diff()

    # 剩余资金 = 初始资金 - 累计下单金额
    portfolio['cash'] = initial_cash - (order['stock'] * df['close']).cumsum()

    # 总资产 = 现金 + 持仓市值
    portfolio['total'] = portfolio['cash'] + portfolio['stock value']

    # 打印结果
    print("--------------回测结果-----------")
    print(portfolio)

    return portfolio  # 可选:返回结果方便后续画图


if __name__ == '__main__':
    # 获取股票数据
    df = getDailyData('600276.SH', '20260401', '20260501')
    # 增加10日均线列
    df['avg_10'] = df['close'].rolling(10).mean()
    df['avg_5'] = df['close'].rolling(5).mean()
    # 画出来
    drawPlot(df, 'avg_10', 'avg_5')
    #执行双移动平均策略回测
    strategytest(20000,df)