用python自己回测股票策略

发布时间:2026/7/2 2:36:43

用python自己回测股票策略 安装pandas金融数据库1pip install pandas_datareader--upgrade测试pandasIn [4]:12importpandas_datareader as webweb.__version__Out[4]:0.10.0安装tushare国内K线数据源In [5]:1!pip install tushare测试获取贵州茅台的数据1234567891011121314151617181920importtushare as ts# ---------------------- 1. 初始化 Tushare ----------------------# 把这里替换成你自己的 TOKENts.set_token(你的key)prots.pro_api()# ---------------------- 2. 获取 A 股日线数据 ----------------------# 示例贵州茅台 600519.SHdfpro.daily(ts_code600519.SH, start_date20260401, end_date20260511)# 按交易日期排序dfdf.sort_values(trade_date)# ---------------------- 3. 查看数据 ----------------------print( A股数据前5行 )print(df.head())# 保存数据#df.to_csv(600519.csv, indexFalse) A股数据前5行 ts_code trade_date open high low close pre_close \ 3 600519.SH 20260506 1365.10 1379.00 1360.05 1375.00 1384.79 2 600519.SH 20260507 1375.00 1388.00 1370.01 1371.05 1375.00 1 600519.SH 20260508 1371.66 1382.77 1370.00 1372.99 1371.05 0 600519.SH 20260511 1372.89 1372.89 1361.00 1361.33 1372.99 change pct_chg vol amount 3 -9.79 -0.7070 47806.04 6550750.940 2 -3.95 -0.2873 40461.47 5573286.315 1 1.94 0.1415 33368.53 4582855.939 0 -11.66 -0.8492 57135.10 7790721.392测试根据数据画K线图我们发现tushare接口稳定且返回迅速。可查询时间范围也远超akshare。123456789101112131415161718192021importtushare as tsimportmatplotlib.pyplot as pltimportpandas as pdts.set_token(你的key)prots.pro_api()dfpro.daily(ts_code600519.SH, start_date20260401, end_date20260511)dfdf.sort_values(trade_date)# 时间转换必须加这行X轴才会正常显示df[trade_date]pd.to_datetime(df[trade_date])# 画图以时间为X轴plt.figure(figsize(10,5))plt.plot(df[trade_date], df[close], linewidth2, colorred)plt.grid(True)plt.xticks(rotation45)#plt.title(茅台收盘价)plt.tight_layout()plt.show()策略1连续3日机构进入的Top5由于tushare龙虎榜数据需要购买权限才能访问此接口调用不成功。可换akshare接口。akshare接口虽然可以调用龙虎榜数据但日线数据非常不稳定经常返回Connection aborted.12345importtushare as tsts.set_token(你的key)prots.pro_api()dfpro.top_inst(trade_date20260511)print(df)--------------------------------------------------------------------------- Exception Traceback (most recent call last) Cell In[24], line 4 2 ts.set_token(你的key) 3 pro ts.pro_api() ---- 4 df pro.top_inst(trade_date20260511) 5 print(df) File ~\AppData\Roaming\Python\Python312\site-packages\tushare\pro\client.py:46, in DataApi.query(self, api_name, fields, **kwargs) 44 result json.loads(res.text) 45 if result[code] ! 0: --- 46 raise Exception(result[msg]) 47 data result[data] 48 columns data[fields] Exception: 抱歉您没有接口(top_inst)访问权限权限的具体详情访问https://tushare.pro/document/1?doc_id108。12345678910111213141516171819202122importakshare as akimportpandas as pd# 获取区间龙虎榜数据dfak.stock_lhb_detail_em(start_date20260506, end_date20260510)# 确保净买额为数值df[龙虎榜净买额]pd.to_numeric(df[龙虎榜净买额], errorscoerce)# 核心逻辑 # 1. 先按【日期 净买额】排序# 2. 按日期分组每组只取前 5 名df_result(df.sort_values([上榜日,龙虎榜净买额], ascending[True,False]).groupby(上榜日).head(5)# 每日只保留前5[[上榜日,代码,名称,龙虎榜净买额,涨跌幅,上榜原因]])# 打印输出print( 每日龙虎榜净买额 TOP5 )print(df_result.to_string(indexFalse)) 每日龙虎榜净买额 TOP5 上榜日 代码 名称 龙虎榜净买额 涨跌幅 上榜原因 2026-05-06 301308 江波龙 1.935484e09 19.9990 日涨幅达到15%的前5只证券 2026-05-06 000338 潍柴动力 1.131065e09 10.0000 日涨幅偏离值达到7%的前5只证券 2026-05-06 001309 德明利 5.669867e08 9.9998 日涨幅偏离值达到7%的前5只证券 2026-05-06 300166 东方国信 4.850638e08 20.0130 日涨幅达到15%的前5只证券 2026-05-06 601016 节能风电 4.385411e08 10.0939 有价格涨跌幅限制的日收盘价格涨幅偏离值达到7%的前五只证券 2026-05-07 000066 中国长城 1.155660e09 10.0000 连续三个交易日内涨幅偏离值累计达到20%的证券 2026-05-07 000066 中国长城 5.317460e08 10.0000 日涨幅偏离值达到7%的前5只证券 2026-05-07 002342 巨力索具 4.971131e08 9.9950 日换手率达到20%的前5只证券 2026-05-07 002342 巨力索具 4.971131e08 9.9950 日涨幅偏离值达到7%的前5只证券 2026-05-07 301171 易点天下 4.264262e08 20.0112 日涨幅达到15%的前5只证券 2026-05-08 600522 中天科技 2.040058e09 6.5659 非ST、*ST和S证券连续三个交易日内收盘价格涨幅偏离值累计达到20%的证券 2026-05-08 600498 烽火通信 1.280115e09 9.9961 非ST、*ST和S证券连续三个交易日内收盘价格涨幅偏离值累计达到20%的证券 2026-05-08 000547 航天发展 7.214594e08 10.0080 日涨幅偏离值达到7%的前5只证券 2026-05-08 600589 大位科技 4.965516e08 10.0264 非ST、*ST和S证券连续三个交易日内收盘价格涨幅偏离值累计达到20%的证券 2026-05-08 603256 宏和科技 4.396742e08 3.3030 非ST、*ST和S证券连续三个交易日内收盘价格涨幅偏离值累计达到20%的证券策略2 双移动平均策略最简单的策略当5日均线超过10日均线时买入当5日均线下穿10日均线时卖出。123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118importtushare as tsimportmatplotlib.pyplot as pltimportpandas as pdimportnumpy as npdefgetDailyData(code, startDate, endDate):# ---------------------- 1. 初始化 Tushare ----------------------# 把这里替换成你自己的 TOKENts.set_token(你的key)prots.pro_api()# ---------------------- 2. 获取 A 股日线数据 ----------------------# 示例江波龙 301308.SZ# df pro.daily(ts_code301308.SZ, start_date20260401, end_date20260511)dfpro.daily(ts_codecode, start_datestartDate, end_dateendDate)# 按交易日期排序dfdf.sort_values(trade_date)# ---------------------- 3. 查看数据 ----------------------print(df.head())returndfdefdrawPlot(df,*args):# 画图以时间为X轴plt.figure(figsize(10,5))# 绘制股价收盘价并添加图例标签收盘价plt.plot(df[trade_date], df[close], linewidth2, colorred, label收盘价)# 循环绘制均线args 是你传入的均线列名如 ma5, ma10, svg_1 等forarginargs:ifargindf.columns:# 绘制均线并使用列名作为图例标签plt.plot(df[trade_date], df[arg],--, linewidth2, labelarg)# 添加图表标注信息 plt.title(股价走势与均线图, fontsize14, fontpropertiesSimHei)# 图表标题plt.xlabel(交易日期, fontsize12, fontpropertiesSimHei)# X轴标签plt.ylabel(价格, fontsize12, fontpropertiesSimHei)# Y轴标签# 显示图例必须有 label 才会显示plt.legend(prop{family:SimHei})# 支持中文图例# 网格 日期旋转plt.grid(True)plt.xticks(rotation45)plt.tight_layout()plt.show()defstrategy1(df):#双移动平均策略#复制一份用作策略计算strategypd.DataFrame(indexdf.index)strategy[date]df[trade_date]#添加一个signal字段用来存储交易信号strategy[signal]0#将5日均线存到avg_5strategy[avg_5]df[close].rolling(5).mean()#将10日均线存到avg_10strategy[avg_10]df[close].rolling(10).mean()#计算买入信号当5日均值大于10日均值时设为1 反之为0strategy[signal]np.where(strategy[avg_5]strategy[avg_10],1,0)#根据交易信号变化下单当交易信号从0变为1时买入当从1变为0时卖出strategy[order]strategy[signal].diff()print(--------------双移动平均策略-----------)print(strategy)returnstrategydefstrategytest(cash, df):# 回测# 执行双移动平均策略strategystrategy1(df)# 初始启动资金initial_cashcash# 新建一个 strategy 的拷贝 仓位表positionspd.DataFrame(indexstrategy.index)positions[stock]0# 初始持仓为 0# 设置最小买入 100 股positions[stock]strategy[signal]*100# 创建投资组合数据库portfoliopd.DataFrame(indexstrategy.index)# 持仓市值 持股数量 × 收盘价portfolio[stock value]positions[stock]*df[close]# 仓位变化 下单的数量orderpositions.diff()# 剩余资金 初始资金 - 累计下单金额portfolio[cash]initial_cash-(order[stock]*df[close]).cumsum()# 总资产 现金 持仓市值portfolio[total]portfolio[cash]portfolio[stock value]# 打印结果print(--------------回测结果-----------)print(portfolio)returnportfolio# 可选返回结果方便后续画图if__name____main__:# 获取股票数据dfgetDailyData(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)ts_code trade_date open high low close pre_close change \ 20 600276.SH 20260401 56.03 57.78 55.60 57.73 55.22 2.51 19 600276.SH 20260402 57.74 58.35 57.01 57.37 57.73 -0.36 18 600276.SH 20260403 56.98 56.99 56.10 56.38 57.37 -0.99 17 600276.SH 20260407 56.51 56.85 55.00 56.12 56.38 -0.26 16 600276.SH 20260408 57.01 57.64 55.91 57.45 56.12 1.33 pct_chg vol amount 20 4.5455 1005516.56 5750559.322 19 -0.6236 765169.85 4415860.425 18 -1.7256 454916.05 2569466.951 17 -0.4612 401466.88 2244163.329 16 2.3699 734462.90 4189267.319--------------双移动平均策略-----------date signal avg_5 avg_10 order 20 20260401 0 NaN NaN NaN 19 20260402 0 NaN NaN 0.0 18 20260403 0 NaN NaN 0.0 17 20260407 0 NaN NaN 0.0 16 20260408 0 57.010 NaN 0.0 15 20260409 0 56.856 NaN 0.0 14 20260410 0 56.794 NaN 0.0 13 20260413 0 56.558 NaN 0.0 12 20260414 0 56.570 NaN 0.0 11 20260415 0 56.626 56.818 0.0 10 20260416 0 56.728 56.792 0.0 9 20260417 0 56.582 56.688 0.0 8 20260420 1 56.810 56.684 1.0 7 20260421 1 56.724 56.647 0.0 6 20260422 0 56.266 56.446 -1.0 5 20260423 0 56.052 56.390 0.0 4 20260424 0 55.996 56.289 0.0 3 20260427 0 55.804 56.307 0.0 2 20260428 0 55.622 56.173 0.0 1 20260429 0 55.532 55.899 0.0 0 20260430 0 55.028 55.540 0.0 --------------回测结果----------- stock value cash total 20 0.0 NaN NaN 19 0.0 20000.0 20000.0 18 0.0 20000.0 20000.0 17 0.0 20000.0 20000.0 16 0.0 20000.0 20000.0 15 0.0 20000.0 20000.0 14 0.0 20000.0 20000.0 13 0.0 20000.0 20000.0 12 0.0 20000.0 20000.0 11 0.0 20000.0 20000.0 10 0.0 20000.0 20000.0 9 0.0 20000.0 20000.0 8 5634.0 14366.0 20000.0 7 5575.0 14366.0 19941.0 6 0.0 19910.0 19910.0 5 0.0 19910.0 19910.0 4 0.0 19910.0 19910.0 3 0.0 19910.0 19910.0 2 0.0 19910.0 19910.0 1 0.0 19910.0 19910.0 0 0.0 19910.0 19910.0

相关新闻