2022美赛 C题 交易策略Python实现的baseline
Posted Better Bench
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022美赛 C题 交易策略Python实现的baseline相关的知识,希望对你有一定的参考价值。
目录
更新时间:2022-2-20 10:30
相关链接
完整代码和参考文献下载
https://mianbaoduo.com/o/bread/YpeclJhr
1 题目
要求开发一个模型, 这个模型只使用到目前为止的过去的每日价格流来确定,每天应该买入、 持有还是卖出他们投资组合中的资产。
2016 年 9 月 11 日, 将从 1000 美元开始。 将使用五年交易期, 从 2016 年 9 月 11 日到2021 年 9 月 10 日。 在每个交易日, 交易者的投资组合将包括现金、 黄金和比特币[C, G, B],分别是美元、 金衡盎司和比特币。 初始状态为[1000,0,0]。 每笔交易(购买或销售)的佣金是交易金额的α%。 假设
α
g
o
l
d
\\alpha _gold
αgold= 1%,
α
b
i
t
c
o
i
n
\\alpha_bitcoin
αbitcoin = 2%。 持有资产没有成本。
请注意, 比特币可以每天交易, 但黄金只在市场开放的日子交易(即周末不交易), 这反映在定价数据文件LBMA-GOLD.csv 和 BCHAIN-MKPRU.csv 中。 你的模型应该考虑到这个交易计划, 但在建模过程中你只能使用其中之一。
-
开发一个模型, 仅根据当天的价格数据给出最佳的每日交易策略。 使用你的模型和策略,
在 2021 年 9 月 10 日最初的 1000 美元投资价值多少? -
提供证据证明你的模型提供了最佳策略。
-
确定该策略对交易成本的敏感度。 交易成本如何影响战略和结果?
-
将你的策略、 模型和结果以一份不超过两页的备忘录的形式传达给交易者。
注意: 您的 PDF 总页数不超过 25 页, 解决方案应包括: -
一页摘要表。 目录。 完整的解决方案。 一到两页附录。 参考文献。
注:MCM 竞赛有 25 页的限制。 您提交的所有方面都计入 25 页的限制(摘要页、 目录、 参考文献和任何附录)。 必须在你的报告中标注你的想法、 图像和其他材料的来源引用
2 思路解析
3 Python 实现
3.1 数据分析和预处理
(1)数据分析
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
gold = pd.read_csv('./data/LBMA-GOLD.csv')
bitcoin = pd.read_csv('./data/BCHAIN-MKPRU.csv')
gold.info()
<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 1265 entries, 0 to 1264 Data columns (total 2 columns):
Column Non-Null Count Dtype — ------ -------------- -----
0 Date 1265 non-null object
1 USD (PM) 1255 non-null float64
dtypes: float64(1), object(1)
# 缺失值查看
gold.isnull().any()
Date False
USD (PM) True
dtype: bool
黄金序列存在缺失值
bitcoin.isnull().any()
Date False
Value False
dtype: bool
比特币序列没有缺失值
可视化数据
x1 = range(len(gold))
y1 = gold['USD (PM)']
x2 = range(len(bitcoin))
y2 = bitcoin['Value']
plt.plot(x1,y1)
plt.plot(x2,y2,color='r')
(2)数据预处理
黄金序列是有缺失值,且周末不存在数据,时间序列是中断的,以下采用插值法进行填充数据,将补充为完整的时间序列
gold.index = list(pd.DatetimeIndex(gold.Date))
gold_datalist = pd.date_range(start='2016-09-12',end='2021-09-10')
ts = pd.Series(len(gold_datalist)*[np.nan],index=gold_datalist)
gold_s = gold['USD (PM)']
for i in gold.index:
ts[i] = gold_s[i]
# 线性插值法
ts = ts.interpolate(method='linear')
gold_df = ts.astype(float).to_frame()
gold_df.rename(columns=0:'USD',inplace=True)
gold_df.sort_index()
gold_df.index = range(len(gold_df))
gold_df
补充完整后,黄金的时间序列有1825条数据
3.2 预测
(1)特征工程
# 提取特征
from tsfresh import extract_features, extract_relevant_features, select_features
from tsfresh.utilities.dataframe_functions import impute
gold_df['id'] = range(len(gold_df))
extracted_features = extract_features(gold_df,column_id='id')
extracted_features.index = gold_df.index
# 去除NAN特征
extracted_features2 = impute(extracted_features)
构造训练集
import re
# 向未来移动一个时间步长
timestep = 1
Y = list(gold_df['USD'][timestep:])
X_t = extracted_features2[:-timestep]
X = select_features(X_t, np.array(Y), fdr_level=0.5)
X = X.rename(columns = lambda x:re.sub('[^A-Za-z0-9_]+', '', x))
(2)模型训练预测
# 划分30%作为测试集
s = 0.3
tra_len = int((1-s)*len(X))
test_len = len(X)-tra_len
X_train, X_test, y_train, y_test = X[0:tra_len], X[-test_len:], Y[0:tra_len],Y[-test_len:]
# 方法一
import lightgbm as lgb
# clf = lgb.LGBMRegressor(
# learning_rate=0.01,
# max_depth=-1,
# n_estimators=5000,
# boosting_type='gbdt',
# random_state=2022,
# objective='regression',
# )
# clf.fit(X=X_train, y=y_train, eval_metric='MSE', verbose=50)
# y_predict = clf.predict(X_test)
# 方法二
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
linreg = LinearRegression()
model = linreg.fit(X_train, y_train)
y_pred = linreg.predict(X_test)
预测及输出评价指标
from sklearn import metrics
def metric_regresion(y_true,y_pre):
mse = metrics.mean_squared_error(y_true,y_pre)
mae = metrics.mean_absolute_error(y_true,y_pre)
rmse = np.sqrt(metrics.mean_squared_error(y_true,y_pre)) # RMSE
r2 = metrics.r2_score(y_true,y_pre)
print('MSE:'.format(mse))
print('MAE:'.format(mae))
print('RMSE:'.format(rmse))
print('R2:'.format(r2))
metric_regresion(y_test,y_pred)
MSE:267.91294723114646
MAE:10.630377450265746
RMSE:16.368046530699576
R2:0.9707506268528148
可视化预测结果
import matplotlib.pyplot as plt
plt.figure()
plt.plot(range(len(y_pred[100:180])), y_pred[100:180], 'b', label="预测")
plt.plot(range(len(y_test[100:180])), y_test[100:180], 'r', label="原始")
plt.legend(loc="upper right", prop='size': 15)
plt.show()
3.3 进阶的预测方案和代码
在以上的同一个下载链接中
3.3 动态规划
3.3.1 思路方案
符号说明
w
1
w_1
w1,
w
2
w_2
w2 初始买入比例
P
t
P_t
Pt,
P
t
−
1
P_t-1
Pt−1 前后一天价格
diff 前后一天价格差
Y
t
Y_t
Yt 变化收益
b% 中途卖出比例(也是买入比例)
目标函数:
m
a
x
max
max
Y
t
Y_t
Yt =
W
1
W_1
W1
P
黄
P_黄
P黄+
W
2
W_2
W2
P
比
P_比
P比
约束条件:
1、
C
=
W
1
×
P
×
b
%
×
1
%
+
W
i
×
P
×
b
%
×
2
%
C=W_1×P × b\\% ×1\\%+W_i × P × b \\% × 2 \\%
C=W1×P×b%×1%+Wi×P×b%×2%(成本约束)(买出卖出成本)
2、
X
i
=
0
x
0
=周末
1
x
1
!=周末
X_i= \\begincases 0& \\text$x_0$=周末\\\\ 1& \\text$x_1$ !=周末 \\endcases
Xi=01x0=周末x1 !=周末
3、diff=
P
t
P_t
Pt-
P
t
−
1
P_t-1
Pt−1 (持有会带来的成本)
4、
0
≤
r
≤
1
0 \\leq r \\leq 1
0≤r≤1 风险系数约束(可用预测模型的置信区间权衡风险)
模型讲解:
完整思路下载
3.3.2 Python实现
待上传…
以上是关于2022美赛 C题 交易策略Python实现的baseline的主要内容,如果未能解决你的问题,请参考以下文章