学习《深入浅出python量化交易交易实战》第三章(笔记2)

1.学习《深入浅出python量化交易交易实战》第三章(笔记2)

记录学习过程中的代码、疑问和心得

3.3 基于机器学习的简单交易策略

本小节的代码有多处看不明白,这里现在前面列出来:

1. 发现的错误

错误
knn_reg看名字应该是回归模型的实例,但是书中这段是进阶者knn_clf分类模型的,是变量写错了,还是有确实的代码?
在这里插入图片描述

2. 本章节的疑问
  1. 基础收益中cum_return_data = df[split_value:]['return'].cumsum() * 100,为什么对数收益累计值*100就是收益
  2. 策略收益 = 对数收益*交易信号.shift(1)? 原理是什么?
  3. 分类算法计算的准确率,是如何转换为交易信号的?
  4. knn_clf.predict(x)内部的逻辑是什么,为什么返回的就是交易信号呢?
  5. 对数收益?这里书中没说明,对啥log(两个交易日相除)就是收益呢?
  6. open-close, high-low创建的这两个字段也没看明白在算法中的作用。
    knn_clf = KNeighborsClassifier(n_neighbors=95)
    knn_clf.fit(x_train, y_train)
    
    # *** 这里计算的准确率,是如何转换为交易信号的?
    print('训练集中的准确率:', knn_clf.score(x_train, y_train))
    print('验证集中的准确率:', knn_clf.score(x_test, y_test))
    
    # 使用KNN模型预测每日股票的涨跌,保存为predict_signal
    # *** knn_clf.predict(x)内部的逻辑是什么,为什么返回的就是交易信号呢?
    df['predict_signal'] = knn_clf.predict(x)

    # *** 对数收益?这里书中没说明,对啥log(两个交易日相除)就是收益呢?
    df['return'] = np.log(df['close'] / df['close'].shift(1))  # 当日/前一天

使用分类算法制定交易策略

首先实现几个交易策略需要用到的函数。
分类函数

# 定义一个用于分类的函数 classification_tc:预测股票下一个交易日是否上涨
# 给表增加三个字段
#     open-close 开盘价-收盘价
#     high-low 最高价-最低价
# 分类函数
def classification_tc(df):
    df['open-close'] = df['open'] - df['close']  # 开盘价-收盘价
    df['high-low'] = df['high'] = df['low']  # 最高价-最低价

    # 增加一个target字段,如果次日收盘价高于当日收盘价格,标记为1,否则为-1
    # df.shift(-1) 将列向上移动一位,这里就把后一天的和当天的数据对齐,然后直接做比较运算
    df['target'] = np.where(df['close'].shift(-1) > df['close'], 1, -1)
    # 去掉有空值的行
    df = df.dropna()
    # 将open-close和high-low作为数据集的特征
    x = df[['open-close', 'high-low']]
    y = df['target']
    return x, y

回归函数

# 定义一个用于回归的函数:预测次日收盘价格与当日收盘价格之差
# 特征的添加与分类函数类似
# 只不过target字段改为 次日收盘价 - 当前收盘价 ---> df['close'].shift(-1) - df['close']
def regression_tc(df):
    df['open-close'] = df['open'] - df['close']  # 开盘价-收盘价
    df['high-low'] = df['high'] = df['low']  # 最高价-最低价
    df['target'] = df['close'].shift(-1) - df['close']
    df.dropna()
    # 将open-close和high-low作为数据集的特征
    x = df[['open-close', 'high-low']]
    y = df['target']
    return x, y

定义一个计算累计回报的函数

def cum_return(df, split_value):
    print('cum_return split_value:', split_value)
    cum_return_data = df[split_value:]['return'].cumsum() * 100
    return cum_return_data

疑问?
基础收益中cum_return_data = df[split_value:]['return'].cumsum() * 100,为什么对数收益累计值*100就是收益

使用策略交易的收益


# 使用策略的收益
def strategy_return(df, split_value):
    print('strategy_return split_value:', split_value)
    df['strategy_return'] = df['return'] * df['predict_signal'].shift(1)
    cum_strategy_return = df[split_value:]['strategy_return'].cumsum() * 100

    return cum_strategy_return

