马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
请 根据模板要求,使用 python、numpy、scipy 和 pandas 完成下列函数的定义,给出函
数的说明和注释,并在 if __name__=”__main__”:下给出实例进行测试和验证,给出函数测试
的曲线图。
要求,根据数学定义和公式计算,定义下列函数的参数、代码实现和返回值。
WMA Weighted Moving Average
函数参考格式:WMA(close, timeperiod=30)
模板如下,但是我只写了一点点,实在写不下去了,代码有点乱。
求求有人帮我一下,实在没看懂,跟我提供一下思路也行########################################################################
#
# Functions for calculating Total Return, Annualized Returns, etc.
#
########################################################################
#
# This file is part of Big data Analysis with Python Course:
#
# Published under the UIBE License. See the file LICENSE for details.
#
# Copyright 2022 by San Zhang
########################################################################
import numpy as np
import pandas as pd
from numba import jit
import data
from data_keys import *
########################################################################
# Constants.
# Average number of days in a year. Normal years have 365 days,
# but every 4th year is a leap-year with 366 days.
DAYS_PER_YEAR = 365.25
# Average number of business- or trading-days in a year.
BDAYS_PER_YEAR = 251.67
########################################################################
# Public functions.
#函数介绍:WMA函数:以不同权重对股价赋予一定的权重再相加
#用dataframe创建过去35天的股票价格记录
data={"日期":pd.Series(range(1,35))}
share_data = pd.DataFrame(data)
def WMA(close, timeperiod=30):
#设置权重
weights = np.array(range(1, n + 1))
sum_weights = np.sum(weights)
weight1 = weights/sum_weights
# 公式计算:以日期从新到旧权重依次下降,且所选数据权重和为1,分别乘上当期收盘股票价格来预测下期股票价格
Total_Return[t] = Total_Return[t - 1] * (Dividend[t] + Share_Price[t]) / Share_Price[t - 1]
res = close.rolling(window=n).apply(lambda x: np.sum(weights * x) / sum_weights, raw=False)
return res
def total_return(df):
"""
Calculate the "Total Return" of a stock when dividends are
reinvested in the stock.
The formula is:
Total_Return[t] = Total_Return[t-1] * (Dividend[t] + Share_Price[t]) / Share_Price[t-1]
:param df:
Pandas data-frame assumed to contain SHARE_PRICE and DIVIDEND.
:return:
Pandas series with the Total Return.
"""
# Copy the relevant data so we don't change it.
df2 = df[[SHARE_PRICE, DIVIDEND]].copy()
# Fill NA-values in the Dividend-column with zeros.
df2[DIVIDEND].fillna(0, inplace=True)
# Calculate the daily Total Return.
tot_ret_daily = (df2[DIVIDEND] + df2[SHARE_PRICE]) / df2[SHARE_PRICE].shift(1)
# Calculate the cumulative Total Return.
tot_ret = tot_ret_daily.cumprod()
# Replace the first row's NA with 1.0
tot_ret.iloc[0] = 1.0
return tot_ret
def annualized_returns(series, years):
"""
Calculate the annualized returns for all possible
periods of the given number of years.
For example, given the Total Return of a stock we want
to know the annualized returns of all holding-periods
of 10 years.
:param series:
Pandas series e.g. with the Total Return of a stock.
Assumed to be daily data.
:param years:
Number of years in each period.
:return:
Pandas series of same length as the input series. Each
day has the annualized return of the period starting
that day and for the given number of years. The end of
the series has NA for the given number of years.
"""
# Number of days to shift data. All years have 365 days
# except leap-years which have 366 and occur every 4th year.
# So on average a year has 365.25 days.
days = int(years * 365.25)
# Calculate annualized returns for all periods of this length.
# Note: It is important we have daily (interpolated) data,
# otherwise the series.shift(365) would shift much more than
# a year, if the data only contains e.g. 250 days per year.
ann_return = (series.shift(-days) / series) ** (1 / years) - 1.0
return ann_return
def prepare_ann_returns(df, years, key=PSALES, subtract=None):
"""
Prepare annualized returns e.g. for making a scatter-plot.
The x-axis is given by the key (e.g. PSALES) and the y-axis
would be the annualized returns.
:param df:
Pandas DataFrame with columns named key and TOTAL_RETURN.
:param years:
Number of years for annualized returns.
:param key:
Name of the data-column for x-axis e.g. PSALES or PBOOK.
:param subtract:
Pandas Series to be subtracted from ann-returns
to adjust for e.g. growth in sales-per-share.
:return:
(x, y) Pandas Series with key and adjusted ANN_RETURN.
"""
# Create a new data-frame so we don't modify the original.
# We basically just use this to sync the data we are
# interested in for the common dates and avoid NA-data.
df2 = pd.DataFrame()
# Copy the key-data e.g. PSALES.
df2[key] = df[key]
# Calculate all annualized returns for all periods of
# the given number of years using the Total Return.
ann_return = annualized_returns(series=df[TOTAL_RETURN], years=years)
if subtract is None:
# Add the ann-returns to the new data-frame.
df2[ANN_RETURN] = ann_return
else:
# Calculate all annualized returns for the series
# that must be subtracted e.g. sales-per-share.
ann_return_subtract = annualized_returns(series=subtract, years=years)
# Subtract the ann. returns for the total return
# and the adjustment (e.g. sales-per-share).
# Then add the result to the new data-frame.
df2[ANN_RETURN] = ann_return - ann_return_subtract
# Drop all rows with NA.
df2.dropna(axis=0, how='any', inplace=True)
# Retrieve the relevant data.
x = df2[key]
y = df2[ANN_RETURN]
return x, y
if __name__ == "__main__":
|