印钞机 java c c vb_自己动手写一个印钞机 第六章
作者:阿布🐶
未經(jīng)本人允許禁止轉(zhuǎn)載
非均衡勝負(fù)收益帶來(lái)的必然非均衡勝負(fù)比例,目標(biāo)由因子的能力解決一部分,模式識(shí)別提升關(guān)鍵的一部分
上一章構(gòu)造了 3個(gè)主裁和一個(gè)輔助裁判,這一章開(kāi)始構(gòu)建邊裁及裁判的最優(yōu)參數(shù)選擇
fn = ZEnv.g_project_root + '/data/cache/orders_pd_ump_hit_predict_abu'
key = 'orders_pd_ump_hit_predict_abu'
orders_pd_ump = ZCommonUtil.load_hdf5(fn, key)
orders_pd_ump.shape
# out
(47374, 39)
UmpEdge 邊裁
import UmpEdge
ump_edge = UmpEdge.UmpEdgeClass(orders_pd_ump)
邊裁使用profit, profit_cg作為gmm分類數(shù)據(jù)生成ss分類序列,之后根據(jù)profit_cg進(jìn)行rank數(shù)據(jù)生成p_rk_cg,再找到top winN,top lossN N現(xiàn)在的設(shè)置是25%且對(duì)外不暴露,分別給于1, -1, 其它的都是0生成rk列,將atr,deg,wave所有數(shù)據(jù)的numpy矩陣保存起來(lái),對(duì)輸入的數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化后實(shí)行距離對(duì)比,找到最匹配的rk標(biāo)簽
簡(jiǎn)單說(shuō)就是引入交易后置參數(shù)收益,把收益的top 25%單子,和blow 25%的單子的特征抽取,但是由于在實(shí)際交易那一時(shí)刻沒(méi)有收益這個(gè)變量,所以無(wú)法直接預(yù)測(cè),所以之前將特征的x預(yù)處理做標(biāo)準(zhǔn)化,再使 pairwise_distances計(jì)算輸入的相似度最相似那個(gè)預(yù)存x,影射出那個(gè)x是否在top25%或者below25%, 明白了嗎?不明白就看源代碼吧,下面也貼了一段
核心代碼如下所示,或者直接查閱源代碼UmpEdge.py
def dump_clf(self):
dump_clf = {'top_loss_ss': self.top_loss_ss, 'top_win_ss': self.top_win_ss,
'fiter_df': self.fiter.df, 'fiter_x': self.fiter.x}
ZCommonUtil.dump_pickle(dump_clf, self.dump_file_fn())
def predict(self, **kwargs):
dump_clf = UmpEdgeClass.dump_clf_manager.get_ump(self)
x = np.array([kwargs[col] for col in dump_clf['fiter_df'].columns[2:-3]])
x = x.reshape(1, -1)
con_x = np.concatenate((x, dump_clf['fiter_x']), axis=0)
x_scale_param = self.scaler.fit(con_x)
con_x = self.scaler.fit_transform(con_x, x_scale_param)
distance_min_ind = pairwise_distances(con_x[0].reshape(1, -1), con_x[1:],
metric='euclidean').argmin()
'''
置換出可以作為分類輸入的x
'''
ss = dump_clf['fiter_df'].iloc[distance_min_ind]['ss']
if ss in dump_clf['top_loss_ss']:
return -1
elif ss in dump_clf['top_win_ss']:
return 1
return 0
def gmm_component_filter(self, nc=20, threshold=0.72, show=True):
clf = GMM(nc, n_iter=500, random_state=3).fit(self.fiter.y)
ss = clf.predict(self.fiter.y)
self.fiter.df['p_rk_cg'] = self.fiter.df['profit_cg'].rank()
self.fiter.df['ss'] = ss
win_top = len(self.fiter.df['profit_cg']) - len(self.fiter.df['profit_cg']) * 0.25
loss_top = len(self.fiter.df['profit_cg']) * 0.25
self.fiter.df['rk'] = 0
self.fiter.df['rk'] = np.where(self.fiter.df['p_rk_cg'] > win_top, 1, self.fiter.df['rk'])
self.fiter.df['rk'] = np.where(self.fiter.df['p_rk_cg'] < loss_top, -1, self.fiter.df['rk'])
xt = pd.crosstab(self.fiter.df['ss'], self.fiter.df['rk'])
xt_pct = xt.div(xt.sum(1).astype(float), axis=0)
if show:
xt_pct.plot(
figsize=(16, 8),
kind='bar',
stacked=True,
title=str('ss') + ' -> ' + str('result'))
plt.xlabel(str('ss'))
plt.ylabel(str('result'))
ZLog.info(xt_pct[xt_pct[-1] > threshold])
ZLog.info(xt_pct[xt_pct[1] > threshold])
self.top_loss_ss = xt_pct[xt_pct[-1] > threshold].index
self.top_win_ss = xt_pct[xt_pct[1] > threshold].index
return xt, xt_pct
ump_edge.fiter.df.head()
如下可視化是不是更明白點(diǎn)了,top 25是1, below 25是-1,其它的都用0代表,gmm分類之后rank profit,大于閥值的類別得到保留,這些類別如下所示
xt, xt_pct = ump_edge.gmm_component_filter(nc=20, threshold=0.72, show=True)
# out
rk -1 0 1
ss
0 1.0 0.0 0.0
6 1.0 0.0 0.0
7 1.0 0.0 0.0
9 1.0 0.0 0.0
19 1.0 0.0 0.0
rk -1 0 1
ss
2 0.0 0.000000 1.000000
4 0.0 0.000000 1.000000
5 0.0 0.000000 1.000000
10 0.0 0.000000 1.000000
11 0.0 0.000000 1.000000
12 0.0 0.028401 0.971599
13 0.0 0.000000 1.000000
16 0.0 0.000000 1.000000
18 0.0 0.000000 1.000000
pd.crosstab交織表生成gmm生成的類別與rk的交織結(jié)果
xt
rk
-1
0
1
ss
---
---
---
---
0
2465
0
0
1
0
4326
241
2
0
0
4
3
1073
4038
0
4
0
0
3053
5
0
0
33
6
47
0
0
7
3633
0
0
8
103
4799
0
9
886
0
0
10
0
0
20
11
0
0
978
12
0
114
3900
13
0
0
2
14
0
3249
1036
15
0
4346
1
16
0
0
213
17
2892
1536
0
18
0
0
1723
19
104
0
0
xt_pct
rk
-1
0
1
ss
---
---
---
---
0
1.000000
0.000000
0.000000
1
0.000000
0.947230
0.052770
2
0.000000
0.000000
1.000000
3
0.209939
0.790061
0.000000
4
0.000000
0.000000
1.000000
5
0.000000
0.000000
1.000000
6
1.000000
0.000000
0.000000
7
1.000000
0.000000
0.000000
8
0.021012
0.978988
0.000000
9
1.000000
0.000000
0.000000
10
0.000000
0.000000
1.000000
11
0.000000
0.000000
1.000000
12
0.000000
0.028401
0.971599
13
0.000000
0.000000
1.000000
14
0.000000
0.758226
0.241774
15
0.000000
0.999770
0.000230
16
0.000000
0.000000
1.000000
17
0.653117
0.346883
0.000000
18
0.000000
0.000000
1.000000
19
1.000000
0.000000
0.000000
最后的常規(guī)任務(wù)就是將裁判本地序列話
ump_edge.dump_clf()
下面的主題是尋找裁判最優(yōu)參數(shù)
將orders_pd_ump數(shù)據(jù)重新讀取,新的數(shù)據(jù)包涵了使用這些裁判進(jìn)行裁決,但不攔截的所有統(tǒng)計(jì)數(shù)據(jù),形式如下所示表格所示,通過(guò)數(shù)據(jù)統(tǒng)計(jì)來(lái)組織攔截規(guī)則,比如幾個(gè)主裁一起合作,達(dá)到幾個(gè)hit就直接攔截,幾個(gè)等待邊裁裁決,輔助裁判應(yīng)用賦予的權(quán)力權(quán)重,這些參數(shù)設(shè)置好了之后就可以組成一個(gè)實(shí)用的交易攔截系統(tǒng)!
orders_pd_ump.filter(regex='result|ump_main_mlfiter*|ind_key').tail(2)
# 先對(duì)三個(gè)主裁尋找參數(shù),主裁的優(yōu)先級(jí)是一致的,至少這里是這樣實(shí)現(xiàn)的
from MlFiter import MlFiterClass
orders_pd_ump['ind_key'] = np.arange(0, len(orders_pd_ump))
orders_pd_tmp = orders_pd_ump.filter(regex='result|ump_main_mlfiter*|ind_key')
order_has_ret = orders_pd_tmp[orders_pd_tmp['result'] <> 0]
order_has_ret['result'] = np.where(order_has_ret['result'] == -1, 0, 1)
order_has_ret['ump_main_mlfitermainpdclass_predict'] = np.where(order_has_ret['ump_main_mlfitermainpdclass_predict'] == True, 1, 0)
order_has_ret['ump_main_mlfiterdegpdclass_predict'] = np.where(order_has_ret['ump_main_mlfiterdegpdclass_predict'] == True, 1, 0)
order_has_ret['ump_main_mlfiterwavepdclass_predict'] = np.where(order_has_ret['ump_main_mlfiterwavepdclass_predict'] == True, 1, 0)
order_has_ret = order_has_ret[(order_has_ret['ump_main_mlfitermainpdclass_predict'] == 0) |
(order_has_ret['ump_main_mlfiterdegpdclass_predict'] == 0) |
(order_has_ret['ump_main_mlfiterwavepdclass_predict'] == 0)]
order_has_ret['predict_sum'] = order_has_ret['ump_main_mlfitermainpdclass_predict'] + order_has_ret['ump_main_mlfiterdegpdclass_predict'] + \
order_has_ret['ump_main_mlfiterwavepdclass_predict']
order_has_ret['hit_sum'] = order_has_ret['ump_main_mlfiterdegpdclass_hit'] + order_has_ret['ump_main_mlfitermainpdclass_hit'] + \
order_has_ret['ump_main_mlfiterdegpdclass_hit']
matrix = order_has_ret.as_matrix()
y = matrix[:, 0]
x = matrix[:, 1:]
fiter = MlFiterClass(x, y, order_has_ret)
fiter.df.head()
order_has_ret.head()
由于簡(jiǎn)書(shū)不支持html的表格,完整的請(qǐng)參閱git上的ipython notebook版本
這里為了讓你能看懂我將表格做個(gè)T再截一張圖,有條件請(qǐng)參閱notebook版本
order_has_ret.T
通過(guò)可視化尋找參數(shù),綜合參考數(shù)量,概率等多方面因素
如下圖所示,1個(gè)hit以上就上0.65了 20個(gè)hit 0.70以上,> 20個(gè)就可以主裁直接使用裁決了,小于的等待,輔助裁判,邊裁
from sklearn import metrics
import matplotlib.pyplot as plt
hd_range = np.arange(0, 50)
hd_result = []
hd_sum = []
for hd in hd_range:
xt = order_has_ret[(order_has_ret['hit_sum'] > hd)]['result'].value_counts()
hs = xt.sum()
hd_sum.append(hs)
hd_result.append(float(xt[0])/hs)
cmap = plt.get_cmap('jet', 20)
cmap.set_under('gray')
fig, ax = plt.subplots()
ax.plot(hd_range, hd_result)
cax = ax.scatter(hd_range, hd_result, c=hd_sum, cmap=cmap, vmin=np.min(hd_sum),
vmax=np.max(hd_sum))
ax.grid(True)
fig.colorbar(cax, label='hd_sum', extend='min')
跳空的輔助裁判本身數(shù)據(jù)就少,輔助裁判盡量裁決 jump ump可以使用hit 5作為閥值,大于5個(gè)hit直接裁決,否則等待邊裁
orders_pd_tmp = orders_pd_ump.filter(regex='result|ump_jump_mlfiter|ind_key*')
order_has_ret = orders_pd_tmp[orders_pd_tmp['result'] <> 0]
order_has_ret['result'] = np.where(order_has_ret['result'] == -1, 0, 1)
order_has_ret['ump_jump_mlfiterjumppdclass_predict'] = np.where(order_has_ret['ump_jump_mlfiterjumppdclass_predict'] == True, 1, 0)
order_has_ret = order_has_ret[(order_has_ret['ump_jump_mlfiterjumppdclass_predict'] == 0)]
hd_range = np.unique(order_has_ret['ump_jump_mlfiterjumppdclass_hit'])[:-1]
# -1 要使用0開(kāi)始的范圍
hd_range = np.array(hd_range) - 1
print hd_range
hd_result = []
hd_sum = []
for hd in hd_range:
xt = order_has_ret[order_has_ret['ump_jump_mlfiterjumppdclass_hit'] > hd]['result'].value_counts()
hs = xt.sum()
hd_sum.append(hs)
hd_result.append(float(xt[0])/hs)
cmap = plt.get_cmap('jet', 20)
cmap.set_under('gray')
fig, ax = plt.subplots()
ax.plot(hd_range, hd_result)
cax = ax.scatter(hd_range, hd_result, c=hd_sum, cmap=cmap, vmin=np.min(hd_sum),
vmax=np.max(hd_sum))
ax.grid(True)
fig.colorbar(cax, label='hd_sum', extend='min')
邊裁在現(xiàn)在的規(guī)則中不需要需找參數(shù)
好了,這些都組織好之后,下一章就該看看這個(gè)系統(tǒng)能不能成為印鈔機(jī)之路上那個(gè)重要組成環(huán)節(jié)了,下一章也是最終章節(jié),如果您 真的能看到這里,并且大概知道我再說(shuō)些什么,我就感覺(jué)很欣慰了,如果那樣的話多多交流
感謝🙏您能有耐心看到這里
如果有什么問(wèn)題可以加阿布的微信
微信號(hào):aaaabbbuu
總結(jié)
以上是生活随笔為你收集整理的印钞机 java c c vb_自己动手写一个印钞机 第六章的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java 静态类设置null_JAVA中
- 下一篇: java怎么捕捉除数异常_Java异常的