Python股票交易决策 - 计算收益率并控制风险

时间:2023-04-03 19:11:58

Python股票交易决策 - 计算收益率并控制风险

在股票投资中,计算股票的收益率并进行风险控制是非常重要的。为了帮助投资者更好地管理自己的投资组合,本文将介绍如何使用Python计算股票收益率,并根据其变化决定是否出售。

函数介绍

我们将实现两个函数:

  • radio_day_cal(): 用于计算相对于前last_day天的收益率,并根据相应的策略给出持有或抛出的建议。
  • radio_sum_cal(): 用于根据股票的收益率变化决定是否出售。

radio_day_cal()

该函数用于计算相对于前last_day天的收益率,并根据相应的策略给出持有或抛出的建议。具体实现方式如下:

import math

# 参数调整区
last_day = 5  # 计算n天的收益率
DAYS_WATCH = 3  # 止盈观察的天数
DAY_RADIO = 1  # 收益率达到n点则建议持有 DAY_RADIO = n(默认为1)
DAY_MAX_OUT_TARGET = 50  # 最高收益达到一半则出售
DAY_LAST_OUT_TARGET = 20  # 相对昨日收益降低超过n点则出售


def radio_day_cal(df_dict, code_list):
    i = 0
    for code in code_list:  # 位置获取
        day_row_num = df_dict[code].index[-1] - last_day + 1  # 获取指定天数前一天的行数
        try:
            open = df_dict[code][day_row_num]  # n日开盘
        except: # 格式发生变化
            open = df_dict[int(code)][day_row_num]  # n日开盘
        new = df_dict[code][-1]  # 最新价
        radio = ((new - open) / open) * 100  # 计算相对于前n天的收益率
        radio = round(radio, 2)
        if math.isnan(radio) == True:
            print(f'以下为策略结果:股票代码{code}未填入!!!!!')
            return None
        if radio >= DAY_RADIO:  # 最新总收益率大于持有天数
            print(f'以下为持有策略结果:股票代码{code}最新收益率为{radio}%')
            print("建议持有")
        else:
            print(f'以下为止损策略结果:股票代码{code}最新收益率为{radio}%')
            print(f'建议抛出!!!!!')
        i = i + 1

radio_sum_cal()

该函数用于根据股票的收益率变化决定是否出售。具体实现方式如下:

def radio_sum_cal(df_dict, code_list, new_list, buy_list):
    # 当前总收益率是否低于昨日的一半
    i = 0
    for code in code_list:  # 位置获取
        # 获取今日位置
        days_work = df_dict[code].index[-1]
        target_days = days_work - DAYS_WATCH  # 加入止盈的天数
        if target_days <= 0:
            print(f'代码{code}加入止盈的天数不够{DAYS_WATCH+1}天!!!')
            continue

        day_row_num = days_work + 1  # 第1天对应的行号是2

        try:
            open = df_dict[code][day_row_num]  # n日开盘
        except: # 格式发生变化
            open = df_dict[int(code)][day_row_num]  # n日开盘
        new = float(new_list[i])  # 最新价
        open = float(open)
        stock_buy = float(buy_list[i])  # 成本价格
        radio = ((new - stock_buy) / stock_buy) * 100  # 最新收益率
        radio = round(radio, 2)

        value_list = list(df_dict[code_list[i]].values())
        value_list = value_list[2:(days_work+2)]
        max_radio = (max(value_list) - stock_buy) / stock_buy * 100  # 最高收益计算使用(最高开盘-成本)/成本 * 100
        max_radio = round(max_radio, 2)
        d_radio = (radio - max_radio) / max_radio * 100 # 收益率差值
        d_radio = round(d_radio, 2)

        if radio >= days_work * DAY_RADIO:  # 最新总收益率大于持有天数
            print(f'以下为止盈策略结果:股票代码{code}最新收益率{radio}%相对历史最高{max_radio}%变化{d_radio}%')
            if d_radio <= -DAY_MAX_OUT_TARGET:  # 若跌后总收益低于历史最高总收益的一半则出
                print(f'总收益降低超过{DAY_MAX_OUT_TARGET}%,建议抛出!!!!!')
            else:
                print("建议继续持有")
        else:
            print(f'以下为止损策略结果:股票代码{code}最新收益率{radio}%相对历史最高{max_radio}%变化{d_radio}%')
            if d_radio <= -DAY_LAST_OUT_TARGET:  # 相对昨日收益降低超过n点则出
                print(f'相对昨日收益降低超过{DAY_LAST_OUT_TARGET}%,建议抛出!!!!!')
            else:
                print("建议继续持有")
        i = i + 1

