一种利用机器学习提高指标成功率的思路及其Python实现
[其 它] 3 2万
*** 奉送例子中原本成功率77的指标,评测条件:20个交易日内,10止赢10止损。 <p style="color:gold;font-size:24px">主要思路</p> 假设有一种疾病在人群中的发病率为70%(先验概率),有一种检测方法的正确率为80%,现在某人的检测结果为阳性,那么这个人为真正阳性的概率是多少? <br> 根据贝叶斯公式为: $$ \frac{0.7 * 0.8}{0.7* 0.8+(1-0.7)*(1-0.8)}\approx0.903 $$ 同理: 假设有一种交易策略历史成功率为70%(先验概率),有一种机器学习模型算法可以预测每次交易是否会成功,预测正确率为80%,现在根据交易策略有一个新的交易机会,模型预测将会成功,那么这次交易真正会成功的概率是多少? 同样是根据贝叶斯公式可得,成功概率为90.3% *** # Python实现 ### 一、获取数据 通过tushare接口下载全部数据 ```python # 初始化行情接口 import tushare as ts pro = ts.pro_api() ts.set_token('828005039aef60a8745faffc3173a21fe03dcb4ec0cbabde2411bacb') # 获取沪深两市全部股票代号 stocks = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date,market') hs_stocks = stocks[(stocks['market'] =='主板') | (stocks['market'] =='创业板')] hs_stocks_codes = hs_stocks.stock_code # 获取全部股票历史数据,每只股票保存成单独的xlsx表格 for stock in hs_stock_codes: getStockData(stock) # getStockData的实现在源码包中 ``` ```raw 3382 605500.SH-2022-11-18.xlsx 3383 605507.SH-2022-11-18.xlsx 3384 605555.SH-2022-11-18.xlsx 3385 605566.SH-2022-11-18.xlsx 3386 605567.SH-2022-11-18.xlsx 3387 605577.SH-2022-11-18.xlsx 3388 605580.SH-2022-11-18.xlsx 3389 605588.SH-2022-11-18.xlsx 3390 605589.SH-2022-11-18.xlsx 3391 605598.SH-2022-11-18.xlsx 3392 605599.SH-2022-11-18.xlsx ``` *** ### 二、根据买点指标选出股票及交易日期 利用通达信交易指标评测系统,选出成功率排名较高的公式指标。 当公式发出买点信号时开仓,以20个交易日为限,设定+10%为止赢平仓条件,-10%为止损平仓条件 * 取其中一个公式为例,将其以Python重新实现 ```python def DENGTONG(OPEN, HIGH, CLOSE, LOW, VOL): """ :param OPEN: 开盘价 :param HIGH: 最高价 :param CLOSE: 收盘价 :param LOW: 最低价 :param VOL: 成交量 """ VAR31A = DMA(CLOSE, VOL / MA(VOL, 4) / 4) VAR32A = DMA(CLOSE, VOL / MA(VOL, 32) / 32) VAR31 = (CLOSE - VAR31A) / VAR31A * 100 < -8 VAR32 = (VAR31A - VAR32A) / VAR32A * 100 < -21 VAR33 = (OPEN - REF(CLOSE, 1)) / REF(CLOSE, 1) > -0.05 VAR34 = COUNT(CLOSE != OPEN, 8) >= 8 XG = VAR31 & VAR32 & VAR33 & VAR34 return XG ``` * 读取所有数据,计算符合上面指标(返回True值)的股票代码及日期 ```raw stocks_data = os.listdir('data') all_hits = {} for stock in stocks_data: try: rdf = pd.read_excel(f'data/{stock}', index_col='trade_date') df = rdf.iloc[:-30, ...] # 不能没有测试成功与否的后续数据 df.eval('mean = amount / vol',True) hits = findIndicatorHits(df, DENGTONG) all_hits[stock] = hits test_hits = compressDates(hits) except Exception as e: print(e) print(countTotalHits(all_hits)) ``` ```raw 运行结果: 36797 ``` 自2001年至2022年间3393只主板和创业板股票,共发出买入信号 36797 次,平均每只股票每年发出0.52次信号,说明条件比较严苛 *** ### 三、整理数据集 * 定义数据标签 ​ 根据交易规则,在发出买入信号后20个交易日内, 若股价先达到上涨10%的条件,则视为成功,本次交易标记为1;若20个交易内从 未达到上涨10%,或者先达到下跌10%条件,则视为失败,本次交易标记为0 * 选取数据特征 选择买入信号日期前100个交易日的开盘价、收盘价、最低价、最高价、当日平均价、成交量6个属性,共计600个特征 * 数据规一化 ```python from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() if s_bdf.shape[0]: scaled_bdf = scaler.fit_transform(s_bdf).reshape(-1, ) ``` * 生成数据集 生成包含36797个样本、600个特征的数据集(data)和标签(targets) 其中正样本(即成功的交易次数)占比为79% ```python success_rate = (np.sum(target) / len(target))) print(success_rate) 0.7927663734115347 ``` *** ### 四、训练机器学习模型 * 将数据集划分成训练数据和测试数据集两部分 ```python from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(data, target) ``` * 构建机器学习模型 将经典机器学习算法全部实现,进行评测 ```python from sklearn.tree import ExtraTreeClassifier from sklearn.neighbors import KNeighborsClassifier from sklearn.neural_network import MLPClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.linear_model import LogisticRegression from sklearn.naive_bayes import GaussianNB from sklearn.svm import SVC from sklearn.decomposition import PCA ``` * 将训练数据集交给模型进行训练,再利用测试数据集测试模型的好坏 由于数据正负样本分布不均衡,不宜使用准确率(accuracy)指标,而采用f1_score作为测试指标 ```python from sklearn.metrics import f1_score, precision_score, confusion_matrix ``` * 选取表现最好的模型进行集成学习 通过评测,逻辑回归、随机森林、K近邻、多层线性感知机、支撑向量机、高斯朴素贝叶斯、极端随机树模型正确率都达到0.7以上, 进一步用所有模型的预测结果进行投票 ```python from sklearn.ensemble import VotingClassifier vc = VotingClassifier([ ('lr', LogisticRegression(max_iter=1000)), ('dt', RandomForestClassifier(1000)), ('et', ExtraTreeClassifier()), ('kc', KNeighborsClassifier()), ('mlp', MLPClassifier(max_iter = 1000)), ('gnb', GaussianNB()), ('svc', SVC(probability=True)) ],voting='soft', n_jobs=-1) vc.fit(X_train, y_train) f1_score(y_test, vc.predict(X_test)) precision_score(y_test, vc.predict(X_test)) recall_score(y_test, vc.predict(X_test_reduction)) 0.8805409466566493 0.8082758620689655 0.966996699669967 ``` 通过集成学习,f1_score达到了0.88,精准率(预测为成功,实际也成功)达到了0.81,召回率(预测为失败,实际也失败)达到0.97 f1_score是精准率和召回率的调和平均数。 **这意味着当模型预测本次交易能成功时,仍有20%的失败可能性,而当模型预测本次交易会失败时,基本上肯定会失败。** 本着股票交易“宁可错过,不可做错”的审慎原则,更看重的是精准率。 根据贝叶斯公式,当一个新的交易信号发出时,如果模型预测会成功,那么真正会成功的概率是: $$ \frac{0.79*0.81}{0.79*0.81+(1-0.79)*(1-0.81)}\approx0.941 $$ * 保存模型 ### 五、利用训练好的模型预测新数据 当新的交易信号发出时,将数据整理成(1,600)的矩阵,交给模型进行预测。 ```python vc.predict(new_data) ``` |
附件
-
6.41 KB, 下载次数: 61, 下载积分: 分享值 -3 个
相关股票
楼主 | 19楼 |
2楼 | 20楼 |
3楼 | 21楼 |
4楼 | 22楼 |
5楼 | 23楼 |
6楼 | 24楼 |
7楼 | 25楼 |
8楼 | 26楼 |
9楼 | 27楼 |
10楼 | 28楼 |
11楼 | 29楼 |
12楼 | 30楼 |
13楼 | |
14楼 | |
15楼 | |
16楼 | |
17楼 | |
18楼 |