pytho金融大数据分析

以下所有内容都是基于python3

时间序列分析
import pandas as pd
import numpy as np
from datetime import time

# 生成日期
MyTime = time(hour=10, minute=1, second=20)
# 生成日期范围
index = pd.data_range(start='2000-01-01 00:00:00', end='2010-01-01 23:59:00', freq='min')
# 初始化时间序列
ts = pd.Series(np.random.randn(len(index)), index=index)
# 对时间序列降采样
ts2 = ts.resample('5min', how='sum', loffset='-1s')
# open, close, high, low
ts3 = ts.resample('5min', how='ohlc')

# 日期偏移
offset = pd.offsets.BDay(1)
print(index + offset)
获取历史股票数据
import pandas_datareader.data as web
data = web.get_data_yahoo('SPY','2006-01-01')
print(type(data))
print(data)

常见的函数

# 得到历史数据, type of series,包含open, close, high, low 
data = web.get_data_yahoo('SPY','2006-01-01')
# 计算日收益率
px = data['Adj Close']
returns = px.pct_change()
# 计算得到指数
index = (1+rets).cumprod()
# 滑动窗口rolling
ma60 = index.rolling(window=60, min_periods=50).mean()

分组变换和分析

import random
import string
import numpy as np
import pandas as pd
import statsmodels.api as sm

random.seed(10)

# 随机产生n个大写的字母
def rands(n):
    choices = string.ascii_uppercase
    return ''.join([random.choice(choices) for _ in range(n)])

# 标准化
def zscore(group):
    return (group - group.mean()) / group.std()

N = 1000
tickers = np.array([rands(5) for _ in range(N)])
M = 500
# 生成datafrane
df = pd.DataFrame({'Momentum': np.random.randn(M)/200 + 0.03,
                   'Value':np.random.randn(M)/200 + 0.08,
                   'ShortInterest':np.random.randn(M)/200 - 0.02}, index=tickers[:M])

# 对tickers进行分组
ind_names = np.array(['FIANACAL', 'TECH'])
sampler = np.random.randint(0, len(ind_names), N)
industries = pd.Series(ind_names[sampler], index=tickers, name='industry')

# 聚合
by_industry  = df.groupby(industries)

# 打印聚合之后的一些结果
print(by_industry.mean())
print(by_industry.describe())

# 标准化
df_stand = by_industry.apply(zscore)
print(df_stand.groupby(industries).agg(['mean', 'std']))

# 排名
ind_rank = by_industry.rank(ascending=False)
print(ind_rank.groupby(industries).agg(['min','max']))

# 随机初始化因子
fac1, fac2, fac3 = np.random.rand(3, 1000)
# 随机选取索引
ticker_subset = tickers.take(np.random.permutation(N)[:1000])
# 设定因变量
port = pd.Series(0.7*fac1 - 1.2*fac2 + 0.3*fac3 + np.random.rand(1000),index=ticker_subset)
factors = pd.DataFrame({'f1':fac1, 'f2':fac2, 'f3':fac3},
                            index=ticker_subset)
# 计算相关系数
print(factors.corrwith(port))

# 最小二乘回归
model = sm.OLS(port.values, factors.values)
results = model.fit()
print(results.params)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值