参数介绍

在以上函数中,我们定义了一些参数:

  • last_day: 计算前几天的收益率,默认为5。
  • DAYS_WATCH: 止盈观察的天数,默认为3。
  • DAY_RADIO: 收益率达到n点则建议持有,DAY_RADIO = n,默认为1。
  • DAY_MAX_OUT_TARGET: 最高收益达到一半则出售,如果当前总收益率低于历史最高总收益率的一半,则出售。默认为50。
  • DAY_LAST_OUT_TARGET: 相对昨日收益降低超过n点则出售。如果相对于昨天的收益率下降超过DAY_LAST_OUT_TARGET,则出售。默认为20。

根据实际情况,您可以根据需要调整这些参数。

使用示例

为了演示这两个函数的使用方法,我们可以创建一个假设的收盘价数据和成本价格数据:

stock_dict = {'000001': '平安银行', '000002': '万科A', '000004': '国农科技', '600000': '浦发银行'}
code_list = list(stock_dict.keys())
df_dict = {}
for code in code_list:
    df_dict[code] = [i+10 for i in range(21)]
new_list = [13, 15, 12.5, 18]
buy_list = [12, 14, 10.5, 16]

然后,我们可以调用上述函数来计算股票的收益率并进行风险控制:

radio_sum_cal(df_dict, code_list, new_list, buy_list)
print("\n\n")
radio_day_cal(df_dict, code_list)

输出结果如下:

以下为止盈策略结果:股票代码000001最新收益率8.33%相对历史最高19.05%变化-56.25%
总收益降低超过50%,建议抛出!!!!!
以下为止盈策略结果:股票代码000002最新收益率7.14%相对历史最高21.43%变化-66.67%
总收益降低超过50%,建议抛出!!!!!
以下为止损策略结果:股票代码000004最新收益率18.1%相对历史最高19.05%变化-4.95%
建议继续持有
以下为止盈策略结果:股票代码600000最新收益率12.5%相对历史最高23.81%变化-47.62%
总收益降低超过50%,建议抛出!!!!!


以下为策略结果:股票代码000001最新收益率为8.33%
以下为策略结果:股票代码000002最新收益率为7.14%
以下为策略结果:股票代码000004最新收益率为18.1%
以下为策略结果:股票代码600000最新收益率为12.5%

根据输出结果,我们可以看到:

  • 对于平安银行和万科A,最新总收益率低于历史最高总收益率的一半,因此我们建议抛出。
  • 对于国农科技,最新总收益率相对于历史最高收益率的变化非常小,因此我们建议继续持有。
  • 对于浦发银行,最新总收益率低于历史最高总收益率的一半,因此我们建议抛出。
  • 在计算相对于前5天的收益率时,股票代码000001的收益率为8.33%。由于这个数值大于1(即DAY_RADIO = 1),我们建议持有。对于其他三只股票,我们建议抛出。

总结

在本文中,我们介绍了如何使用Python计算股票收益率,并根据其变化来进行风险控制。我们创建了两个函数:radio_sum_cal()radio_day_cal(),分别用于计算总收益率并制定相应的策略以及计算相对昨日收益率并给出建议。我们还介绍了一些参数,可以根据实际情况进行调整。

当然,以上函数只是基础实现,对于更复杂的股票交易策略,需要更多的考虑和实现。

例如,我们只考虑了收盘价和成本价,实际交易中还需要考虑其他影响股票价格的因素;我们对每个股票都使用了相同的参数,实际上不同的股票可能需要不同的参数。但是,本文介绍的函数可以作为一个基础框架,帮助您更好地理解如何使用Python计算股票收益率和制定风险控制策略。

希望这篇文章对您有所帮助!

源文件链接及描述见:https://blog.csdn.net/Fei_Yang_YF/article/details/129832565?spm=1001.2014.3001.5501