疑问?
策略收益 = 对数收益*交易信号.shift(1)? 原理是什么?

绘制收益曲线的函数


# 绘制曲线
def plot_chart(cum_return_data, cum_strategy_return, symbol):
    plt.figure(figsize=(9, 6))
    plt.plot(cum_return_data, '--', label='%s 收益是' % symbol)

    plt.plot(cum_strategy_return, label='策略收益')

    plt.legend()
    plt.show()

基于机器学习的交易策略

def machine_learn_trade(symbol, start_date, end_date):
    stock_dict = get_stock_data_table(symbol, start_date, end_date)
    stock = stock_dict['stock']
    print('股票代码:symbol', stock.head(3))
    x, y = classification_tc(stock)
    df = pd.concat([stock, x, y], axis=1)
    print('======df======')
    print(df.head(3))

    x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.8)
    # 创建一个KNN实例
    knn_clf = KNeighborsClassifier(n_neighbors=95)
    knn_clf.fit(x_train, y_train)
    
    # *** 这里计算的准确率,是如何转换为交易信号的?
    print('训练集中的准确率:', knn_clf.score(x_train, y_train))
    print('验证集中的准确率:', knn_clf.score(x_test, y_test))
    
    # 使用KNN模型预测每日股票的涨跌,保存为predict_signal
    # *** knn_clf.predict(x)内部的逻辑是什么,为什么返回的就是交易信号呢?
    df['predict_signal'] = knn_clf.predict(x)

    # *** 对数收益?这里书中没说明,对啥log(两个交易日相除)就是收益呢?
    df['return'] = np.log(df['close'] / df['close'].shift(1))  # 当日/前一天
    print('=============添加交易信号和收益后的结果====================')
    print(df.head(3))

    # 策略累计收益
    strategy_return_data = strategy_return(df, split_value=len(x_train))
    # 基础累计收益
    cum_return_data = cum_return(df, split_value=len(x_train))
    plot_chart(cum_return_data, strategy_return_data, 'dahua')

以上代码存在几点疑问:

  1. df['return'] = np.log(df['close'] / df['close'].shift(1)) 对数收益不明白什么意思
  2. df['predict_signal'] = knn_clf.predict(x),为什么交易信号可以直接通过knn_clf.predict(x)获得,其内部原理是什么?

pandas df.shift()

pandas df.shift()函数说明:shift函数是对数据进行移动的操作

stock_dict = get_stock_data_table(symbol, start_date, end_date)
stock = stock_dict['stock']
print('股票代码:symbol', stock)
test = stock.head(5)
print(test['volume'])
test['volume_next'] = test['volume'].shift(-1)
print(test)

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Python量化交易是利用Python编程语言和相关的金融库来进行交易策略的开发和执行。在这里,我将介绍一些深入浅出Python量化交易实战的步骤和技巧。 1. 数据获取:首先,你需要获取市场数据,包括股票、期货或其他金融产品的历史价格数据。你可以使用第三方库如pandas、tushare、quandl等来获取数据。 2. 数据处理:对获取到的数据进行处理和清洗,包括数据的缺失值处理、数据格式转换等。pandas库是一个非常强大且方便的用于数据处理的工具。 3. 策略开发:根据你的交易理念和策略,使用Python编写量化交易策略。这可能涉及到技术指标的计算、信号的生成等。你可以使用一些常用的库如numpy、talib来帮助你进行技术指标的计算。 4. 回测:使用历史数据对你编写的策略进行回测,评估其表现。通过回测可以了解策略在不同市场环境下的盈亏情况,并进行优化和改进。 5. 执行交易:当你满意于自己的策略表现时,你可以选择使用API连接到实际的交易平台,通过Python自动执行你的交易策略。 6. 风险管理:在量化交易中,风险管理是非常重要的一环。你需要考虑风险控制、资金管理等方面,确保你的策略能够长期有效。 以上是一个简要的Python量化交易实战的流程,希望对你有所帮助。如果你有更具体的问题或需要了解更多细节,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝with黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值