2021-11-02

基金评价指标计算 -- python

近期在做基金的评价工作,需要计算一些因子数据,由于部分数据源缺失值比较多,所以打算自己计算一下,下面是自己计算因子指标的python实现,比较简单粗暴,只是一些计算公式,有错误的话欢迎大家一起指正~~~

import math
import numpy as np
# nav为基金净值序列dataframe

# 年化收益
def ann_return(nav, ys=0):
    
    df_return_cum = nav.iloc[-1] /nav.iloc[0] - 1
    fector = len(nav) / 252
    if ys == 0:
        df_return = df_return_cum * fector
    else:
        df_return = df_return_cum / ys
    return df_return

# 波动率
def vol(nav, prd=252):
    daily_return = df_nav.pct_change()[1:] 
    df_vol = np.sqrt(prd) * daily_return.std()
    return df_vol

#最大回撤
def max_dd(nav):    
    tmp_df = nav / nav.cummax() -1
    df_dd = abs(tmp_df.min())
    return df_dd

# 夏普比率,无风险利率为3%
def sharpe_ratio(df_return, df_vol, rf=0.03):
    df_sharpe = (df_return-rf) / df_vol
    return df_sharpe

# Burke比率:(年化收益-无风险利率)/ 每日回撤的日均值标准差
def burke_ratio(df, rf=0.03):
    '''
    df:nav dataframe
    return :burke series
    '''
    daily_dd = df / df.cummax() -1
    daily_dd2n = daily_dd.apply(lambda x:pow(pow(x,2).mean(), 1/2))
    
    rp_lst = df.iloc[-1] / df.iloc[0]-1
    rp_ann = rp_lst * 252 /len(df)
#     rp_ann = df.pct_change().mean()
    burke = (rp_ann - rf) / daily_dd2n
    return burke

#周胜率
def wRate(nav):
    nav_f = nav.copy()
    nav_f.index = nav_f.index.to_series().apply(lambda x: datetime.datetime.strptime(x, '%Y-%m-%d'))
    df_rate_w = nav_f.resample('W', label='left').first() / nav_f.resample('W', label='left').last()
    w_num = df_rate_w.shape[0]
    df_wRate = df_rate_w.apply(lambda x: x[x>1].count()) / w_num
    return df_wRate

# 下行标准差:取一段时间的日收益率均值,对小于均值的部分求标准差,最后年化
def down_std(nav):
    pct_nav = nav.pct_change()[1:]  
    mean_col = pct_nav.mean()  
    df_posi = pct_nav.apply(lambda x: np.where(x>=x.mean(), 0,x-x.mean()))  #对小于均值的值赋予0,负责返回与均值的标准差
    nav_dstd = df_posi.apply(lambda x: (sum(x[x<0]**2)/len(x[x<0]))**0.5)
    return nav_dstd * np.sqrt(252)

#所提诺比率:(组合年化收益-无风险)/ (组合下行标准差))
def sortino_ratio(ann_return, downside_std,rf=0.03):
  
    sortino = (ann_return - rf) / downside_std
    return sortino

#信息比率:(组合年化收益-基准年化收益)/ ((组合收益-基准收益的标准差)*sqrt(252) )
#这里基金的基准年化我选择的对应的基金指数,比如分析债券混合型一级基金,基准我取的是wind上债券混合型型一级基金指数
def get_IR(nav, base_nav):
    # 计算中注意两个df的索引对其
    port_ann = ann_return(nav, ys=0)
    base_ann = ann_return(base_nav, ys=0)
    
    nav_rate = nav.pct_change()[1:]
    base_rate = base_nav.pct_change()[1:]
    denominator = nav_rate.apply(lambda x: (x-base_rate).std()*np.sqrt(252))

    ir = (port_ann - base_ann) / denominator
    return ir

# 特雷诺比率:(组合年化收益-无风险利率) / bata
def treynor_ratio(nav, base_nav, rf=0.03):
    port_ann = ann_return(nav, ys=0)
    
    nav_rate = nav.pct_change()[1:]
    base_rate = base_nav.pct_change()[1:]
    bata = nav_rate.apply(lambda x: (np.cov(x, base_rate))[0][1]/np.var(base_rate))
    
    treynor = (port_ann - rf) / bata
    return treynor

# 卡玛比率:组合年化收益 / 最大回撤
def calmar_ratio(ann_return, max_dd,rf=0.03):
    calmar = (ann_return-rf) / max_dd
    return calmar
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生产者消费者问题是一个经典的同步问题,其中生产者和消费者共享一个缓冲区,生产者向缓冲区中生产产品,消费者从缓冲区中消费产品。在多线程的环境下,生产者和消费者可能会同时访问缓冲区,因此需要对缓冲区进行同步控制。 以下是一个简单的生产者消费者问题的实现: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define BUFFER_SIZE 10 int buffer[BUFFER_SIZE]; int count = 0; int in = 0; int out = 0; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t empty = PTHREAD_COND_INITIALIZER; pthread_cond_t full = PTHREAD_COND_INITIALIZER; void *producer(void *arg) { int i; for (i = 0; i < 20; i++) { pthread_mutex_lock(&mutex); while (count == BUFFER_SIZE) { pthread_cond_wait(&empty, &mutex); } buffer[in] = i; in = (in + 1) % BUFFER_SIZE; count++; printf("producer: produced %d\n", i); pthread_cond_signal(&full); pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } void *consumer(void *arg) { int i, data; for (i = 0; i < 20; i++) { pthread_mutex_lock(&mutex); while (count == 0) { pthread_cond_wait(&full, &mutex); } data = buffer[out]; out = (out + 1) % BUFFER_SIZE; count--; printf("consumer: consumed %d\n", data); pthread_cond_signal(&empty); pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } int main() { pthread_t tid1, tid2; pthread_create(&tid1, NULL, producer, NULL); pthread_create(&tid2, NULL, consumer, NULL); pthread_join(tid1, NULL); pthread_join(tid2, NULL); return 0; } ``` 在代码中,我们定义了一个大小为10的缓冲区,使用一个计数器count来记录缓冲区中产品的数量,in和out分别表示生产者和消费者在缓冲区中的位置。我们使用了两个条件变量empty和full来控制生产者消费者的同步。 在生产者中,当缓冲区已满时,生产者会等待empty条件变量,直到缓冲区有空位。当生产者生产完一个产品后,会唤醒消费者,并释放互斥锁。 在消费者中,当缓冲区为空时,消费者会等待full条件变量,直到缓冲区有产品。当消费者消费完一个产品后,会唤醒生产者,并释放互斥锁。 通过使用互斥锁和条件变量,我们可以保证生产者和消费者的正确同步,避免了竞争条件和死锁等问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值