主页 > 华为手机怎么安装imtoken > 2022美国赛题C:交易策略赛题解析与代码

2022美国赛题C:交易策略赛题解析与代码

华为手机怎么安装imtoken 2023-03-13 07:43:29

第一步主题分析

比特币源代码有多少行_比特币行情火币网_币行 比特币交易平台

简要描述主题:

黄金和比特币是两种不稳定的资产。 题目给了我们两个csv文件,分别存储了过去几年黄金和比特币的价格。 我们需要开发一个模型,使用过去的每日价格数据来确定资产今天的交易情况。

问题中的关键信息是:

我们只能用这两个csv数据文件来解决本次比赛的问题(找不到其他数据)

数据日期范围为2016年9月11日-2021年9月10日,起始资金为1000美元现金,资产组合形式为【现金、黄金、比特币】

构建的模型仅使用迄今为止过去的每日价格流量来确定交易策略。

即假设我建立了一个模型y = Trade(x),那么在2017年2月22日使用模型时,模型的输入参数x只能是2017年2月22日及之前的数据,而今天的输出应该卖出 1 个比特币,买入 1 盎司黄金

每笔交易都有佣金成本,交易金额的α%。 α Gold = 1%, α Bitcoin = 2%(第三题提到成本对模型的影响)

比特币每天交易,但黄金仅在市场开放的日子交易。 在csv文件中也可以看到gold的数据缺失(周末、圣诞节等节假日)

第二步数据预处理

由于黄金数据的缺失,可能会影响后续的数据分析,我们可以将缺失的价格进行填充,使用缺失日期前后的价格来填充缺失的价格。 这样的话,就相当于非交易日的黄金价格保持不变,在构建价格预测模型时更准确,错误更少(我被无法预测的困扰特定日期的价格)。

# 读取csv文件,指定时间为行索引

df = pd。 read_csv('路径', index_col='日期')

# 将行索引的时间改为pandas的时间类型

df.index = pd.to_datetime(df.index)

# 生成一阶差分的函数

df['值'].diff(1)

# 填充缺失值

date_index = pd.date_range('2016-09-11','2021-09-10') #先生成所有日期范围

df = df.reindex(date_index) #将行索引重置为所有日期

# 此时dataframe会填入原始日期的价格,之前不存在的日期的价格缺失NaN

# 用第二天的价格填充缺失值

gold_df = gold_df.fillna(method='bfill')

当然还有很多其他的事情需要处理...

第三步比特币源代码有多少行,建立价格预测模型

时间序列ARIMA(p,d,q)模型学习一、模型介绍

该模型要求样本是静止的

1.平稳性:要求从样本时间序列得到的拟合曲线在未来一段时间内会按照现有i-form的“惯性”持续。 (均方差无显着变化)

严格平稳:分布不随时间变化

弱平稳:期望和相关系数(依赖)保持不变。未来时刻值与过去信息相关

2.差分法:时间序列在t时刻和t-1时刻的差分

一阶差分:对原始数据使用pandas.diff函数求正反差

二阶差分:对一阶差分的数据进行差分

比特币行情火币网_比特币源代码有多少行_币行 比特币交易平台

3. 自回归模型(AR)

描述当前值与历史值的关系,利用变量的历史时间数据进行自身预测

P序表示当天与前p天的数据相关

4.移动平均模型(MA)

关注AR模型中误差项的积累,消除预测中的随机波动

2、参数设置

1.自相关函数ACF

2.偏自相关函数PACF:去除其他随机变量的影响

ARIMA建模过程:

1. 使序列平稳:用差分法确定d

2. p和q阶数的确定:acf和pacf

3. ARIMA(p,d,q)

# 根据历史预测今天价格的函数

def pred_by_history(df):

model = ARIMA(df[:-1], order=(1, 1, 0)) #只​​用今天之前的数据建立模型

结果 = model.fit()

# future = result.predict(df.index[-1],df.index[-1] ,dynamic=True, typ='levels') #预测今天的金价,起始数据必须在源数据中

future = result.forecast(1) #返回今天的预测值

返回未来

pred_all_gold = {} #所有的黄金预测价格都存储在字典中

#逐日预测,每次预测传递的数据都是今天之前的,返回的是今天的预测值

今天在 gold_df['2016-09-14':].index.to_list() 中:

pred_gold = pred_by_history(gold_df[:today]) #只用今天之前的数据,返回今天的预测值

pred_all_gold[今天] = pred_gold[0]

打印(今天)

第四步,建立交易策略模型

