一种利用机器学习提高指标成功率的思路及其Python实现

[其 它] 3个推荐3 17310 43
设置
2951793 Lv.2

专栏

发表于 2022-12-7 10:23 复制 显示全部楼层 正序浏览 |
跳转到指定楼层
## 一种利用机器学习提高量化交易成功率的思路及其Python实现
***
奉送例子中原本成功率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次信号,说明条件比较严苛

***

### 三、整理数据集

* 定义数据标签

&#8203;      根据交易规则,在发出买入信号后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)
```

附件

dengtong.tn6

6.41 KB, 下载次数: 50, 下载积分: 分享值 -3 个

本主题由 任务系统 于 2022-12-7 10:35 移动
来自 河北省石家庄市

举报

使用道具 扔鸡蛋 回复

3898161
Lv.3

专栏

发表于 2022-12-18 12:07 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 上海市

举报

使用道具 支持 扔鸡蛋 回复

2951793
Lv.2

专栏

发表于 2022-12-11 11:56 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 河北省石家庄市

举报

使用道具 点亮 支持 扔鸡蛋 回复

38600
Lv.6

专栏

发表于 2022-12-11 11:20 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 陕西省榆林市

举报

使用道具 支持 扔鸡蛋 回复

3631801
Lv.2

专栏

发表于 2022-12-11 10:52 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 湖北省武汉市

举报

使用道具 点亮 支持 扔鸡蛋 回复

2951793
Lv.2

专栏

发表于 2022-12-11 09:48 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
点评
  • 詹士 2022-12-11 11:20
    老师,能不能做一个完整版的,不会搞
来自 河北省石家庄市

举报

使用道具 点亮 (1) 支持 扔鸡蛋 回复

2951793
Lv.2

专栏

发表于 2022-12-11 09:11 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 河北省石家庄市

举报

使用道具 点亮 支持 扔鸡蛋 回复

2797485
Lv.3

专栏

发表于 2022-12-10 23:44 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 山东省济宁市

举报

使用道具 点亮 支持 扔鸡蛋 回复

3631801
Lv.2

专栏

发表于 2022-12-10 20:12 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 湖北省武汉市

举报

使用道具 点亮 支持 扔鸡蛋 回复

2951793
Lv.2

专栏

发表于 2022-12-10 16:01 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 河北省石家庄市

举报

使用道具 点亮 支持 扔鸡蛋 回复

3631801
Lv.2

专栏

发表于 2022-12-10 15:55 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 湖北省武汉市

举报

使用道具 点亮 支持 扔鸡蛋 回复

3631801
Lv.2

专栏

发表于 2022-12-10 15:24 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 湖北省武汉市

举报

使用道具 点亮 支持 扔鸡蛋 回复

3631801
Lv.2

专栏

发表于 2022-12-10 15:15 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 湖北省武汉市

举报

使用道具 点亮 支持 扔鸡蛋 回复

3631801
Lv.2

专栏

发表于 2022-12-10 15:07 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 湖北省武汉市

举报

使用道具 点亮 支持 (1) 扔鸡蛋 回复

2951793
Lv.2

专栏

发表于 2022-12-10 14:37 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 河北省石家庄市

举报

使用道具 点亮 支持 扔鸡蛋 回复

3631801
Lv.2

专栏

发表于 2022-12-10 14:26 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 湖北省武汉市

举报

使用道具 点亮 支持 扔鸡蛋 回复

2951793
Lv.2

专栏

发表于 2022-12-10 14:24 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 河北省石家庄市

举报

使用道具 点亮 支持 扔鸡蛋 回复

3631801
Lv.2

专栏

发表于 2022-12-10 14:20 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 湖北省武汉市

举报

使用道具 点亮 支持 扔鸡蛋 回复

2951793
Lv.2

专栏

发表于 2022-12-10 14:13 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
点评
  • 笨笨求索 2022-12-10 23:44
    谢谢老师回复!是我的电脑出了问题。我又重新测试了几次,与老师的差不多。
来自 河北省石家庄市

举报

使用道具 点亮 支持 扔鸡蛋 回复

2951793
Lv.2

专栏

发表于 2022-12-10 13:55 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 河北省石家庄市

举报

使用道具 支持 扔鸡蛋 回复

2951793
Lv.2

专栏

发表于 2022-12-10 13:54 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 河北省石家庄市

举报

使用道具 点亮 支持 扔鸡蛋 回复

3631801
Lv.2

专栏

发表于 2022-12-10 12:31 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 湖北省武汉市

举报

使用道具 点亮 支持 扔鸡蛋 回复

3631801
Lv.2

专栏

发表于 2022-12-10 12:02 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 湖北省武汉市

举报

使用道具 点亮 支持 扔鸡蛋 回复

3631801
Lv.2

专栏

发表于 2022-12-10 11:52 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 湖北省武汉市

举报

使用道具 点亮 支持 扔鸡蛋 回复

3631801
Lv.2

专栏

发表于 2022-12-10 11:19 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...

附件

QQ图片20221210111734.png
来自 湖北省武汉市

举报

使用道具 支持 扔鸡蛋 回复

3631801
Lv.2

专栏

发表于 2022-12-10 11:13 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 湖北省武汉市

举报

使用道具 点亮 支持 扔鸡蛋 回复

2850252
Lv.4

专栏

发表于 2022-12-10 09:39 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 河北省

举报

使用道具 点亮 支持 扔鸡蛋 回复

2797485
Lv.3

专栏

发表于 2022-12-9 23:43 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 山东省

举报

使用道具 点亮 支持 扔鸡蛋 回复

2797485
Lv.3

专栏

发表于 2022-12-9 19:00 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...

附件

FA1.png
来自 山东省

举报

使用道具 支持 扔鸡蛋 回复

2797485
Lv.3

专栏

发表于 2022-12-9 18:57 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...

附件

FFFFA.png
点评
来自 山东省

举报

使用道具 点亮 支持 扔鸡蛋 回复

2797485
Lv.3

专栏

发表于 2022-12-9 18:53 复制 查看全部楼层
游客,您是(游客)级别,无法查看回复内容,请登录论坛并到新手区学习升级之后才能查看。升级指南请看...
来自 山东省

举报

使用道具 支持 扔鸡蛋 回复

您需要登录后才可以回帖 登录

本版积分规则 《理想财富服务协议》《免责声明》

0楼 26楼
43楼 25楼
42楼 24楼
41楼 23楼
40楼 22楼
39楼 21楼
38楼 20楼
37楼 19楼
36楼 18楼
35楼 17楼
34楼 16楼
33楼 15楼
32楼 14楼
31楼  
30楼  
29楼  
28楼  
27楼  
站长推荐 /5
回顶部 到页底
快速回复 返回顶部 返回列表