카테고리 없음

Python_Colab4주차

Spartan_Races 2023. 3. 27. 09:43
!pip install yfinance pandas-datareader finance-datareader
 
 
from pandas_datareader import data as pdr

import yfinance as yf
yf.pdr_override()

import numpy as np
import pandas as pd

import FinanceDataReader as fdr
 
 
df = fdr.DataReader('066570','2018')
  # 066570LG전자의 종목코드 2018년부터의 자료
df[df['Change']>0.05]
 
 
df = fdr.DataReader('066570','2018')
  # 066570LG전자의 종목코드 2018년부터의 자료
df.plot(y=['Open','Close'],figsize=[20,10],grid=True#그래프 그리기
 
df_2 = fdr.DataReader('066570','2018') #LG 자료
df_1= fdr.DataReader('005930','2018') #삼성 자료

df=pd.DataFrame()
df['Samsung']=df_1['Change']
df['LG']=df_2['Change']       #LG 삼성 변동율 비교 그래프

df.tail(100).plot(figsize=[20,8])  # 최근 100일 동안의 변동율 .tail(100)
 
df= fdr.DataReader('005930','2018')
df=df[['Close']].copy() #.copy() 중복해서 copy할 때 값이 변동될 수 있으므로 copy임을 확인
df['ma']=df.rolling(3).mean().shift(1)  # 3일간 종가의 이동평균값
df
df['action']=np.where(df['Close']>df['ma'],'buy','sell')
#df['action_temp']=df['action'].shift(1)
 
df.iloc[-1,-1]='sell'   #마지막 날엔 반드시 팔아야 수익율을 알 수 있다
cond1=(df['action']=='buy')&(df['action'].shift(1)=='sell')
cond2=(df['action']=='sell')&(df['action'].shift(1)=='buy')
df['real_buy']=np.where(cond1,'buy',''# 사야될 시점
df['real_sell']=np.where(cond2,'sell',''# 팔아야될 시점
df[cond2]  # 팔아야될 날짜들만 출력해준다
 
df_buy=df[cond1].reset_index()    # reset_index  :  줄 맞춤
df_buy.columns=['날짜','종가(buy)','이평값','선택']
df_sell=df[cond2].reset_index()
df_sell.columns=['날짜','종가(sell)','이평값','선택']

df_result=pd.concat([df_buy,df_sell],axis=1)  # axis=1  :  buy값에 sell값을 가로로 붙여준다

df_result['수익율']=df_result['종가(sell)']/df_result['종가(buy)']

df_result['수익율cumprod']=df_result[['수익율']].cumprod()   # 수익율  누적 곱
df_result[['수익율']].cumprod().iloc[-1,-1]-1  # 누적 곱 최종값 - 1 = 수익율
 
 
<단기.장기 이평값>
def get_return_sl(code,short,long):
  df= fdr.DataReader(code,'2018')
  df=df[['Close']].copy()
  df['ma1']=df['Close'].rolling(short).mean().shift(1)
  df['ma2']=df['Close'].rolling(long).mean().shift(1)

  df['action']=np.where(df['ma1']>df['ma2'],'buy','sell')

  df.iloc[-1,-1]='sell'

  cond1=(df['action']=='buy')&(df['action'].shift(1)=='sell')
  cond2=(df['action']=='sell')&(df['action'].shift(1)=='buy')

  df_buy=df[cond1].reset_index()
  df_buy.columns=['날짜','종가(buy)','이평값1','이평값2','선택']
  df_sell=df[cond2].reset_index()
  df_sell.columns=['날짜','종가(sell)','이평값1','이평값2','선택']

  df_result=pd.concat([df_buy,df_sell],axis=1)

  df_result['수익율']=df_result['종가(sell)']/df_result['종가(buy)']

  df_final=(df_result[['수익율']].cumprod().tail(1)-1)*100
  df_final['단기']=short
  df_final['장기']=long

  return df_final
 
 
dfs=[]
for short in range(3,11):
  for long in range(30,61):
    df=get_return_sl('005930',short,long)
    dfs.append(df)

df_result=pd.concat(dfs)
df_result.sort_values(by='수익율',ascending=False)

단기 10일  장기 59일로 설정했을 때, 최대수익율 46.97%을 얻었다