使用过去价格变化的中位数,五分位数......作为参数

df['change'] = df.value.diff() # 相对于昨天的涨跌

df['ratio'] = df.change / df.value #涨跌比例

df['向上'] = df. 比率[df。 比率 > 0]

df['向下'] = df. 比率[df。 比率 < 0]

up_05 = df.up.quantile(.5) #中位数增加0.015516689495233852

up_u = 4

up_09 = 0.177859096 #最大累计涨幅

比特币行情火币网_币行 比特币交易平台_比特币源代码有多少行

模型的输入参数为今日价格、过去价格涨跌幅中位数、第9个百分位数、累计涨跌幅天数、首日成交量。

输出是今天的买入/卖出金额

def 模型(P1、M05、M01、α、U1=4):

list1 = [ M05*(1+M01/U1)*(1-α)+(1-α)*M01/U1-α ,M05*(1-α)-α,0,0]

list2 =[ M05*(1-α)*(1+M01/U1)**2+(1-α)*(2+M01/U1)*M01/U1-α,M05*(1+M01/U1 )*(1-α)+(1-α)*M01/U1-α,M05*(1-α)-α,0]

list3 =[ M05*(1-α)*(1+M01/U1)**3+(1-α)*(M01/U1)*(1+(1+M01/U1)**2)-α ,M05*(1-α)*(1+M01/U1)**2+(1-α)*(2+M01/U1)*M01/U1-α,M05*(1+M01/U1)* (1-α)+(1-α)*M01/U1-α,M05*(1-α)-α]

list_all = [list1,list2,list3]

a =np.mat([i[1:] for i in list_all])#coefficient matrix

b =np.mat([i[0] for i in list_all]).T #常量项列矩阵

P=solve(a,b) #方程组的解

打印(P1,P[0]比特币源代码有多少行,P[1],P[2])

# [[436.40492024]

# [560.68906005]]

from scipy.optimize import curve_fit #拟合参数

def y(a,t):

返回 a*np.exp(t)

x = [i for i in range(1,5)] #x=np.linspace(1,4,4)

popt, pcov = curve_fit(y,x,[P1,P[0],P[1],P[2]])

plt.plot(np.linspace(0,4,50),[y(popt[0],t) for t in np.linspace(0,4,50)],'r--')

plt.plot(x,[y(popt[0],t) for t in x],'b--')

铂。 title('位-')

打印(弹出[0])

返回弹出[0]

#黄金交易量

def gold_trade(change): #w是累计涨跌幅

if(change < 0): #累计下降,然后加仓

返回 abs(A_gold_down*np.exp(4*change/-0.037786983))

elif(change > 0): #累计增加,然后减仓

返回 abs(A_gold_up*np.exp(4*change/0.035561898))

别的:

返回 0

#比特币交易金额

def bit_trade(change): #w为累计增减

if(change < 0): #累计下降,然后加仓

比特币行情火币网_比特币源代码有多少行_币行 比特币交易平台

返回 abs(A_bit_down*np.exp(3*change/-0.125855917))

elif(change > 0): #累计增加,然后减仓

返回 abs(A_bit_up*np.exp(4*change/0.177859096))

别的:

返回 0

第五步,每天按照模型交易得到结果

注意:

1、每笔交易佣金0.01、0.02。

2、判断今天是否为黄金交易日

date_asset={pd.to_datetime('2016-09-11'):[1000,0,0]} #字典存放所有天的资产组合[c,g,b],第一天1000现金

# 它存储黄金和比特币的份额

# 交易策略

def strategy(date,asset_date,b_price,g_price,bchange,gchange,workday): #price是今天的价格,pred预测是明天的,gold是可选的,如果不传进去就是0

asset_tomor = asset_date #asset_date是[],现在的资产

if workday == 'False': #今天只能交易比特币

if bchange > 0: #减少位置

bmin = min(asset_date[2]*b_price,bit_trade(bchange)) #销售金额

asset_tomor[0] = asset_date[0] + bmin*0.98

asset_tomor[2] = asset_date[2] - bmin/b_price #bit 卖出份额

elif bchange < 0: #添加位置

bmin_add = min(asset_date[0],bit_trade(bchange)) #买入量

asset_tomor[0] = asset_date[0] - bmin_add

asset_tomor[2] = asset_date[2] + bmin_add*0.98/b_price #买入份额

其他:#flat

经过

别的:

如果 gchange > 0: #gold lighten up

gmin = min(asset_date[1]*g_price,gold_trade(gchange)) #销售金额

