我有以下数据
!pip install yfinance
import yfinance as yf
import numpy as np
import pandas as pd
from pandas_datareader import data
df=yf.download('BTC-USD',start='2017-01-01',end='2021-05-31',interval='1d')
#I calculated simple moving average as follow
df['SlowSMA']=df['Close'].ewm(span=11).mean()
df['FastSMA']=df['Close'].ewm(span=5).mean()
df['Shares'] = [1 if df.loc[ei,'FastSMA']>df.loc[ei, 'SlowSMA'] else 0 for ei in df.index]
df['PrevShares']=df['Shares'].shift(1)
我想为交易成本创建一列。这意味着每当a股从1变为0或从0变为1时,我们都会产生成本。然而,如果股票长期保持0或1,我们没有进行交易,因此没有成本
我做了以下操作,但它总是给交易成本0
cost=8
df['TranCost'] = [df.loc[ei,'Shares']*cost if df.loc[ei,'prevshares'] == 0 & df.loc[ei,'Shares'] ==1 or df.loc[ei,'prevshares'] == 1 & df.loc[ei,'Shares'] == 0 else 0 for ei in df.index]
Thanks
看来你可以用更简单的方法来测试它
您还可以使用
apply()
而不是for ei in df.index
或者使用
lambda
您还可以使用
int(True)
给出1
和int(False)
给出0
这一事实 并将其与
int( .... == 1)
一起使用最小工作代码
顺便说一句:
您可以使用
int(True)
给出1
和int(False)
给出0
的事实来计算Shares
与
apply()
没有
apply()
编辑:
使用
row['Cost']
而不是df['Cost']
仅从当前行获取值Cost
。若您使用df['Cost']
,那个么您将从列中获取所有值,然后在单元格中获取许多值顺便说一句:较短的
df['Cost'] = 0.005 * df['Close']
您甚至可以一步完成,而无需创建列
Cost
相关问题 更多 >
编程相关推荐