# 2201210594-胡慧娟子- python期末课程报告 **Repository Path**: unique999/python-homework ## Basic Information - **Project Name**: 2201210594-胡慧娟子- python期末课程报告 - **Description**: 2201210594- python期末-量化回测代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-12-03 - **Last Updated**: 2022-12-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Python课程报告 #### 介绍 python期末作业-量化回测源代码 #### 代码说明 **(1)输入:** 目标持仓表,Sample Target、Sample Target1、Sample Target2。 **(2)输出:** 相关的统计指标及图表,包括总PNL、总费后PNL、总累计费后PNL、总累计费用、每日成交额、Sharp Ratio、Turn Over、Avg leverage,并绘制累计费后PNL与日期的折线图,具体详见代码注释。 **(3)结果:** 根据每一张目标持仓表,输出的图表如下图,包括Sample Target、Sample Target1、Sample Target2三张图表,图中折线为总累计费后PNL,标题中包含Sharp Ratio、Turn Over、Avg leverage三个计算指标。 **(4)文件路径:** “期末作业题/SampleTarget.csv”、“期末作业题/1m/a.ft”,运行代码需要更改读取文件的路径,更改为本地电脑存放文件的路径。 #### 源代码 ```python import numpy as np import pandas as pd from datetime import * import matplotlib.pyplot as plt import os # 输入target对应的csv文件名 filename=input() base_url = r'期末作业题' total_file_name = os.path.join(base_url, filename) # 计算SampleTarget2策略的指标,并返回一个df表格 def deal_data3(ft_name, st): # 读取单个1m主力期货数据 df = pd.read_feather(r'期末作业题/1m' + "/" + ft_name + ".ft") x_clz_daily_backtest = pd.merge(st, df, how="left") x_clz_daily_backtest = x_clz_daily_backtest.loc[:, ['trading_day', 'timestamp', ft_name, 'clz']] x_clz_daily_backtest = x_clz_daily_backtest.rename(columns={ft_name: "st_x"}) # 读取每一成交时点的收盘价(成交价) x_clz_daily_backtest = x_clz_daily_backtest.rename(columns={"clz": "clz_x"}) x_clz_daily_backtest = x_clz_daily_backtest.set_index('trading_day') # 把分钟线合成日收盘价 x_clz_daily = df.pivot_table(index='trading_day', values='clz', aggfunc='last') # 使用x_clz_daily_backtest来存放clz、st_x等数据 x_clz_daily_backtest = pd.merge(x_clz_daily_backtest, x_clz_daily, how="left", left_index=True, right_index=True) x_clz_daily_backtest = x_clz_daily_backtest.rename(columns={"clz": "clz_last"}) x_clz_daily_backtest['clz_last_temp'] = x_clz_daily_backtest['clz_last'].shift(1, axis=0) # 计算上一交易日收盘~当日交易时点的涨跌 x_clz_daily_backtest['lv1'] = x_clz_daily_backtest.apply(lambda x: (x['clz_x'] - x['clz_last_temp']) / x['clz_last_temp'], axis=1) # 计算当日交易试点~当日收盘的涨跌 x_clz_daily_backtest['lv2'] = x_clz_daily_backtest.apply(lambda x: (x['clz_last'] - x['clz_x']) / x['clz_x'],axis=1) # 计算每日收盘市值 x_clz_daily_backtest['value_last'] = x_clz_daily_backtest.apply(lambda x: x['st_x'] * (x['lv2'] + 1), axis=1) x_clz_daily_backtest['value_last_temp'] = x_clz_daily_backtest['value_last'].shift(1, axis=0) # 计算交易时点实际市值 x_clz_daily_backtest['value_real'] = x_clz_daily_backtest.apply(lambda x: (1 + x['lv1']) * x['value_last_temp'],axis=1) # 计算损益=上一收盘日到交易时点的损益+今日持仓损益 x_clz_daily_backtest['pnl_x'] = x_clz_daily_backtest.apply(lambda x: x['value_last_temp'] * x['lv1'] + x['st_x'] * x['lv2'], axis=1) # 计算成交额 x_clz_daily_backtest['trade_value_x'] = x_clz_daily_backtest.apply(lambda x: abs(x['st_x'] - x['value_real']), axis=1) # 手续费 x_clz_daily_backtest['commit'] = x_clz_daily_backtest.apply(lambda x: x['trade_value_x'] * 0.0003, axis=1) # 费后净损益 x_clz_daily_backtest['pnl_net_x'] = x_clz_daily_backtest.apply(lambda x: x['pnl_x'] - x['commit'], axis=1) return x_clz_daily_backtest # 计算SampleTarget和SampleTarget1策略的指标,并返回一个df表格 def deal_data(ft_name, st): # 读取单个1m主力期货数据 df = pd.read_feather(r'期末作业题/1m' + "/" + ft_name + ".ft") # clz:收盘价 clz = df.loc[:, ['trading_day', 'timestamp', 'clz']] # 目标市值 st_x = st.loc[:, ['trading_day', 'timestamp', ft_name]] # 把分钟线合成日收盘价 x_clz_daily = clz.pivot_table(index='trading_day', values='clz', aggfunc='last') # 使用x_clz_daily_backtest来存放clz、st_x等数据 x_clz_daily_backtest = x_clz_daily st_x_backtest = st_x.loc[:, ['trading_day', ft_name]] st_x_backtest = st_x_backtest.set_index('trading_day') # 读取单一品种x的目标市值 x_clz_daily_backtest['st_x'] = st_x_backtest[ft_name] x_clz_daily_backtest['diff'] = x_clz_daily_backtest['clz'].diff() # 使用clz计算单一品种的涨跌 x_clz_daily_backtest['lv2'] = x_clz_daily_backtest.apply(lambda x: 1 + x['diff'] / (x['clz'] - x['diff']),axis=1) #增长率+1 x_clz_daily_backtest['real_st_x_temp'] = x_clz_daily_backtest['st_x'].shift(1, axis=0) x_clz_daily_backtest['real_st_x'] = x_clz_daily_backtest.apply(lambda x: x['lv2'] * x['real_st_x_temp'],axis=1) # 当日的实际市值 x_clz_daily_backtest['pnl_x'] = x_clz_daily_backtest.apply(lambda x: x['real_st_x'] - x['real_st_x_temp'],axis=1) #损益 x_clz_daily_backtest['trade_value_x'] = x_clz_daily_backtest.apply(lambda x: abs(x['real_st_x'] - x['st_x']),axis=1) #当日的成交额 x_clz_daily_backtest['commit'] = x_clz_daily_backtest.apply(lambda x: x['trade_value_x'] * 0.0003, axis=1) #手续费 x_clz_daily_backtest['pnl_net_x'] = x_clz_daily_backtest.apply(lambda x: x['pnl_x'] - x['commit'],axis=1) #扣除手续费后的损益 return x_clz_daily_backtest st = pd.read_csv(total_file_name) # 读取策略csv文件 total_st_x = pd.DataFrame() # 存放全品种目标市值AvgLeverage total_trade_value_x = pd.DataFrame() #存放全品种成交额TurnOver total_pnl_net_x = pd.DataFrame() # 存放全品种费后净损益pnl_net if filename[-5] == "2": for ft_name in st.columns.values[2:]: x_data = deal_data3(ft_name, st) total_st_x[ft_name] = x_data['st_x'] total_trade_value_x[ft_name] = x_data['trade_value_x'] total_pnl_net_x[ft_name] = x_data['pnl_net_x'] factor = 1.0 elif filename[-5] == "1": for ft_name in st.columns.values[2:]: x_data = deal_data(ft_name, st) total_st_x[ft_name] = x_data['st_x'] total_trade_value_x[ft_name] = x_data['trade_value_x'] total_pnl_net_x[ft_name] = x_data['pnl_net_x'] factor = 1000000.0 else: for ft_name in st.columns.values[2:]: x_data = deal_data(ft_name, st) total_st_x[ft_name] = x_data['st_x'] total_trade_value_x[ft_name] = x_data['trade_value_x'] total_pnl_net_x[ft_name] = x_data['pnl_net_x'] factor = 1.0 total_st_x['sum'] = total_st_x.sum(axis=1) # 全品种目标市值合计数 total_trade_value_x['sum'] = total_trade_value_x.sum(axis=1) # 全品种成交额合计数 total_pnl_net_x['sum'] = total_pnl_net_x.sum(axis=1) # 全品种费后净损益合计数 cum_sum = total_pnl_net_x.cumsum(axis=0, )['sum'] total_pnl_net_x['cum_sum'] = cum_sum # 累计收益 # 累计收益率 total_pnl_net_x['earning_rate'] = total_pnl_net_x.apply(lambda x: x['cum_sum'] / factor, axis=1) # 夏普比率 earning_rate_mean = total_pnl_net_x['sum'].mean() fangcha_earning_rate = total_pnl_net_x['sum'].std() sharp_ratio = (earning_rate_mean) / fangcha_earning_rate * 15.8 # 平均换手率 turn_over = total_trade_value_x['sum'].mean() / factor # 平均资金占用率 avg_leverage = total_st_x['sum'].mean() / factor # 绘制图表 total_pnl_net_x['date'] = total_pnl_net_x.index.values total_pnl_net_x = total_pnl_net_x.dropna(thresh=5) x = total_pnl_net_x['date'].apply(lambda x: datetime.strptime(str(x), '%Y%m%d')) y = total_pnl_net_x['earning_rate'] plt.figure(figsize=(12, 8)) plt.plot(x, y, label='pnl_net') plt.xlabel("trade_day") plt.title( "SharpRatio : {:.4f}, TurnOver : {:.4f}, AvgLeverage : {:.4f}".format(sharp_ratio, turn_over, avg_leverage)) plt.legend() plt.show() ```