asset_tomor[0] = asset_date[0] + 0.99*gmin

asset_tomor[1] = asset_date[1] - gmin/g_price

if bchange > 0: #减少位置

bmin = min(asset_date[2]*b_price,bit_trade(bchange)) #销售金额

asset_tomor[0] = asset_date[0] + bmin*0.98

asset_tomor[2] = asset_date[2] - bmin/b_price #bit 卖出份额

比特币行情火币网_比特币源代码有多少行_币行 比特币交易平台

elif bchange < 0: #添加位置

bmin_add = min(asset_date[0],bit_trade(bchange)) #买入量

asset_tomor[0] = asset_date[0] - bmin_add

asset_tomor[2] = asset_date[2] + bmin_add*0.98/b_price #买入份额

别的:

经过

elif gchange < 0 : #gold 增加头寸

gmin_add = min(asset_date[0],gold_trade(gchange)) #买多少

asset_tomor[0] = asset_date[0] - gmin_add

asset_tomor[1] = asset_date[1] + gmin_add*0.99/g_price

if bchange > 0: #减少位置

bmin = min(asset_date[2]*b_price,bit_trade(bchange)) #销售量

asset_tomor[0] = asset_date[0] + bmin*0.98

asset_tomor[2] = asset_date[2] - bmin/b_price #bit 卖出份额

elif bchange < 0: #添加位置

bmin_add = min(asset_date[0],bit_trade(bchange)) #买入量

asset_tomor[0] = asset_date[0] - bmin_add

asset_tomor[2] = asset_date[2] + bmin_add*0.98/b_price #买入份额

别的:

经过

否则:#gold 不变

if bchange > 0: #减少位置

bmin = min(asset_date[2]*b_price,bit_trade(bchange)) #销售金额

asset_tomor[0] = asset_date[0] + bmin*0.98

asset_tomor[2] = asset_date[2] - bmin/b_price #bit 卖出份额

elif bchange < 0: #添加位置

bmin_add = min(asset_date[0],bit_trade(bchange)) #买入量

asset_tomor[0] = asset_date[0] - bmin_add

asset_tomor[2] = asset_date[2] + bmin_add*0.98/b_price #买入份额

别的:

经过

返回 asset_tomor

对于 all_data.index 中的 i:

asset_tomor = strategy(i,date_asset[i],all_data.bitcoin_value[i],all_data.gold_value[i],all_data.b_change[i],all_data.g_change[i],all_data.workday[i])

比特币行情火币网_币行 比特币交易平台_比特币源代码有多少行

date_asset[i+dt.timedelta(1)] = asset_tomor.copy()

# 将每一天的资产放入总数据中

asset_df = pd.DataFrame.from_dict(date_asset,orient='index',columns=['cash','gold','bitcoin'])

res = all_data.join(asset_df)

res['money'] = res.cash + res.gold*res.gold_value + res.bitcoin*res.bitcoin_value

# res.money.plot()

return res.money[-1] #返回持有的资产总额

图片

在建模比赛中,图表是必不可少的关键输出。

在这个问题中,我们需要

1、生成黄金和比特币的历史价格数据流程图

币行 比特币交易平台_比特币源代码有多少行_比特币行情火币网

比特币行情火币网_比特币源代码有多少行_币行 比特币交易平台

预测价格流与实际价格流的差异图

学习使用时间序列 ARIMA 模型预测价格

币行 比特币交易平台_比特币行情火币网_比特币源代码有多少行

生成 ARIMA 模型参数图

一阶差分图d的判断

比特币源代码有多少行_比特币行情火币网_币行 比特币交易平台

BIC 热图

比特币行情火币网_币行 比特币交易平台_比特币源代码有多少行

使用ACF和PACF判断p,q顺序

币行 比特币交易平台_比特币源代码有多少行_比特币行情火币网

使用交易策略模型计算的资金变动图

现金+黄金+比特币总价值的变化

比特币行情火币网_币行 比特币交易平台_比特币源代码有多少行

现金-黄金-比特币持有量的变化

比特币行情火币网_币行 比特币交易平台_比特币源代码有多少行

黄金价格和持有黄金价值的趋势

比特币行情火币网_比特币源代码有多少行_币行 比特币交易平台

比特币价格及持有比特币价值变动趋势

比特币行情火币网_比特币源代码有多少行_币行 比特币交易平台

佣金对交易策略模型的影响

比特币行情火币网_币行 比特币交易平台_比特币源代码有多少行

币行 比特币交易平台_比特币行情火币网_比特币源代码有多少行