Python分析股票行情代码

//导入所需的包

import xxx(所用数据库)
import pandas as pd
import matplotlib.pylab as plt
import statsmodels.api as sm

 

//创建dictionary,包含目标股票,大盘,开始截止日期

parm = {'firm': 'TSLA', 'index': 'SPY', 'startdate': '2012-04-01', 'enddate': '2022-03-31'}

//连接wrds数据库
db = xxx.Connection(xxx_username = yourname)

//自建函数,获得目标股票历年日价
def get_daily_stock_price_us(p):
  df = db.raw_sql("""SELECT a.date, a.prc
                  FROM crsp.dsf a 
                  LEFT JOIN crsp.dsfhdr b
                  ON a.permno = b.permno
                  WHERE b.htsymbol = %(firm)s and a.date >= %(startdate)s and a.date <= %(enddate)s""", 
                  params = p, date_cols = ['date'])
  return df

daily_price_firm = get_daily_stock_price_us(parm)
daily_price_firm = daily_price_firm.rename(columns = {"prc": parm['firm']})

//描述性统计

daily_price_firm.describe()

//自建函数,获取大盘每日点数

def get_daily_index_price(p):
  df = db.raw_sql("""SELECT a.date, a.prc
                         FROM crsp.dsf a left join crsp.dsfhdr b
                         ON a.permno = b.permno
                         WHERE b.htsymbol = %(index)s and a.date >= %(startdate)s and a.date <= %(enddate)s""",
                         params = p, date_cols = ['date'])
  return df

daily_index_price = get_daily_index_price(parm)
daily_index_price = daily_index_price.rename(columns = {"prc": parm['index']})

//将目标日价与大盘每日点数两张表合并成一张

df1 = daily_price_firm.merge(daily_index_price, left_on = 'date', right_on = 'date')

//日期从date型转成datetime型

daily_price_firm['date'] = pd.to_datetime(df1['date']).dt.date
daily_index_price['date'] = pd.to_datetime(df1['date']).dt.date
df1['date'] = pd.to_datetime(df1['date']).dt.date

//计算目标股票日价与大盘点数变动趋势之间的相关系数

df1.corr()

//绘制大盘点数历年变动趋势

daily_price_firm.set_index('date').plot(kind = 'line',
            figsize = (12, 4),
            legend = False,
            title = f"{parm['firm']}'s Price History")
plt.show()

//计算以数据所包含期间内第一天目标股票日价为基础,大盘历年来每日对应股价

df1['SP500_rebased'] = df1['TSLA'][0] / df1['SPY'][0] * df1['SPY']
del df1['SPY'] 

//绘制目标股票日价与大盘每日对应股价趋势的组合图 

df1.set_index('date').plot(kind = 'line',
        figsize = (12, 6),
        legend = True,
        title = 'Price History')
plt.show()

 

//自建函数,获取目标股票历年月回报率

def get_stock_return_monthly(p):
  df = db.raw_sql("""SELECT a.date, a.ret
                  FROM crsp.msf a 
                  LEFT JOIN crsp.dsfhdr b
                  ON a.permno = b.permno
                  WHERE b.htsymbol = %(firm)s and a.date >= %(startdate)s and a.date <= %(enddate)s""", 
                  params = p, date_cols = ['date'])
  return df

Tesla = get_stock_return_monthly(parm)

//自建函数,获取大盘历年来月回报率

def get_index_return_monthly(p):
  df = db.raw_sql("""SELECT date, sprtrn
                    FROM crsp.msi
                    WHERE date >= %(startdate)s and date <= %(enddate)s""", 
                    params = p, date_cols = ['date'])
  return df

SP500 = get_index_return_monthly(parm)

//线性回归,计算目标股票的CAPM模型,并绘散点+线性拟合图
X = SP500['sprtrn']
Y = Tesla['ret']
X = sm.add_constant(X)
model = sm.OLS(Y, X).fit()
print(model.summary())
predictions = model.predict(X)
model.params
print(f"The beta of {parm['firm']} is {model.params[1]}")

df2 = pd.concat([X, Y], axis = 1)

ax = df2.plot(x = 'sprtrn', y = 'ret', kind = 'scatter')
plt.scatter(X['sprtrn'], Y)
plt.xlabel("S&P 500 Return")
plt.ylabel("Tesla Return")
plt.plot(X['sprtrn'], predictions, "r")
plt.show()

//绘图分析发行发行目标股票公司的资产结构

def plot_assets(p):
  stk_assets = db.raw_sql("""SELECT a.fyear, a.che, a.rect, a.invt, a.ppegt, a.intan
                            FROM comp.funda a
                            LEFT JOIN comp.names b
                            ON a.gvkey = b.gvkey
                            WHERE b.tic = %(firm)s and a.datafmt = 'STD' and a.consol = 'C' and a.indfmt = 'INDL' and a.fyear >= 2012 and a.fyear <= 2021""", 
                            params = p)
  stk_assets['fyear'] = stk_assets['fyear'].astype(int)
  stk_assets = stk_assets.set_index('fyear')
  stk_assets['intan'] = stk_assets['intan'].fillna(0).astype(int)
  stk_assets[['che', 'rect', 'invt', 'ppegt', 'intan']].plot.area().set_title('Stucture of Assets')
plot_assets(parm)

//最后断开与数据库的连接

db.close()

 


版权声明:本文为m0_68701027原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。